From 3cb15f0e3e4f2abecd4b8cf897c01c366e637a5d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 2 Nov 2015 11:58:46 +0100 Subject: [PATCH 01/64] Fixing get_users_to_notify --- taiga/projects/notifications/services.py | 4 ++-- tests/integration/test_notifications.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/taiga/projects/notifications/services.py b/taiga/projects/notifications/services.py index 2be1c8fc..5a850d46 100644 --- a/taiga/projects/notifications/services.py +++ b/taiga/projects/notifications/services.py @@ -151,7 +151,7 @@ def get_users_to_notify(obj, *, discard_users=None) -> list: def _check_level(project:object, user:object, levels:tuple) -> bool: policy = get_notify_policy(project, user) - return policy.notify_level in [int(x) for x in levels] + return policy.notify_level in levels _can_notify_hard = partial(_check_level, project, levels=[NotifyLevel.all]) @@ -160,8 +160,8 @@ def get_users_to_notify(obj, *, discard_users=None) -> list: candidates = set() candidates.update(filter(_can_notify_hard, project.members.all())) + candidates.update(filter(_can_notify_hard, obj.project.get_watchers())) candidates.update(filter(_can_notify_light, obj.get_watchers())) - candidates.update(filter(_can_notify_light, obj.project.get_watchers())) candidates.update(filter(_can_notify_light, obj.get_participants())) # Remove the changer from candidates diff --git a/tests/integration/test_notifications.py b/tests/integration/test_notifications.py index 3173874f..3e04277c 100644 --- a/tests/integration/test_notifications.py +++ b/tests/integration/test_notifications.py @@ -352,7 +352,7 @@ def test_watching_users_to_notify_on_issue_modification_6(): watching_user_policy.notify_level = NotifyLevel.involved watching_user_policy.save() users = services.get_users_to_notify(issue) - assert users == {watching_user, issue.owner} + assert users == {issue.owner} def test_send_notifications_using_services_method_for_user_stories(settings, mail): From 7ce9ef6ac8e9e82e780c25f1b89aca4b921cb34e Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 2 Nov 2015 12:40:09 +0100 Subject: [PATCH 02/64] Fixing closed_points stats --- taiga/projects/services/stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taiga/projects/services/stats.py b/taiga/projects/services/stats.py index 2b4ec4a1..255bd36b 100644 --- a/taiga/projects/services/stats.py +++ b/taiga/projects/services/stats.py @@ -228,7 +228,7 @@ def get_stats_for_project(project): closed_points = sum(RolePoints.objects.filter(user_story__project=project).filter( Q(user_story__milestone__closed=True) | - Q(user_story__milestone__isnull=True) + (Q(user_story__milestone__isnull=True) & Q(user_story__is_closed=True)) ).exclude(points__value__isnull=True).values_list("points__value", flat=True)) closed_milestones = project.milestones.filter(closed=True).count() From d051aa8593393df6eb17777c8dbd4078cb77efa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 2 Nov 2015 15:30:12 +0100 Subject: [PATCH 03/64] [i18n] Update locales --- taiga/locale/ca/LC_MESSAGES/django.po | 4 ++-- taiga/locale/es/LC_MESSAGES/django.po | 10 +++++----- taiga/locale/nl/LC_MESSAGES/django.po | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/taiga/locale/ca/LC_MESSAGES/django.po b/taiga/locale/ca/LC_MESSAGES/django.po index 7ee77e1b..93b1921a 100644 --- a/taiga/locale/ca/LC_MESSAGES/django.po +++ b/taiga/locale/ca/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" +"PO-Revision-Date: 2015-11-02 13:35+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/ca/)\n" @@ -1480,7 +1480,7 @@ msgstr "" #: taiga/projects/likes/models.py:55 msgid "Like" -msgstr "" +msgstr "M'agrada" #: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 #: taiga/projects/models.py:396 taiga/projects/models.py:460 diff --git a/taiga/locale/es/LC_MESSAGES/django.po b/taiga/locale/es/LC_MESSAGES/django.po index 25b57f95..49b33970 100644 --- a/taiga/locale/es/LC_MESSAGES/django.po +++ b/taiga/locale/es/LC_MESSAGES/django.po @@ -13,8 +13,8 @@ msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" -"Last-Translator: Taiga Dev Team \n" +"PO-Revision-Date: 2015-11-02 14:26+0000\n" +"Last-Translator: David Barragán \n" "Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/es/)\n" "MIME-Version: 1.0\n" @@ -1869,15 +1869,15 @@ msgstr "roles" #: taiga/projects/notifications/choices.py:28 msgid "Involved" -msgstr "" +msgstr "Involucrado" #: taiga/projects/notifications/choices.py:29 msgid "All" -msgstr "" +msgstr "Todas" #: taiga/projects/notifications/choices.py:30 msgid "None" -msgstr "" +msgstr "Ninguna" #: taiga/projects/notifications/models.py:61 msgid "created date time" diff --git a/taiga/locale/nl/LC_MESSAGES/django.po b/taiga/locale/nl/LC_MESSAGES/django.po index fd7c7502..3b0648ee 100644 --- a/taiga/locale/nl/LC_MESSAGES/django.po +++ b/taiga/locale/nl/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" +"PO-Revision-Date: 2015-11-02 13:41+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/nl/)\n" @@ -1541,11 +1541,11 @@ msgstr "" #: taiga/projects/likes/models.py:31 taiga/projects/likes/models.py:32 #: taiga/projects/likes/models.py:56 msgid "Likes" -msgstr "" +msgstr "Personen die dit leuk vinden" #: taiga/projects/likes/models.py:55 msgid "Like" -msgstr "" +msgstr "Vind ik leuk" #: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 #: taiga/projects/models.py:396 taiga/projects/models.py:460 From bd83aa64eaec0628ea9fe016bc9c0ce9a90ea248 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 2 Nov 2015 14:39:07 +0100 Subject: [PATCH 04/64] Issue 3427: fix failing searchs containing : --- taiga/base/utils/db.py | 102 ++++++++++++++++++++++++++++++++++++++-- taiga/users/services.py | 36 +++++++++----- 2 files changed, 122 insertions(+), 16 deletions(-) diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py index f71b10f3..2308840a 100644 --- a/taiga/base/utils/db.py +++ b/taiga/base/utils/db.py @@ -20,6 +20,7 @@ from django.shortcuts import _get_queryset from . import functions +import re def get_object_or_none(klass, *args, **kwargs): """ @@ -127,7 +128,100 @@ def update_in_bulk_with_ids(ids, list_of_new_values, model): model.objects.filter(id=id).update(**new_values) -def to_tsquery(text): - # We want to transform a query like "exam proj" (should find "project example") to something like proj:* & exam:* - search_elems = ["{}:*".format(search_elem) for search_elem in text.split(" ")] - return " & ".join(search_elems) +def to_tsquery(term): + """ + Based on: https://gist.github.com/wolever/1a5ccf6396f00229b2dc + Escape a query string so it's safe to use with Postgres' + ``to_tsquery(...)``. Single quotes are ignored, double quoted strings + are used as literals, and the logical operators 'and', 'or', 'not', + '(', and ')' can be used: + >>> tsquery_escape("Hello") + "'hello':*" + >>> tsquery_escape('"Quoted string"') + "'quoted string'" + >>> tsquery_escape("multiple terms OR another") + "'multiple':* & 'terms':* | 'another':*" + >>> tsquery_escape("'\"*|") + "'\"*|':*" + >>> tsquery_escape('not foo and (bar or "baz")') + "! 'foo':* & ( 'bar':* | 'baz' )" + """ + + magic_terms = { + "and": "&", + "or": "|", + "not": "!", + "OR": "|", + "AND": "&", + "NOT": "!", + "(": "(", + ")": ")", + } + magic_values = set(magic_terms.values()) + paren_count = 0 + res = [] + bits = re.split(r'((?:".*?")|[()])', term) + for bit in bits: + if not bit: + continue + split_bits = ( + [bit] if bit.startswith('"') and bit.endswith('"') else + bit.strip().split() + ) + for bit in split_bits: + if not bit: + continue + if bit in magic_terms: + bit = magic_terms[bit] + last = res and res[-1] or "" + + if bit == ")": + if last == "(": + paren_count -= 1 + res.pop() + continue + if paren_count == 0: + continue + if last in magic_values and last != "(": + res.pop() + elif bit == "|" and last == "&": + res.pop() + elif bit == "!": + pass + elif bit == "(": + pass + elif last in magic_values or not last: + continue + + if bit == ")": + paren_count -= 1 + elif bit == "(": + paren_count += 1 + + res.append(bit) + if bit == ")": + res.append("&") + continue + + bit = bit.replace("'", "") + if not bit: + continue + + if bit.startswith('"') and bit.endswith('"'): + res.append(bit.replace('"', "'")) + else: + res.append("'%s':*" %(bit.replace("'", ""), )) + res.append("&") + + while res and res[-1] in magic_values: + last = res[-1] + if last == ")": + break + if last == "(": + paren_count -= 1 + res.pop() + while paren_count > 0: + res.append(")") + paren_count -= 1 + + return " ".join(res) diff --git a/taiga/users/services.py b/taiga/users/services.py index 93707737..3ef4672d 100644 --- a/taiga/users/services.py +++ b/taiga/users/services.py @@ -300,13 +300,13 @@ def get_watched_list(for_user, from_user, type=None, q=None): and_needed = False if type: - filters_sql += " AND type = '{type}' ".format(type=type) + filters_sql += " AND type = %(type)s " if q: filters_sql += """ AND ( - to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', '{q}') + to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', %(q)s) ) - """.format(q=to_tsquery(q)) + """ sql = """ -- BEGIN Basic info: we need to mix info from different tables and denormalize it @@ -377,7 +377,11 @@ def get_watched_list(for_user, from_user, type=None, q=None): projects_sql=_build_watched_sql_for_projects(for_user)) cursor = connection.cursor() - cursor.execute(sql) + params = { + "type": type, + "q": to_tsquery(q) if q is not None else "" + } + cursor.execute(sql, params) desc = cursor.description return [ @@ -391,13 +395,13 @@ def get_liked_list(for_user, from_user, type=None, q=None): and_needed = False if type: - filters_sql += " AND type = '{type}' ".format(type=type) + filters_sql += " AND type = %(type)s " if q: filters_sql += """ AND ( - to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', '{q}') + to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', %(q)s) ) - """.format(q=to_tsquery(q)) + """ sql = """ -- BEGIN Basic info: we need to mix info from different tables and denormalize it @@ -456,7 +460,11 @@ def get_liked_list(for_user, from_user, type=None, q=None): projects_sql=_build_liked_sql_for_projects(for_user)) cursor = connection.cursor() - cursor.execute(sql) + params = { + "type": type, + "q": to_tsquery(q) if q is not None else "" + } + cursor.execute(sql, params) desc = cursor.description return [ @@ -470,13 +478,13 @@ def get_voted_list(for_user, from_user, type=None, q=None): and_needed = False if type: - filters_sql += " AND type = '{type}' ".format(type=type) + filters_sql += " AND type = %(type)s " if q: filters_sql += """ AND ( - to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', '{q}') + to_tsvector('english_nostop', coalesce(subject,'') || ' ' ||coalesce(entities.name,'') || ' ' ||coalesce(to_char(ref, '999'),'')) @@ to_tsquery('english_nostop', %(q)s) ) - """.format(q=to_tsquery(q)) + """ sql = """ -- BEGIN Basic info: we need to mix info from different tables and denormalize it @@ -543,7 +551,11 @@ def get_voted_list(for_user, from_user, type=None, q=None): issues_sql=_build_sql_for_type(for_user, "issue", "issues_issue", "votes_vote", slug_column="null")) cursor = connection.cursor() - cursor.execute(sql) + params = { + "type": type, + "q": to_tsquery(q) if q is not None else "" + } + cursor.execute(sql, params) desc = cursor.description return [ From 7c6077e107f40a3fcc3e1414f26071ceab0e0cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 3 Nov 2015 10:55:19 +0100 Subject: [PATCH 05/64] Create missing migration in taiga.projects.notifications --- .../migrations/0006_auto_20151103_0954.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 taiga/projects/notifications/migrations/0006_auto_20151103_0954.py diff --git a/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py b/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py new file mode 100644 index 00000000..561589c2 --- /dev/null +++ b/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notifications', '0005_auto_20151005_1357'), + ] + + operations = [ + migrations.AlterField( + model_name='notifypolicy', + name='notify_level', + field=models.SmallIntegerField(choices=[(, 'Involved'), (, 'All'), (, 'None')]), + ), + ] From 2bacb2de225621b4e73da3754d99bd952c2b2216 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Nov 2015 08:29:06 +0100 Subject: [PATCH 06/64] Adding dates to csv issues report --- taiga/projects/issues/services.py | 6 +++++- tests/integration/test_issues.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index 2929aef1..d646f30d 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -85,7 +85,8 @@ def issues_to_csv(project, queryset): "owner_full_name", "assigned_to", "assigned_to_full_name", "status", "severity", "priority", "type", "is_closed", "attachments", "external_reference", "tags", - "watchers", "voters"] + "watchers", "voters", + "created_date", "modified_date", "finished_date"] for custom_attr in project.issuecustomattributes.all(): fieldnames.append(custom_attr.name) @@ -111,6 +112,9 @@ def issues_to_csv(project, queryset): "tags": ",".join(issue.tags or []), "watchers": [u.id for u in issue.get_watchers()], "voters": votes_services.get_voters(issue).count(), + "created_date": issue.created_date, + "modified_date": issue.modified_date, + "finished_date": issue.finished_date, } for custom_attr in project.issuecustomattributes.all(): diff --git a/tests/integration/test_issues.py b/tests/integration/test_issues.py index 54722c93..02551a68 100644 --- a/tests/integration/test_issues.py +++ b/tests/integration/test_issues.py @@ -412,6 +412,6 @@ def test_custom_fields_csv_generation(): data.seek(0) reader = csv.reader(data) row = next(reader) - assert row[18] == attr.name + assert row[21] == attr.name row = next(reader) - assert row[18] == "val1" + assert row[21] == "val1" From 650f4d743182df6e4b425a29d35915b96ca871ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 3 Nov 2015 11:04:47 +0100 Subject: [PATCH 07/64] Update CHANGELOG --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 396bd18f..1499ed23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog # +## 1.10.0 ????? (unreleased) + +### Features +- [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. + +### Misc +- Lots of small and not so small bugfixes. + + ## 1.9.0 Abies Siberica (2015-11-XX) ### Features From 26e4941c56d039d1b659c62cf76ccdcd7c1c38f6 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Nov 2015 12:00:55 +0100 Subject: [PATCH 08/64] Fixing closed_points stats --- taiga/projects/services/stats.py | 10 +++++----- tests/integration/test_stats.py | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/taiga/projects/services/stats.py b/taiga/projects/services/stats.py index 255bd36b..727db6cf 100644 --- a/taiga/projects/services/stats.py +++ b/taiga/projects/services/stats.py @@ -225,16 +225,16 @@ def get_stats_for_project(project): get(id=project.id) points = project.calculated_points - - closed_points = sum(RolePoints.objects.filter(user_story__project=project).filter( - Q(user_story__milestone__closed=True) | - (Q(user_story__milestone__isnull=True) & Q(user_story__is_closed=True)) + closed_points = sum(points["closed"].values()) + closed_points_from_closed_milestones = sum(RolePoints.objects.filter( + Q(user_story__project=project) & Q(user_story__milestone__closed=True) ).exclude(points__value__isnull=True).values_list("points__value", flat=True)) closed_milestones = project.milestones.filter(closed=True).count() speed = 0 + if closed_milestones != 0: - speed = closed_points / closed_milestones + speed = closed_points_from_closed_milestones / closed_milestones project_stats = { 'name': project.name, diff --git a/tests/integration/test_stats.py b/tests/integration/test_stats.py index 374985c3..11038330 100644 --- a/tests/integration/test_stats.py +++ b/tests/integration/test_stats.py @@ -59,16 +59,19 @@ def data(): user_story__project=m.project, user_story__status=m.open_status, user_story__milestone=None) - # 5 and 6 are in the same milestone + # 5 and 6 are in closed milestones m.role_points5 = f.RolePointsFactory(role=m.project.roles.all()[0], points=m.points5, user_story__project=m.project, - user_story__status=m.open_status) + user_story__status=m.open_status, + user_story__milestone__closed=True, + user_story__milestone__project=m.project) m.role_points6 = f.RolePointsFactory(role=m.project.roles.all()[0], points=m.points6, user_story__project=m.project, user_story__status=m.open_status, - user_story__milestone=m.role_points5.user_story.milestone) + user_story__milestone__closed=True, + user_story__milestone__project=m.project) m.user_story1 = m.role_points1.user_story m.user_story2 = m.role_points2.user_story @@ -106,13 +109,17 @@ def test_project_closed_points(client, data): data.user_story4.is_closed = True data.user_story4.save() assert data.project.closed_points == {data.role1.pk: 14, data.role2.pk: 1} - #User story5 milestone isn't closed + data.user_story5.is_closed = True data.user_story5.save() assert data.project.closed_points == {data.role1.pk: 30, data.role2.pk: 1} + data.user_story6.is_closed = True + data.user_story6.save() + assert data.project.closed_points == {data.role1.pk: 62, data.role2.pk: 1} project_stats = get_stats_for_project(data.project) - assert project_stats["closed_points"] == 15 + assert project_stats["closed_points"] == 63 + assert project_stats["speed"] == 24 def test_project_assigned_points(client, data): From b7a752221f6cce9da3e2e7d9a684387bbfae9581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 3 Nov 2015 12:06:52 +0100 Subject: [PATCH 09/64] [HOTFIX] Fix last migrationm --- .../notifications/migrations/0006_auto_20151103_0954.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py b/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py index 561589c2..6f282a0f 100644 --- a/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py +++ b/taiga/projects/notifications/migrations/0006_auto_20151103_0954.py @@ -14,6 +14,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='notifypolicy', name='notify_level', - field=models.SmallIntegerField(choices=[(, 'Involved'), (, 'All'), (, 'None')]), + field=models.SmallIntegerField(choices=[(1, 'Involved'), (2, 'All'), (3, 'None')]), ), ] From fd300b589719a9d013c05f165257ce58f34b8cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 3 Nov 2015 18:32:37 +0100 Subject: [PATCH 10/64] Update redis lib to 2.10.5 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 533a20e2..18b020ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,7 +22,7 @@ requests==2.8.1 django-sr==0.0.4 easy-thumbnails==2.2 celery==3.1.19 -redis==2.10.3 +redis==2.10.5 Unidecode==0.04.18 raven==5.8.1 bleach==1.4.2 From 448cc19185c8c517780c468a5a2832ca5baf332a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 4 Nov 2015 09:04:07 +0100 Subject: [PATCH 11/64] Fixing ts_query function --- taiga/base/utils/db.py | 1 + tests/unit/test_utils.py | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py index 2308840a..82694014 100644 --- a/taiga/base/utils/db.py +++ b/taiga/base/utils/db.py @@ -204,6 +204,7 @@ def to_tsquery(term): continue bit = bit.replace("'", "") + bit = bit.replace("\\", "") if not bit: continue diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 9521974b..ff6889ab 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -17,9 +17,10 @@ from unittest import mock import django_sites as sites +import re from taiga.base.utils.urls import get_absolute_url, is_absolute_url, build_url -from taiga.base.utils.db import save_in_bulk, update_in_bulk, update_in_bulk_with_ids +from taiga.base.utils.db import save_in_bulk, update_in_bulk, update_in_bulk_with_ids, to_tsquery def test_is_absolute_url(): @@ -89,3 +90,27 @@ def test_update_in_bulk_with_ids(): ] model.objects.filter.assert_has_calls(expected_calls) + + +TS_QUERY_TRANSFORMATIONS = [ + ("1 OR 2", "1 | 2"), + ("(1) 2", "( 1 ) & 2"), + ("&", "'&':*"), + ('"hello world"', "'hello world'"), + ("not 1", "! 1"), + ("1 and not (2 or 3)", "1 & ! ( 2 | 3 )"), + ("not and and 1) or ( 2 not", "! 1 | ( 2 )"), + ("() 1", "1"), + ("1 2 3", "1 & 2 & 3"), + ("'&' |", "'&':* & '|':*"), + (") and 1 (2 or", "1 & ( 2 )"), + ("it's '", "'its':*"), + ("(1)", "( 1 )"), + ("1((", "1"), + ("test\\", "'test':*"), +] +def test_to_tsquery(): + for (input, expected) in TS_QUERY_TRANSFORMATIONS: + expected = re.sub("([0-9])", r"'\1':*", expected) + actual = to_tsquery(input) + assert actual == expected From d94a568ffbb62ec268e0a4a354b9937554ccf8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 4 Nov 2015 16:52:48 +0100 Subject: [PATCH 12/64] Fix #3451, set 'involved' as default notify level --- taiga/projects/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taiga/projects/api.py b/taiga/projects/api.py index ceebb2f7..ba49b1a1 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -80,7 +80,7 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) def watch(self, request, pk=None): project = self.get_object() self.check_permissions(request, "watch", project) - notify_level = request.DATA.get("notify_level", NotifyLevel.all) + notify_level = request.DATA.get("notify_level", NotifyLevel.involved) project.add_watcher(self.request.user, notify_level=notify_level) return response.Ok() From 06e5492d66ef405fc6947fda02207a767b73a9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 4 Nov 2015 17:43:03 +0100 Subject: [PATCH 13/64] Fix #3451, set 'involved' as default notify level (II) --- taiga/projects/notifications/services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taiga/projects/notifications/services.py b/taiga/projects/notifications/services.py index 5a850d46..bbfc9dd5 100644 --- a/taiga/projects/notifications/services.py +++ b/taiga/projects/notifications/services.py @@ -397,7 +397,7 @@ def add_watcher(obj, user): object_id=obj.id, user=user, project=obj.project) notify_policy, _ = apps.get_model("notifications", "NotifyPolicy").objects.get_or_create( - project=obj.project, user=user, defaults={"notify_level": NotifyLevel.all}) + project=obj.project, user=user, defaults={"notify_level": NotifyLevel.involved}) return watched From 195c62f9ba772d3b6d1d25b6d5160542b61e7d5d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 4 Nov 2015 13:05:05 +0100 Subject: [PATCH 14/64] Setting finished date correctly on tasks --- taiga/export_import/api.py | 4 ++ taiga/projects/tasks/apps.py | 4 ++ .../migrations/0009_auto_20151104_1131.py | 50 +++++++++++++++++++ taiga/projects/tasks/signals.py | 11 ++++ 4 files changed, 69 insertions(+) create mode 100644 taiga/projects/tasks/migrations/0009_auto_20151104_1131.py diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py index e9da52c0..fe422836 100644 --- a/taiga/export_import/api.py +++ b/taiga/export_import/api.py @@ -33,6 +33,7 @@ from taiga.base.api.mixins import CreateModelMixin from taiga.base.api.viewsets import GenericViewSet from taiga.projects.models import Project, Membership from taiga.projects.issues.models import Issue +from taiga.projects.tasks.models import Task from taiga.projects.serializers import ProjectSerializer from . import mixins @@ -238,6 +239,9 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) + signals.pre_save.disconnect(sender=Task, + dispatch_uid="set_finished_date_when_edit_task") + task = service.store_task(project, request.DATA.copy()) errors = service.get_errors() diff --git a/taiga/projects/tasks/apps.py b/taiga/projects/tasks/apps.py index d495c964..a38947e6 100644 --- a/taiga/projects/tasks/apps.py +++ b/taiga/projects/tasks/apps.py @@ -23,6 +23,10 @@ from taiga.projects.custom_attributes import signals as custom_attributes_handle from . import signals as handlers def connect_tasks_signals(): + # Finished date + signals.pre_save.connect(handlers.set_finished_date_when_edit_task, + sender=apps.get_model("tasks", "Task"), + dispatch_uid="set_finished_date_when_edit_task") # Tags signals.pre_save.connect(generic_handlers.tags_normalization, sender=apps.get_model("tasks", "Task"), diff --git a/taiga/projects/tasks/migrations/0009_auto_20151104_1131.py b/taiga/projects/tasks/migrations/0009_auto_20151104_1131.py new file mode 100644 index 00000000..da11ea7b --- /dev/null +++ b/taiga/projects/tasks/migrations/0009_auto_20151104_1131.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import connection, migrations, models + +def set_finished_date_for_tasks(apps, schema_editor): + # Updates the finished date from tasks according to the history_entries associated + # It takes the last history change updateing the status of a task and if it's a closed + # one it updates the finished_date attribute + sql=""" +WITH status_update AS( + WITH status_update AS( + WITH history_entries AS ( + SELECT + diff#>>'{status, 1}' new_status_id, + regexp_split_to_array(key, ':') as split_key, + created_at as date + FROM history_historyentry + WHERE diff#>>'{status, 1}' != '' + ) + SELECT + split_key[2] as object_id, + new_status_id::int, + MAX(date) as status_change_datetime + FROM history_entries + WHERE split_key[1] = 'tasks.task' + GROUP BY object_id, new_status_id, date + ) + SELECT status_update.* + FROM status_update + INNER JOIN projects_taskstatus + ON projects_taskstatus.id = new_status_id AND projects_taskstatus.is_closed = True +) +UPDATE tasks_task +SET finished_date = status_update.status_change_datetime +FROM status_update +WHERE tasks_task.id = status_update.object_id::int + """ + cursor = connection.cursor() + cursor.execute(sql) + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0008_remove_task_watchers'), + ] + + operations = [ + migrations.RunPython(set_finished_date_for_tasks), + ] diff --git a/taiga/projects/tasks/signals.py b/taiga/projects/tasks/signals.py index 07a7738d..f45de621 100644 --- a/taiga/projects/tasks/signals.py +++ b/taiga/projects/tasks/signals.py @@ -16,6 +16,7 @@ from contextlib import suppress from django.core.exceptions import ObjectDoesNotExist +from django.utils import timezone #################################### # Signals for cached prev task @@ -92,3 +93,13 @@ def _try_to_close_milestone_when_delete_task(instance): with suppress(ObjectDoesNotExist): if instance.milestone_id and services.calculate_milestone_is_closed(instance.milestone): services.close_milestone(instance.milestone) + +#################################### +# Signals for set finished date +#################################### + +def set_finished_date_when_edit_task(sender, instance, **kwargs): + if instance.status.is_closed and not instance.finished_date: + instance.finished_date = timezone.now() + elif not instance.status.is_closed and instance.finished_date: + instance.finished_date = None From b03ac82ee450edd6c2b3a77a4949ff8f53f3c1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Thu, 5 Nov 2015 18:57:20 +0100 Subject: [PATCH 15/64] Update README.md --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5aa5093e..13654451 100644 --- a/README.md +++ b/README.md @@ -25,30 +25,30 @@ Big features are also welcome but if you want to see your contributions included #### License #### -Every code patch accepted in taiga codebase is licensed under [AGPL v3.0](http://www.gnu.org/licenses/agpl-3.0.html). You should must be careful to not include any code that can not be licensed under this license. +Every code patch accepted in taiga codebase is licensed under [AGPL v3.0](http://www.gnu.org/licenses/agpl-3.0.html). You must be careful to not include any code that can not be licensed under this license. -Please read carefully [our license](https://github.com/taigaio/taiga-back/blob/master/LICENSE) and ask us if you have any questions. +Please read carefully [our license](https://github.com/taigaio/taiga-front/blob/master/LICENSE) and ask us if you have any questions. #### Bug reports, enhancements and support #### -If you **nedd help to setup Taiga**, you want to **talk about some cool enhancemnt** or you have **some questions** please write us to our [mailing list](http://groups.google.com/d/forum/taigaio). +If you **need help to setup Taiga**, want to **talk about some cool enhancemnt** or you have **some questions**, please write us to our [mailing list](http://groups.google.com/d/forum/taigaio). If you **find a bug** in Taiga you can always report it: - in our [mailing list](http://groups.google.com/d/forum/taigaio). -- in [github issues](https://github.com/taigaio/taiga-back/issues). +- in [github issues](https://github.com/taigaio/taiga-front/issues). - send us a mail to support@taiga.io if is a bug related to tree.taiga.io. - send a mail to security@taiga.io if is a **security bug**. One of our fellow Taiga developers will search, find and hunt it as soon as possible. -Please, before reporting an bug write down how can we reproduce it, your operating system, your browser and version, and if it's possible, a screenshot. Sometimes it take less time to fix a bug if the developer know how to find it and we will solve your problem as fast as possible. +Please, before reporting a bug write down how can we reproduce it, your operating system, your browser and version, and if it's possible, a screenshot. Sometimes it takes less time to fix a bug if the developer knows how to find it and we will solve your problem as fast as possible. #### Documentation improvements #### -We are gathering lots of information from our users to build and enhance our documentation. If you are the documentation to install or develop with Taiga and find any mistakes, omissions or confused sequences, it is enormously helpful to report it. Or better still, if you believe you can author additions, please make a pull-request to taiga project. +We are gathering lots of information from our users to build and enhance our documentation. If you use the documentation to install or develop with Taiga and find any mistakes, omissions or confused sequences, it is enormously helpful to report it. Or better still, if you believe you can author additions, please make a pull-request to taiga project. Currently, we have authored three main documentation hubs: @@ -59,14 +59,14 @@ Currently, we have authored three main documentation hubs: #### Translation #### -We are ready now to accept your help translating Taiga. It's easy (and fun!) just access to our team of translators with the link below, set up an account in Transifex and start contributing. Join us to make sure your language is covered! **[Help Taiga to trasnlate content](https://www.transifex.com/signup/ "Help Taiga to trasnlatecontent")** +We are ready now to accept your help translating Taiga. It's easy (and fun!) just access our team of translators with the link below, set up an account in Transifex and start contributing. Join us to make sure your language is covered! **[Help Taiga to trasnlate content](https://www.transifex.com/signup/ "Help Taiga to trasnlatecontent")** #### Code patches #### Taiga will always be glad to receive code patches to update, fix or improve its code. -If you know how to improve our code base or you found a bug, a security vulnerabilities a performance issue and you think you can solve, we will be very happy to accept your pull-request. If your code requires considerable changes, we recommend you first talk to us directly. We will find the best way to help. +If you know how to improve our code base or you found a bug, a security vulnerability or a performance issue and you think you can solve it, we will be very happy to accept your pull-request. If your code requires considerable changes, we recommend you first talk to us directly. We will find the best way to help. #### UI enhancements #### @@ -75,10 +75,11 @@ Taiga is made for developers and designers. We care enormously about UI because There are two possible ways to contribute to our UI: - **Bugs**: If you find a bug regarding front-end, please report it as previously indicated in the Bug reports section or send a pull-request as indicated in the Code Patches section. -- **Enhancements**: If its a design or UX bug or enhancement we will love to receive your feedback. Please send us your enhancement, with the reason and, if it's possible, an example. Our design and UX team will review your enhancement and fix it as soon as possible. We recommend you to use our [mailing list](http://groups.google.co.uk/d/forum/taigaio){target="_blank"} so we can have a lot of different opinions and debate. +- **Enhancements**: If its a design or UX bug or enhancement we will love to receive your feedback. Please send us your enhancement, with the reason and, if possible, an example. Our design and UX team will review your enhancement and fix it as soon as possible. We recommend you to use our [mailing list](http://groups.google.co.uk/d/forum/taigaio){target="_blank"} so we can have a lot of different opinions and debate. - **Language Localization**: We are eager to offer localized versions of Taiga. Some members of the community have already volunteered to work to provide a variety of languages. We are working to implement some changes to allow for this and expect to accept these requests in the near future. + ## Setup development environment ## Just execute these commands in your virtualenv(wrapper): From 31ce792f412732fe6a43f3880260fb75234f385c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 6 Nov 2015 07:49:10 +0100 Subject: [PATCH 16/64] Fixing webhooks serializers --- taiga/webhooks/serializers.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/taiga/webhooks/serializers.py b/taiga/webhooks/serializers.py index 9ea5a120..d05b25ca 100644 --- a/taiga/webhooks/serializers.py +++ b/taiga/webhooks/serializers.py @@ -110,7 +110,6 @@ class UserStorySerializer(CustomAttributesValuesWebhookSerializerMixin, Editable external_reference = PgArrayField(required=False) owner = UserSerializer() assigned_to = UserSerializer() - watchers = UserSerializer(many=True) points = PointSerializer(many=True) class Meta: @@ -126,7 +125,6 @@ class TaskSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatch tags = TagsField(default=[], required=False) owner = UserSerializer() assigned_to = UserSerializer() - watchers = UserSerializer(many=True) class Meta: model = task_models.Task @@ -140,7 +138,6 @@ class IssueSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatc tags = TagsField(default=[], required=False) owner = UserSerializer() assigned_to = UserSerializer() - watchers = UserSerializer(many=True) class Meta: model = issue_models.Issue @@ -152,7 +149,6 @@ class IssueSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatc class WikiPageSerializer(serializers.ModelSerializer): owner = UserSerializer() last_modifier = UserSerializer() - watchers = UserSerializer(many=True) class Meta: model = wiki_models.WikiPage From 7ec5499a1944f26f2b16baec9f55cddd4e5dae2a Mon Sep 17 00:00:00 2001 From: Issa Jubril Date: Fri, 6 Nov 2015 10:17:27 +0100 Subject: [PATCH 17/64] Update README.md Change trasnlate to translate in README file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13654451..2ef73e3a 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Currently, we have authored three main documentation hubs: #### Translation #### -We are ready now to accept your help translating Taiga. It's easy (and fun!) just access our team of translators with the link below, set up an account in Transifex and start contributing. Join us to make sure your language is covered! **[Help Taiga to trasnlate content](https://www.transifex.com/signup/ "Help Taiga to trasnlatecontent")** +We are ready now to accept your help translating Taiga. It's easy (and fun!) just access our team of translators with the link below, set up an account in Transifex and start contributing. Join us to make sure your language is covered! **[Help Taiga to translate content](https://www.transifex.com/signup/ "Help Taiga to trasnlatecontent")** #### Code patches #### From 15536f1ce3d9e60cb54faa29f386834c7a15601d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 10 Nov 2015 11:02:45 +0100 Subject: [PATCH 18/64] Issue 3468: Export project then import destroyed the attachments --- taiga/export_import/serializers.py | 15 ++++++++++++++- taiga/export_import/service.py | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index 7b329e60..b04ce346 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -66,7 +66,20 @@ class AttachedFileField(serializers.WritableField): def from_native(self, data): if not data: return None - return ContentFile(base64.b64decode(data['data']), name=data['name']) + + # Each sequence of 3 octets is represented by 4 characters in base64. + # The file was encoded in chunks of 8190 (multiple of three) so the proper way of decoding it is: + # - split the encoded data in multiple of four chars blocks + # - decode each block + decoded_data = b'' + pending_data = data['data'] + chunk_size = 8192 + while pending_data: + decoding_data = pending_data[0:chunk_size] + decoded_data += base64.b64decode(decoding_data) + pending_data = pending_data[chunk_size:] + + return ContentFile(decoded_data, name=data['name']) class RelatedNoneSafeField(serializers.RelatedField): diff --git a/taiga/export_import/service.py b/taiga/export_import/service.py index 27d88d33..5e45a6e4 100644 --- a/taiga/export_import/service.py +++ b/taiga/export_import/service.py @@ -56,7 +56,7 @@ def add_errors(section, errors): _errors_log[section] = [errors] -def render_project(project, outfile, chunk_size = 8192): +def render_project(project, outfile, chunk_size = 8190): serializer = serializers.ProjectExportSerializer(project) outfile.write('{\n') From 1602fb821916e8ddb89ccf05492c1caac45c3111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 10 Nov 2015 15:49:34 +0100 Subject: [PATCH 19/64] Downgrade Pillow to fix a bug with tiffs images. And update some libs too --- requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 18b020ce..e7dc447a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ -Django==1.8.5 +Django==1.8.6 #djangorestframework==2.3.13 # It's not necessary since Taiga 1.7 django-picklefield==0.3.2 django-sampledatahelper==0.3.0 gunicorn==19.3.0 psycopg2==2.6.1 -Pillow==3.0.0 +Pillow==2.9.0 pytz==2015.7 six==1.10.0 amqp==1.4.7 @@ -20,13 +20,13 @@ fn==0.4.3 diff-match-patch==20121119 requests==2.8.1 django-sr==0.0.4 -easy-thumbnails==2.2 +easy-thumbnails==2.2.1 celery==3.1.19 redis==2.10.5 Unidecode==0.04.18 raven==5.8.1 bleach==1.4.2 -django-ipware==1.1.1 +django-ipware==1.1.2 premailer==2.9.6 cssutils==1.0.1 # Compatible with python 3.5 django-transactional-cleanup==0.1.15 From 1c384949ae2ea7aa128159ee9408f35a57667938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 10 Nov 2015 15:51:40 +0100 Subject: [PATCH 20/64] Update markdown lib --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e7dc447a..cb7735b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ django-jinja==1.4.1 jinja2==2.8 pygments==2.0.2 django-sites==0.8 -Markdown==2.6.3 +Markdown==2.6.4 fn==0.4.3 diff-match-patch==20121119 requests==2.8.1 From c8ae1b84dc6b86f55a7eec724765d953f391b0d9 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 11 Nov 2015 10:31:05 +0100 Subject: [PATCH 21/64] Fixing chunk deserializing --- taiga/export_import/serializers.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index b04ce346..86d84018 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -67,17 +67,18 @@ class AttachedFileField(serializers.WritableField): if not data: return None - # Each sequence of 3 octets is represented by 4 characters in base64. - # The file was encoded in chunks of 8190 (multiple of three) so the proper way of decoding it is: - # - split the encoded data in multiple of four chars blocks - # - decode each block decoded_data = b'' - pending_data = data['data'] - chunk_size = 8192 - while pending_data: - decoding_data = pending_data[0:chunk_size] - decoded_data += base64.b64decode(decoding_data) - pending_data = pending_data[chunk_size:] + # The original file was encoded by chunks but we don't really know its + # length or if it was multiple of 3 so we must iterate over all those chunks + # decoding them one by one + for decoding_chunk in data['data'].split("="): + # When encoding to base64 3 bytes are transformed into 4 bytes and + # the extra space of the block is filled with = + # We must ensure that the decoding chunk has a length multiple of 4 so + # we restore the stripped '='s adding appending them until the chunk has + # a length multiple of 4 + decoding_chunk += "=" * (-len(decoding_chunk) % 4) + decoded_data += base64.b64decode(decoding_chunk+"=") return ContentFile(decoded_data, name=data['name']) From 463f5af3307505bb1b10c5af3c2713f5d18d768c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 11 Nov 2015 16:04:30 +0100 Subject: [PATCH 22/64] [i18n] Update locales --- taiga/locale/ca/LC_MESSAGES/django.po | 16 +-- taiga/locale/de/LC_MESSAGES/django.po | 131 +++++++++++++++++---- taiga/locale/en/LC_MESSAGES/django.po | 16 +-- taiga/locale/es/LC_MESSAGES/django.po | 23 ++-- taiga/locale/fi/LC_MESSAGES/django.po | 16 +-- taiga/locale/fr/LC_MESSAGES/django.po | 24 ++-- taiga/locale/it/LC_MESSAGES/django.po | 34 +++--- taiga/locale/nl/LC_MESSAGES/django.po | 16 +-- taiga/locale/pl/LC_MESSAGES/django.po | 16 +-- taiga/locale/pt_BR/LC_MESSAGES/django.po | 16 +-- taiga/locale/ru/LC_MESSAGES/django.po | 34 +++--- taiga/locale/zh-Hant/LC_MESSAGES/django.po | 16 +-- 12 files changed, 219 insertions(+), 139 deletions(-) diff --git a/taiga/locale/ca/LC_MESSAGES/django.po b/taiga/locale/ca/LC_MESSAGES/django.po index 93b1921a..27b52fd7 100644 --- a/taiga/locale/ca/LC_MESSAGES/django.po +++ b/taiga/locale/ca/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 13:35+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -454,15 +454,15 @@ msgstr "" " Comentari: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Es necessita arxiu dump." -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Format d'arxiu dump invàlid" @@ -522,21 +522,21 @@ msgstr "" msgid "error importing timelines" msgstr "" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Contingut invàlid. Deu ser {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Conté camps personalitzats invàlids." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/de/LC_MESSAGES/django.po b/taiga/locale/de/LC_MESSAGES/django.po index 8ce02f38..40f4231c 100644 --- a/taiga/locale/de/LC_MESSAGES/django.po +++ b/taiga/locale/de/LC_MESSAGES/django.po @@ -4,7 +4,8 @@ # # Translators: # Chris , 2015 -# Christoph Harrer, 2015 +# M S, 2015 +# Guido Brand, 2015 # Hans Raaf, 2015 # Hans Raaf, 2015 # Henning Matthaei, 2015 @@ -16,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" -"Last-Translator: Taiga Dev Team \n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"PO-Revision-Date: 2015-11-11 09:45+0000\n" +"Last-Translator: Guido Brand\n" "Language-Team: German (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/de/)\n" "MIME-Version: 1.0\n" @@ -213,7 +214,7 @@ msgstr "" #: taiga/base/api/pagination.py:115 msgid "Page is not 'last', nor can it be converted to an int." -msgstr "" +msgstr "Seite ist nicht 'letzte', noch kann diese konvertiert werden." #: taiga/base/api/pagination.py:119 #, python-format @@ -508,15 +509,15 @@ msgstr "" "Kommentar: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Es ist mindestens eine Rolle nötig" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Exportdatei erforderlich" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Ungültiges Exportdatei Format" @@ -576,21 +577,21 @@ msgstr "Fehler beim Importieren der Schlagworte" msgid "error importing timelines" msgstr "Fehler beim Importieren der Chroniken" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" wurde in diesem Projekt nicht gefunden" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Invalider Inhalt. Er muss wie folgt sein: {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Enthält ungültige Benutzerfelder." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 @@ -848,7 +849,7 @@ msgstr "[%(project)s] Ihre Projekt Export-Datei wurde importiert" #: taiga/external_apps/api.py:40 taiga/external_apps/api.py:66 #: taiga/external_apps/api.py:73 msgid "Authentication required" -msgstr "" +msgstr "Authentifizierung erforderlich" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 @@ -884,7 +885,7 @@ msgstr "Nächste URL" #: taiga/external_apps/models.py:41 msgid "secret key for ciphering the application tokens" -msgstr "" +msgstr "Geheimer Schlüssel für Verschlüsselung der Anwensungs-Token" #: taiga/external_apps/models.py:55 taiga/projects/likes/models.py:50 #: taiga/projects/notifications/models.py:84 taiga/projects/votes/models.py:50 @@ -1021,6 +1022,12 @@ msgid "" "\n" "{description}" msgstr "" +"Problem-Bericht erstellt von [@{bitbucket_user_name}]({bitbucket_user_url} " +"\"Schau @{bitbucket_user_name}'s BitBucket profile\") von BitBucket.\n" +"Original BitBucket Problem-Bericht: [bb#{number} - {subject}]" +"({bitbucket_url} \"Gehe zu 'bb#{number} - {subject}'\"):\n" +"\n" +"{description}" #: taiga/hooks/bitbucket/event_hooks.py:153 msgid "Issue created from BitBucket." @@ -1042,6 +1049,12 @@ msgid "" "\n" "{message}" msgstr "" +"Kommentar von [@{bitbucket_user_name}]({bitbucket_user_url} \"Schau " +"@{bitbucket_user_name}'s BitBucket profile\") von BitBucket.\n" +"Original BitBucket Problem-Bericht: [bb#{number} - {subject}]" +"({bitbucket_url} \"Gehe zu 'bb#{number} - {subject}'\")\n" +"\n" +"{message}" #: taiga/hooks/bitbucket/event_hooks.py:196 #, python-brace-format @@ -1136,6 +1149,12 @@ msgid "" "\n" "{message}" msgstr "" +"Kommentar von [@{gitlab_user_name}]({gitlab_user_url} \"Schau " +"@{gitlab_user_name}'s GitLab profile\") von GitLab.\n" +"Original GitLab Problem-Bericht: [gl#{number} - {subject}]({gitlab_url} " +"\"Gehe zu 'gl#{number} - {subject}'\")\n" +"\n" +"{message}" #: taiga/hooks/gitlab/event_hooks.py:171 #, python-brace-format @@ -1324,7 +1343,7 @@ msgstr "Sie haben keine Berechtigungen für diese Ansicht" #: taiga/projects/attachments/api.py:47 msgid "Partial updates are not supported" -msgstr "" +msgstr "Teil-Aktualisierungen sind nicht unterstützt" #: taiga/projects/attachments/api.py:62 msgid "Project ID not matches between object and project" @@ -1788,11 +1807,11 @@ msgstr "Videokonferenzsystem" #: taiga/projects/models.py:165 taiga/projects/models.py:625 msgid "videoconference extra data" -msgstr "" +msgstr "Zusatzdaten Videokonferenz" #: taiga/projects/models.py:170 msgid "creation template" -msgstr "" +msgstr "Vorlage erstellen" #: taiga/projects/models.py:173 msgid "anonymous permissions" @@ -1876,23 +1895,23 @@ msgstr "Rollen" #: taiga/projects/notifications/choices.py:28 msgid "Involved" -msgstr "" +msgstr "Beteiligt" #: taiga/projects/notifications/choices.py:29 msgid "All" -msgstr "" +msgstr "Alle" #: taiga/projects/notifications/choices.py:30 msgid "None" -msgstr "" +msgstr "Keine" #: taiga/projects/notifications/models.py:61 msgid "created date time" -msgstr "" +msgstr "Erstelldatum" #: taiga/projects/notifications/models.py:63 msgid "updated date time" -msgstr "" +msgstr "Aktualisierungsdatum" #: taiga/projects/notifications/models.py:65 msgid "history entries" @@ -1910,11 +1929,11 @@ msgstr "Beobachtet" #: taiga/projects/notifications/services.py:65 #: taiga/projects/notifications/services.py:79 msgid "Notify exists for specified user and project" -msgstr "" +msgstr "Benachrichtigung für bestimmte Benutzer und Projekt aktiviert" #: taiga/projects/notifications/services.py:427 msgid "Invalid value for notify level" -msgstr "" +msgstr "Ungültiger Wert für Benachrichtigungslevel" #: taiga/projects/notifications/templates/emails/issues/issue-change-body-html.jinja:4 #, python-format @@ -2814,6 +2833,10 @@ msgid "" "

%(extra)s

\n" " " msgstr "" +"\n" +"

Und nun ein paar schöne Worte
an die Person, die Dich " +"netterweise eingeladen hat

\n" +"

%(extra)s

" #: taiga/projects/templates/emails/membership_invitation-body-html.jinja:24 msgid "Accept your invitation to Taiga" @@ -2837,6 +2860,12 @@ msgid "" "%(project)s which is being managed on Taiga, a Free, open Source Agile " "Project Management Tool.\n" msgstr "" +"\n" +"Du oder jemand, den Du kennst, hat Dich zu Taiga eingeladen\n" +"\n" +"Hi! %(full_name)s hat Dir eine Einladung geschickt, um am Projekt " +"%(project)s mitzuarbeiten, welches mit Taiga gemanaged wird. Taiga ist ein " +"freies, agiles Open-Source Projektmanagement Werkzeug.\n" #: taiga/projects/templates/emails/membership_invitation-body-text.jinja:12 #, python-format @@ -2848,6 +2877,11 @@ msgid "" "%(extra)s\n" " " msgstr "" +"\n" +"Und nun ein paar schöne Worte an die vernünftige Person, die Dich " +"netterweise eingeladen hat:\n" +"\n" +"%(extra)s" #: taiga/projects/templates/emails/membership_invitation-body-text.jinja:18 msgid "Accept your invitation to Taiga following this link:" @@ -2939,6 +2973,12 @@ msgid "" "then allowed to grow and change as more is learned about the product and its " "customers" msgstr "" +"Das agile Backlog in Scrum ist eine priorisierte Featureliste, die " +"Kurzbeschreibungen aller gewünschten Funktionalitäten eines Produktes " +"enthält. Wenn Sie Scrum anwenden, ist es nicht erforderlich eine langwierige " +"Aufwandsschätzung durchzuführen. Das Produkt Backlog in Scrum darf stetig " +"wachsen und geändert werden, so dass es den Anforderungen des Produktes und " +"seiner Kunden gerecht wird." #. Translators: Name of kanban project template. #: taiga/projects/translations.py:33 @@ -2953,6 +2993,11 @@ msgid "" "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 ist eine Methode der Produktionsprozesssteuerung. Das Vorgehen " +"orientiert sich ausschließlich am tatsächlichen Verbrauch von Materialien am " +"Bereitstell- und Verbrauchsort. Kanban ermöglicht eine Reduktion der lokalen " +"Bestände von Vorprodukten in und nahe der Produktion, die dort in Produkten " +"der nächsten Integrationsstufe verbaut werden." #. Translators: User story point value (value = undefined) #: taiga/projects/translations.py:43 @@ -3171,7 +3216,7 @@ msgstr "" #: taiga/projects/userstories/api.py:254 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" -msgstr "" +msgstr "Erstelle die User-Story #{ref} - {subject}" #: taiga/projects/userstories/models.py:37 msgid "role" @@ -3245,7 +3290,7 @@ msgstr "href" #: taiga/timeline/signals.py:67 msgid "Check the history API for the exact diff" -msgstr "" +msgstr "Prüfe die API der Historie auf Übereinstimmung" #: taiga/users/admin.py:50 msgid "Personal info" @@ -3528,6 +3573,19 @@ msgid "" " \n" " " msgstr "" +"\n" +"\n" +"

Vielen Dank für die Registrierung bei Taiga

\n" +"

Wir hoffen, dass Du es magst

\n" +"

Wir haben Taiga entwickelt, weil wir ein Projektmanagement Werkzeug zur " +"Verfügung stellen wollen, welches Dir den ganzen Tag an Deinem Computer ein " +"hilfreicher und ständiger Begleiter bei der Zusammenarbeit bei Design und " +"Code Projekten sein soll.

\n" +"

Wir haben es so aufgebaut, dass es schön, elegant, einfach zu nutzen und " +"damit auch Spaß macht - ohne auf Flexibilität und Energie zu verzichten.\n" +"Das taiga Team\n" +"" #: taiga/users/templates/emails/registered_user-body-html.jinja:23 #, python-format @@ -3538,6 +3596,10 @@ msgid "" "here\n" " " msgstr "" +"\n" +"Du möchtest Deinen Account entfernen und die Dienste nicht weiter " +"nutzen hier klciken" #: taiga/users/templates/emails/registered_user-body-text.jinja:1 msgid "" @@ -3556,6 +3618,21 @@ msgid "" "--\n" "The taiga Team\n" msgstr "" +"\n" +"Vielen Dank für die Registrierung bei Taiga\n" +"\n" +"Wir hoffen, dass Du es magst\n" +"\n" +"Wir haben Taiga entwickelt, weil wir ein Projektmanagement Werkzeug zur " +"Verfügung stellen wollen, welches Dir den ganzen Tag an Deinem Computer ein " +"hilfreicher und ständiger Begleiter bei der Zusammenarbeit bei Design und " +"Code Projekten sein soll.\n" +"\n" +"Wir haben es so aufgebaut, dass es schön, elegant, einfach zu nutzen und " +"damit auch Spaß macht - ohne auf Flexibilität und Energie zu verzichten.\n" +"\n" +"--\n" +"Das taiga Team\n" #: taiga/users/templates/emails/registered_user-body-text.jinja:13 #, python-format @@ -3578,6 +3655,8 @@ msgstr "Es gibt keine Rolle mit dieser id" msgid "" "Duplicate key value violates unique constraint. Key '{}' already exists." msgstr "" +"Doppelter Schlüsselwert verstößt einzigartige Vorgaben. Schlüssel '{}' " +"existiert bereits." #: taiga/userstorage/models.py:30 msgid "key" diff --git a/taiga/locale/en/LC_MESSAGES/django.po b/taiga/locale/en/LC_MESSAGES/django.po index f9ac0a78..51d53df2 100644 --- a/taiga/locale/en/LC_MESSAGES/django.po +++ b/taiga/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-03-25 20:09+0100\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Taiga Dev Team \n" @@ -443,15 +443,15 @@ msgid "" " " msgstr "" -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "" @@ -511,21 +511,21 @@ msgstr "" msgid "error importing timelines" msgstr "" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "" -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/es/LC_MESSAGES/django.po b/taiga/locale/es/LC_MESSAGES/django.po index 49b33970..56a107ca 100644 --- a/taiga/locale/es/LC_MESSAGES/django.po +++ b/taiga/locale/es/LC_MESSAGES/django.po @@ -7,14 +7,15 @@ # Esther Moreno , 2015 # gustavodiazjaimes , 2015 # Hector Colina , 2015 +# Jesus Marin , 2015 # Taiga Dev Team , 2015 msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 14:26+0000\n" -"Last-Translator: David Barragán \n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"PO-Revision-Date: 2015-11-02 21:24+0000\n" +"Last-Translator: Jesus Marin \n" "Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/es/)\n" "MIME-Version: 1.0\n" @@ -492,15 +493,15 @@ msgstr "" "\n" "Comentario: %(comment)s" -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Necesitamos al menos un rol" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Se necesita el fichero con los datos exportados" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Formato de fichero de exportación inválido" @@ -560,21 +561,21 @@ msgstr "error importando las etiquetas" msgid "error importing timelines" msgstr "error importando los timelines" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" no se ha encontrado en este proyecto" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Contenido inválido. Debe ser {\"clave\": \"valor\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Contiene attributos personalizados inválidos." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 @@ -2983,7 +2984,7 @@ msgstr "Nueva" #. Translators: User story status #: taiga/projects/translations.py:76 msgid "Ready" -msgstr "Lista" +msgstr "Preparada" #. Translators: User story status #. Translators: Task status diff --git a/taiga/locale/fi/LC_MESSAGES/django.po b/taiga/locale/fi/LC_MESSAGES/django.po index 139549cb..28672246 100644 --- a/taiga/locale/fi/LC_MESSAGES/django.po +++ b/taiga/locale/fi/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Finnish (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -479,15 +479,15 @@ msgstr "" "\n" "Kommentti: %(comment)s" -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Tarvitaan tiedosto" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Virheellinen tiedostomuoto" @@ -547,21 +547,21 @@ msgstr "virhe avainsanojen sisäänlukemisessa" msgid "error importing timelines" msgstr "virhe aikajanojen tuonnissa" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" ei löytynyt tästä projektista" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Virheellinen sisältä, pitää olla muodossa {\"avain\": \"arvo\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Sisältää vieheellisiä omia kenttiä." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/fr/LC_MESSAGES/django.po b/taiga/locale/fr/LC_MESSAGES/django.po index b4601396..fabaa4d3 100644 --- a/taiga/locale/fr/LC_MESSAGES/django.po +++ b/taiga/locale/fr/LC_MESSAGES/django.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"PO-Revision-Date: 2015-11-02 16:16+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: French (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/fr/)\n" @@ -508,15 +508,15 @@ msgstr "" " Commentaire : %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Veuillez sélectionner au moins un rôle." -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Fichier de dump obligatoire" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Format de dump invalide" @@ -577,21 +577,21 @@ msgstr "erreur lors de l'importation des mots-clés" msgid "error importing timelines" msgstr "erreur lors de l'import des timelines" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" non trouvé dans the projet" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Format non valide. Il doit être de la forme {\"cle\": \"valeur\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Contient des champs personnalisés non valides." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 @@ -1577,11 +1577,11 @@ msgstr "" #: taiga/projects/likes/models.py:31 taiga/projects/likes/models.py:32 #: taiga/projects/likes/models.py:56 msgid "Likes" -msgstr "" +msgstr "Aime" #: taiga/projects/likes/models.py:55 msgid "Like" -msgstr "" +msgstr "Aimer" #: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 #: taiga/projects/models.py:396 taiga/projects/models.py:460 @@ -1831,7 +1831,7 @@ msgstr "notifier les utilisateurs" #: taiga/projects/notifications/models.py:90 #: taiga/projects/notifications/models.py:91 msgid "Watched" -msgstr "" +msgstr "Suivre" #: taiga/projects/notifications/services.py:65 #: taiga/projects/notifications/services.py:79 diff --git a/taiga/locale/it/LC_MESSAGES/django.po b/taiga/locale/it/LC_MESSAGES/django.po index 80f6b8ed..c6df2414 100644 --- a/taiga/locale/it/LC_MESSAGES/django.po +++ b/taiga/locale/it/LC_MESSAGES/django.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" -"Last-Translator: Taiga Dev Team \n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"PO-Revision-Date: 2015-11-10 14:10+0000\n" +"Last-Translator: Andrea Raimondi \n" "Language-Team: Italian (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/it/)\n" "MIME-Version: 1.0\n" @@ -502,15 +502,15 @@ msgstr "" "\n" "Commento: %(comment)s" -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "C'è bisogno di almeno un ruolo" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "E' richiesto un file di dump" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Formato di dump invalido" @@ -571,21 +571,21 @@ msgstr "Errore nell'importazione dei tags" msgid "error importing timelines" msgstr "Errore nell'importazione delle timelines" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" non è stato trovato in questo progetto" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Contenuto errato. Deve essere {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Contiene campi personalizzati invalidi." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 @@ -1508,7 +1508,7 @@ msgstr "Testo multi-linea" #: taiga/projects/custom_attributes/choices.py:27 msgid "Date" -msgstr "" +msgstr "Data" #: taiga/projects/custom_attributes/models.py:38 #: taiga/projects/issues/models.py:46 @@ -1738,11 +1738,11 @@ msgstr "conta" #: taiga/projects/likes/models.py:31 taiga/projects/likes/models.py:32 #: taiga/projects/likes/models.py:56 msgid "Likes" -msgstr "" +msgstr "Piaciuto" #: taiga/projects/likes/models.py:55 msgid "Like" -msgstr "" +msgstr "Like" #: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 #: taiga/projects/models.py:396 taiga/projects/models.py:460 @@ -1964,15 +1964,15 @@ msgstr "ruoli" #: taiga/projects/notifications/choices.py:28 msgid "Involved" -msgstr "" +msgstr "Coinvolto" #: taiga/projects/notifications/choices.py:29 msgid "All" -msgstr "" +msgstr "Tutti" #: taiga/projects/notifications/choices.py:30 msgid "None" -msgstr "" +msgstr "Nessuno" #: taiga/projects/notifications/models.py:61 msgid "created date time" @@ -3388,7 +3388,7 @@ msgstr "Non hai i permessi per aggiungere questo stato a questa storia utente." #: taiga/projects/userstories/api.py:254 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" -msgstr "" +msgstr "Stiamo generando la storia utente #{ref} - {subject}" #: taiga/projects/userstories/models.py:37 msgid "role" diff --git a/taiga/locale/nl/LC_MESSAGES/django.po b/taiga/locale/nl/LC_MESSAGES/django.po index 3b0648ee..9b922f7a 100644 --- a/taiga/locale/nl/LC_MESSAGES/django.po +++ b/taiga/locale/nl/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 13:41+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -492,15 +492,15 @@ msgstr "" " Commentaar: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "We hadden minstens één rol nodig" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Dump file nodig" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Ongeldig dump formaat" @@ -560,21 +560,21 @@ msgstr "fout bij importeren tags" msgid "error importing timelines" msgstr "fout bij importeren tijdlijnen" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" niet gevonden in dit project" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: 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:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Het bevat ongeldige eigen velden:" -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/pl/LC_MESSAGES/django.po b/taiga/locale/pl/LC_MESSAGES/django.po index ba47a433..d81c422a 100644 --- a/taiga/locale/pl/LC_MESSAGES/django.po +++ b/taiga/locale/pl/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Polish (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -493,15 +493,15 @@ msgstr "" " Komentarz: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Potrzeba conajmiej jednej roli" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Wymagany plik zrzutu" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Nieprawidłowy format zrzutu" @@ -561,21 +561,21 @@ msgstr "błąd w trakcie importu tagów" msgid "error importing timelines" msgstr "błąd w trakcie importu osi czasu" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" nie odnaleziono w projekcie" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Niewłaściwa zawartość. Musi to być {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Zawiera niewłaściwe pola niestandardowe." -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/pt_BR/LC_MESSAGES/django.po b/taiga/locale/pt_BR/LC_MESSAGES/django.po index 244f5689..7743f261 100644 --- a/taiga/locale/pt_BR/LC_MESSAGES/django.po +++ b/taiga/locale/pt_BR/LC_MESSAGES/django.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/taiga-agile-llc/" @@ -500,15 +500,15 @@ msgstr "" " Comentário: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Nós precisamos de pelo menos uma função" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Necessário de arquivo de restauração" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Formato de aquivo de restauração inválido" @@ -568,21 +568,21 @@ msgstr "erro importando tags" msgid "error importing timelines" msgstr "erro importando linha do tempo" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" não encontrado nesse projeto" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "conteúdo inválido. Deve ser {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Contém campos personalizados inválidos" -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 diff --git a/taiga/locale/ru/LC_MESSAGES/django.po b/taiga/locale/ru/LC_MESSAGES/django.po index 8d75d1e5..4c9cf68f 100644 --- a/taiga/locale/ru/LC_MESSAGES/django.po +++ b/taiga/locale/ru/LC_MESSAGES/django.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-02 09:24+0100\n" -"PO-Revision-Date: 2015-11-02 08:25+0000\n" -"Last-Translator: Taiga Dev Team \n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"PO-Revision-Date: 2015-11-07 12:59+0000\n" +"Last-Translator: Dmitriy Volkov \n" "Language-Team: Russian (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/ru/)\n" "MIME-Version: 1.0\n" @@ -500,15 +500,15 @@ msgstr "" " Комментарий: %(comment)s\n" " " -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "Нам была нужна хотя бы одна роль" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "Необходим дамп-файл" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "Неправильный формат для свалки" @@ -568,21 +568,21 @@ msgstr "ошибка импорта тэгов" msgid "error importing timelines" msgstr "ошибка импорта хронологии проекта" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" не найдено в этом проекте" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "Неправильные данные. Должны быть в формате {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "Содержит неверные специальные поля" -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 @@ -1422,7 +1422,7 @@ msgstr "Многострочный текст" #: taiga/projects/custom_attributes/choices.py:27 msgid "Date" -msgstr "" +msgstr "Дата" #: taiga/projects/custom_attributes/models.py:38 #: taiga/projects/issues/models.py:46 @@ -1656,11 +1656,11 @@ msgstr "количество" #: taiga/projects/likes/models.py:31 taiga/projects/likes/models.py:32 #: taiga/projects/likes/models.py:56 msgid "Likes" -msgstr "" +msgstr "Лайки" #: taiga/projects/likes/models.py:55 msgid "Like" -msgstr "" +msgstr "Лайк" #: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 #: taiga/projects/models.py:396 taiga/projects/models.py:460 @@ -1883,15 +1883,15 @@ msgstr "роли" #: taiga/projects/notifications/choices.py:28 msgid "Involved" -msgstr "" +msgstr "Вовлеченные" #: taiga/projects/notifications/choices.py:29 msgid "All" -msgstr "" +msgstr "Все" #: taiga/projects/notifications/choices.py:30 msgid "None" -msgstr "" +msgstr "Никаких" #: taiga/projects/notifications/models.py:61 msgid "created date time" @@ -3153,7 +3153,7 @@ msgstr "" #: taiga/projects/userstories/api.py:254 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" -msgstr "" +msgstr "Генерируется пользовательская история #{ref} - {subject}" #: taiga/projects/userstories/models.py:37 msgid "role" diff --git a/taiga/locale/zh-Hant/LC_MESSAGES/django.po b/taiga/locale/zh-Hant/LC_MESSAGES/django.po index 240baf91..939e0e36 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-11-02 09:24+0100\n" +"POT-Creation-Date: 2015-11-11 16:03+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Chinese Traditional (http://www.transifex.com/taiga-agile-llc/" @@ -484,15 +484,15 @@ msgstr "" "\n" "評論: %(comment)s" -#: taiga/export_import/api.py:103 +#: taiga/export_import/api.py:104 msgid "We needed at least one role" msgstr "我們至少需要一個角色" -#: taiga/export_import/api.py:197 +#: taiga/export_import/api.py:198 msgid "Needed dump file" msgstr "需要的堆存檔案" -#: taiga/export_import/api.py:204 +#: taiga/export_import/api.py:205 msgid "Invalid dump format" msgstr "無效堆存格式" @@ -552,21 +552,21 @@ msgstr "滙入標籤出錯" msgid "error importing timelines" msgstr "滙入時間軸出錯" -#: taiga/export_import/serializers.py:163 +#: taiga/export_import/serializers.py:177 msgid "{}=\"{}\" not found in this project" msgstr "{}=\"{}\" 無法在此專案中找到" -#: taiga/export_import/serializers.py:428 +#: taiga/export_import/serializers.py:442 #: taiga/projects/custom_attributes/serializers.py:103 msgid "Invalid content. It must be {\"key\": \"value\",...}" msgstr "無效內容。必須為 {\"key\": \"value\",...}" -#: taiga/export_import/serializers.py:443 +#: taiga/export_import/serializers.py:457 #: taiga/projects/custom_attributes/serializers.py:118 msgid "It contain invalid custom fields." msgstr "包括無效慣例欄位" -#: taiga/export_import/serializers.py:513 +#: taiga/export_import/serializers.py:527 #: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 From 6073a66333d0c1b05d3cddd61fed6b084446f8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Thu, 12 Nov 2015 10:22:55 +0100 Subject: [PATCH 23/64] Calculate average for last five working days --- taiga/stats/services.py | 55 ++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/taiga/stats/services.py b/taiga/stats/services.py index 61e30c51..a0d65c45 100644 --- a/taiga/stats/services.py +++ b/taiga/stats/services.py @@ -15,7 +15,9 @@ from django.apps import apps from django.db.models import Count +from django.db.models import Q from django.utils import timezone + from datetime import timedelta from collections import OrderedDict @@ -25,17 +27,23 @@ def get_users_stats(): queryset = model.objects.filter(is_active=True, is_system=False) stats = OrderedDict() - # Total - stats["total"] = queryset.count() - - # Average last 7 days today = timezone.now() - seven_days_ago = today-timedelta(days=7) - stats["average_last_seven_days"] = (queryset.filter(date_joined__range=(seven_days_ago, today)) + yesterday = today - timedelta(days=1) + seven_days_ago = yesterday - timedelta(days=7) + a_year_ago = today - timedelta(days=365) + + stats["total"] = queryset.count() + stats["today"] = queryset.filter(date_joined__year=today.year, + date_joined__month=today.month, + date_joined__day=today.day).count() + stats["average_last_seven_days"] = (queryset.filter(date_joined__range=(seven_days_ago, yesterday)) .count()) / 7 + stats["average_last_five_working_days"] = (queryset.filter(date_joined__range=(seven_days_ago, yesterday)) + .exclude(Q(date_joined__week_day=1) | + Q(date_joined__week_day=7)) + .count()) / 5 # Graph: users last year - a_year_ago = timezone.now() - timedelta(days=365) # increments -> # SELECT date_trunc('week', "filtered_users"."date_joined") AS "week", # count(*) @@ -68,12 +76,20 @@ def get_projects_stats(): queryset = model.objects.all() stats = OrderedDict() - stats["total"] = queryset.count() - today = timezone.now() - seven_days_ago = today-timedelta(days=7) - stats["average_last_seven_days"] = (queryset.filter(created_date__range=(seven_days_ago, today)) + yesterday = today - timedelta(days=1) + seven_days_ago = yesterday - timedelta(days=7) + + stats["total"] = queryset.count() + stats["today"] = queryset.filter(created_date__year=today.year, + created_date__month=today.month, + created_date__day=today.day).count() + stats["average_last_seven_days"] = (queryset.filter(created_date__range=(seven_days_ago, yesterday)) .count()) / 7 + stats["average_last_five_working_days"] = (queryset.filter(created_date__range=(seven_days_ago, yesterday)) + .exclude(Q(created_date__week_day=1) | + Q(created_date__week_day=7)) + .count()) / 5 stats["total_with_backlog"] = (queryset.filter(is_backlog_activated=True, is_kanban_activated=False) @@ -98,10 +114,19 @@ def get_user_stories_stats(): queryset = model.objects.all() stats = OrderedDict() - stats["total"] = queryset.count() - today = timezone.now() - seven_days_ago = today-timedelta(days=7) - stats["average_last_seven_days"] = (queryset.filter(created_date__range=(seven_days_ago, today)) + yesterday = today - timedelta(days=1) + seven_days_ago = yesterday - timedelta(days=7) + + stats["total"] = queryset.count() + stats["today"] = queryset.filter(created_date__year=today.year, + created_date__month=today.month, + created_date__day=today.day).count() + stats["average_last_seven_days"] = (queryset.filter(created_date__range=(seven_days_ago, yesterday)) .count()) / 7 + stats["average_last_five_working_days"] = (queryset.filter(created_date__range=(seven_days_ago, yesterday)) + .exclude(Q(created_date__week_day=1) | + Q(created_date__week_day=7)) + .count()) / 5 + return stats From 8ea91e4b380fa044eedb2c62e7c973083a74df68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 13 Nov 2015 13:40:59 +0100 Subject: [PATCH 24/64] Add travis_retry command --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4a94cfaa..197e476d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,8 +19,8 @@ addons: before_script: - psql -c 'create database taiga;' -U postgres install: - - pip install -r requirements-devel.txt + - travis_retry pip install -r requirements-devel.txt script: - - coverage run --source=taiga --omit='*tests*,*commands*,*migrations*,*admin*,*.jinja,*dashboard*,*settings*,*wsgi*,*questions*,*documents*' -m py.test -v --tb=native + - travis_retry coverage run --source=taiga --omit='*tests*,*commands*,*migrations*,*admin*,*.jinja,*dashboard*,*settings*,*wsgi*,*questions*,*documents*' -m py.test -v --tb=native after_success: - coveralls From a283c27a780da10a714b5fdabb55b0c3a65e901e Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 12 Nov 2015 09:54:37 +0100 Subject: [PATCH 25/64] Fixing admin errors and making it usable again --- taiga/projects/admin.py | 63 ++++++++++++++++++----- taiga/projects/attachments/admin.py | 13 ++++- taiga/projects/custom_attributes/admin.py | 46 +++++------------ taiga/projects/issues/admin.py | 6 ++- taiga/projects/likes/admin.py | 1 + taiga/projects/milestones/admin.py | 15 +++++- taiga/projects/notifications/admin.py | 8 +++ taiga/projects/tasks/admin.py | 9 ++-- taiga/projects/userstories/admin.py | 10 ++-- taiga/projects/votes/admin.py | 1 + taiga/projects/wiki/admin.py | 12 +++++ 11 files changed, 125 insertions(+), 59 deletions(-) diff --git a/taiga/projects/admin.py b/taiga/projects/admin.py index 0dee8cde..184fbcf1 100644 --- a/taiga/projects/admin.py +++ b/taiga/projects/admin.py @@ -17,8 +17,8 @@ from django.contrib import admin from taiga.projects.milestones.admin import MilestoneInline -from taiga.projects.notifications.admin import WatchedInline -from taiga.projects.votes.admin import VoteInline +from taiga.projects.notifications.admin import NotifyPolicyInline +from taiga.projects.likes.admin import LikeInline from taiga.users.admin import RoleInline from . import models @@ -26,19 +26,49 @@ from . import models class MembershipAdmin(admin.ModelAdmin): list_display = ['project', 'role', 'user'] list_display_links = list_display - list_filter = ['project', 'role'] + raw_id_fields = ["project"] + def get_object(self, *args, **kwargs): + self.obj = super().get_object(*args, **kwargs) + return self.obj + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if db_field.name in ["user", "invited_by"] and getattr(self, 'obj', None): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.obj.project) + + elif db_field.name in ["role"] and getattr(self, 'obj', None): + kwargs["queryset"] = db_field.related.model.objects.filter( + project=self.obj.project) + + return super().formfield_for_foreignkey(db_field, request, **kwargs) class MembershipInline(admin.TabularInline): model = models.Membership extra = 0 + def get_formset(self, request, obj=None, **kwargs): + # Hack! Hook parent obj just in time to use in formfield_for_manytomany + self.parent_obj = obj + return super(MembershipInline, self).get_formset(request, obj, **kwargs) + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if (db_field.name in ["user", "invited_by"]): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.parent_obj) + + elif (db_field.name in ["role"]): + kwargs["queryset"] = db_field.related.model.objects.filter( + project=self.parent_obj) + + return super().formfield_for_foreignkey(db_field, request, **kwargs) + class ProjectAdmin(admin.ModelAdmin): list_display = ["name", "owner", "created_date", "total_milestones", "total_story_points"] list_display_links = list_display - inlines = [RoleInline, MembershipInline, MilestoneInline, WatchedInline, VoteInline] + inlines = [RoleInline, MembershipInline, MilestoneInline, NotifyPolicyInline, LikeInline] def get_object(self, *args, **kwargs): self.obj = super().get_object(*args, **kwargs) @@ -49,10 +79,16 @@ class ProjectAdmin(admin.ModelAdmin): "default_priority", "default_severity", "default_issue_status", "default_issue_type"]): if getattr(self, 'obj', None): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( project=self.obj) else: - kwargs["queryset"] = db_field.related.parent_model.objects.none() + kwargs["queryset"] = db_field.related.model.objects.none() + + elif (db_field.name in ["owner"] + and getattr(self, 'obj', None)): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.obj.project) + return super().formfield_for_foreignkey(db_field, request, **kwargs) def formfield_for_manytomany(self, db_field, request, **kwargs): @@ -68,13 +104,13 @@ class ProjectAdmin(admin.ModelAdmin): class PointsAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "value"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] class UserStoryStatusAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "is_closed"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] # Tasks common admins @@ -82,7 +118,7 @@ class UserStoryStatusAdmin(admin.ModelAdmin): class TaskStatusAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "is_closed", "color"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] # Issues common admins @@ -90,25 +126,26 @@ class TaskStatusAdmin(admin.ModelAdmin): class SeverityAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "color"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] class PriorityAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "color"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] class IssueTypeAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "color"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] class IssueStatusAdmin(admin.ModelAdmin): list_display = ["project", "order", "name", "is_closed", "color"] list_display_links = ["name"] - list_filter = ["project"] + raw_id_fields = ["project"] + class ProjectTemplateAdmin(admin.ModelAdmin): pass diff --git a/taiga/projects/attachments/admin.py b/taiga/projects/attachments/admin.py index c30b4f52..9f1d5eb3 100644 --- a/taiga/projects/attachments/admin.py +++ b/taiga/projects/attachments/admin.py @@ -23,7 +23,18 @@ from . import models class AttachmentAdmin(admin.ModelAdmin): list_display = ["id", "project", "attached_file", "owner", "content_type", "content_object"] list_display_links = ["id", "attached_file",] - list_filter = ["project", "content_type"] + search_fields = ["id", "attached_file", "project__name", "project__slug"] + raw_id_fields = ["project"] + + def get_object(self, *args, **kwargs): + self.obj = super().get_object(*args, **kwargs) + return self.obj + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if (db_field.name in ["owner"]and getattr(self, 'obj', None)): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.obj.project) + return super().formfield_for_foreignkey(db_field, request, **kwargs) class AttachmentInline(generic.GenericTabularInline): diff --git a/taiga/projects/custom_attributes/admin.py b/taiga/projects/custom_attributes/admin.py index fe0e3c6b..3f67ffaf 100644 --- a/taiga/projects/custom_attributes/admin.py +++ b/taiga/projects/custom_attributes/admin.py @@ -19,14 +19,12 @@ from django.contrib import admin from . import models - -@admin.register(models.UserStoryCustomAttribute) -class UserStoryCustomAttributeAdmin(admin.ModelAdmin): - list_display = ["id", "name", "project", "order"] +class BaseCustomAttributeAdmin: + list_display = ["id", "name", "type", "project", "order"] list_display_links = ["id", "name"] fieldsets = ( (None, { - "fields": ("name", "description", ("project", "order")) + "fields": ("name", "type", "description", ("project", "order")) }), ("Advanced options", { "classes": ("collapse",), @@ -35,37 +33,19 @@ class UserStoryCustomAttributeAdmin(admin.ModelAdmin): ) readonly_fields = ("created_date", "modified_date") search_fields = ["id", "name", "project__name", "project__slug"] + raw_id_fields = ["project"] + + +@admin.register(models.UserStoryCustomAttribute) +class UserStoryCustomAttributeAdmin(BaseCustomAttributeAdmin, admin.ModelAdmin): + pass @admin.register(models.TaskCustomAttribute) -class TaskCustomAttributeAdmin(admin.ModelAdmin): - list_display = ["id", "name", "project", "order"] - list_display_links = ["id", "name"] - fieldsets = ( - (None, { - "fields": ("name", "description", ("project", "order")) - }), - ("Advanced options", { - "classes": ("collapse",), - "fields": (("created_date", "modified_date"),) - }) - ) - readonly_fields = ("created_date", "modified_date") - search_fields = ["id", "name", "project__name", "project__slug"] +class TaskCustomAttributeAdmin(BaseCustomAttributeAdmin, admin.ModelAdmin): + pass @admin.register(models.IssueCustomAttribute) -class IssueCustomAttributeAdmin(admin.ModelAdmin): - list_display = ["id", "name", "project", "order"] - list_display_links = ["id", "name"] - fieldsets = ( - (None, { - "fields": ("name", "description", ("project", "order")) - }), - ("Advanced options", { - "classes": ("collapse",), - "fields": (("created_date", "modified_date"),) - }) - ) - readonly_fields = ("created_date", "modified_date") - search_fields = ["id", "name", "project__name", "project__slug"] +class IssueCustomAttributeAdmin(BaseCustomAttributeAdmin, admin.ModelAdmin): + pass diff --git a/taiga/projects/issues/admin.py b/taiga/projects/issues/admin.py index 7da02b5b..a11f1d21 100644 --- a/taiga/projects/issues/admin.py +++ b/taiga/projects/issues/admin.py @@ -27,6 +27,8 @@ class IssueAdmin(admin.ModelAdmin): list_display = ["project", "milestone", "ref", "subject",] list_display_links = ["ref", "subject",] inlines = [WatchedInline, VoteInline] + raw_id_fields = ["project"] + search_fields = ["subject", "description", "id", "ref"] def get_object(self, *args, **kwargs): self.obj = super().get_object(*args, **kwargs) @@ -35,11 +37,11 @@ class IssueAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if (db_field.name in ["status", "priority", "severity", "type", "milestone"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( project=self.obj.project) elif (db_field.name in ["owner", "assigned_to"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( memberships__project=self.obj.project) return super().formfield_for_foreignkey(db_field, request, **kwargs) diff --git a/taiga/projects/likes/admin.py b/taiga/projects/likes/admin.py index 802eaca4..b48f2385 100644 --- a/taiga/projects/likes/admin.py +++ b/taiga/projects/likes/admin.py @@ -23,3 +23,4 @@ from . import models class LikeInline(GenericTabularInline): model = models.Like extra = 0 + raw_id_fields = ["user"] diff --git a/taiga/projects/milestones/admin.py b/taiga/projects/milestones/admin.py index 378928ce..86676373 100644 --- a/taiga/projects/milestones/admin.py +++ b/taiga/projects/milestones/admin.py @@ -25,14 +25,27 @@ class MilestoneInline(admin.TabularInline): model = models.Milestone extra = 0 + def get_formset(self, request, obj=None, **kwargs): + # Hack! Hook parent obj just in time to use in formfield_for_manytomany + self.parent_obj = obj + return super(MilestoneInline, self).get_formset(request, obj, **kwargs) + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if (db_field.name in ["owner"]): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.parent_obj) + + return super().formfield_for_foreignkey(db_field, request, **kwargs) + class MilestoneAdmin(admin.ModelAdmin): list_display = ["name", "project", "owner", "closed", "estimated_start", "estimated_finish"] list_display_links = list_display - list_filter = ["project"] readonly_fields = ["owner"] inlines = [WatchedInline, VoteInline] + search_fields = ["name", "id"] + raw_id_fields = ["project"] admin.site.register(models.Milestone, MilestoneAdmin) diff --git a/taiga/projects/notifications/admin.py b/taiga/projects/notifications/admin.py index a2278932..4036f787 100644 --- a/taiga/projects/notifications/admin.py +++ b/taiga/projects/notifications/admin.py @@ -16,6 +16,7 @@ from django.contrib import admin from django.contrib.contenttypes.admin import GenericTabularInline +from django.contrib.admin import TabularInline from . import models @@ -23,3 +24,10 @@ from . import models class WatchedInline(GenericTabularInline): model = models.Watched extra = 0 + raw_id_fields = ["project", "user"] + +class NotifyPolicyInline(TabularInline): + model = models.NotifyPolicy + extra = 0 + readonly_fields = ("notify_level",) + raw_id_fields = ["user"] diff --git a/taiga/projects/tasks/admin.py b/taiga/projects/tasks/admin.py index 4c451c17..a9cbd823 100644 --- a/taiga/projects/tasks/admin.py +++ b/taiga/projects/tasks/admin.py @@ -24,10 +24,11 @@ from . import models class TaskAdmin(admin.ModelAdmin): - list_display = ["project", "milestone", "user_story", "ref", "subject",] + list_display = ["project", "milestone", "user_story", "ref", "subject",] list_display_links = ["ref", "subject",] - list_filter = ["project"] inlines = [WatchedInline, VoteInline] + raw_id_fields = ["project"] + search_fields = ["subject", "description", "id", "ref"] def get_object(self, *args, **kwargs): self.obj = super().get_object(*args, **kwargs) @@ -36,11 +37,11 @@ class TaskAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if (db_field.name in ["status", "milestone", "user_story"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( project=self.obj.project) elif (db_field.name in ["owner", "assigned_to"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( memberships__project=self.obj.project) return super().formfield_for_foreignkey(db_field, request, **kwargs) diff --git a/taiga/projects/userstories/admin.py b/taiga/projects/userstories/admin.py index 2887e836..f1772320 100644 --- a/taiga/projects/userstories/admin.py +++ b/taiga/projects/userstories/admin.py @@ -35,28 +35,28 @@ class RolePointsInline(admin.TabularInline): class RolePointsAdmin(admin.ModelAdmin): list_display = ["user_story", "role", "points"] list_display_links = list_display - list_filter = ["role", "user_story__project"] readonly_fields = ["user_story", "role", "points"] class UserStoryAdmin(admin.ModelAdmin): list_display = ["project", "milestone", "ref", "subject",] list_display_links = ["ref", "subject",] - list_filter = ["project"] inlines = [RolePointsInline, WatchedInline, VoteInline] + raw_id_fields = ["project"] + search_fields = ["subject", "description", "id", "ref"] def get_object(self, *args, **kwargs): self.obj = super().get_object(*args, **kwargs) return self.obj def formfield_for_foreignkey(self, db_field, request, **kwargs): - if (db_field.name in ["status", "milestone"] + if (db_field.name in ["status", "milestone", "generated_from_issue"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( project=self.obj.project) elif (db_field.name in ["owner", "assigned_to"] and getattr(self, 'obj', None)): - kwargs["queryset"] = db_field.related.parent_model.objects.filter( + kwargs["queryset"] = db_field.related.model.objects.filter( memberships__project=self.obj.project) return super().formfield_for_foreignkey(db_field, request, **kwargs) diff --git a/taiga/projects/votes/admin.py b/taiga/projects/votes/admin.py index 3ab238aa..d0e0a74e 100644 --- a/taiga/projects/votes/admin.py +++ b/taiga/projects/votes/admin.py @@ -23,3 +23,4 @@ from . import models class VoteInline(GenericTabularInline): model = models.Vote extra = 0 + raw_id_fields = ["user"] diff --git a/taiga/projects/wiki/admin.py b/taiga/projects/wiki/admin.py index ed90f65c..f6ffcf20 100644 --- a/taiga/projects/wiki/admin.py +++ b/taiga/projects/wiki/admin.py @@ -28,11 +28,23 @@ class WikiPageAdmin(admin.ModelAdmin): list_display = ["project", "slug", "owner"] list_display_links = list_display inlines = [WatchedInline, VoteInline] + raw_id_fields = ["project"] + + def get_object(self, *args, **kwargs): + self.obj = super().get_object(*args, **kwargs) + return self.obj + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if (db_field.name in ["owner", "last_modifier"] and getattr(self, 'obj', None)): + kwargs["queryset"] = db_field.related.model.objects.filter( + memberships__project=self.obj.project) + return super().formfield_for_foreignkey(db_field, request, **kwargs) admin.site.register(models.WikiPage, WikiPageAdmin) class WikiLinkAdmin(admin.ModelAdmin): list_display = ["project", "title"] list_display_links = list_display + raw_id_fields = ["project"] admin.site.register(models.WikiLink, WikiLinkAdmin) From 674b83c1a06e0c5ed20a222679d92cbcd65109cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 13 Nov 2015 14:25:54 +0100 Subject: [PATCH 26/64] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1499ed23..373bafac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. ### Misc +- Improve the django admin panel, now it is more usable and all the selector fields works properly. - Lots of small and not so small bugfixes. From ad47f8f0c9329665a233101881d5070e6efd8cba Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 11 Nov 2015 15:35:38 +0100 Subject: [PATCH 27/64] Improving the stats API performance --- taiga/projects/models.py | 64 ------- taiga/projects/services/stats.py | 305 ++++++++++++++++++++----------- tests/integration/test_stats.py | 48 +++-- 3 files changed, 234 insertions(+), 183 deletions(-) diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 1bc8ab4d..d7f77a10 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -271,31 +271,6 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): rp_query = rp_query.exclude(role__id__in=roles.values_list("id", flat=True)) rp_query.delete() - def _get_user_stories_points(self, user_stories): - role_points = [us.role_points.all() for us in user_stories] - flat_role_points = itertools.chain(*role_points) - flat_role_dicts = map(lambda x: {x.role_id: x.points.value if x.points.value else 0}, - flat_role_points) - return dict_sum(*flat_role_dicts) - - def _get_points_increment(self, client_requirement, team_requirement): - last_milestones = self.milestones.order_by('-estimated_finish') - last_milestone = last_milestones[0] if last_milestones else None - if last_milestone: - user_stories = self.user_stories.filter( - created_date__gte=last_milestone.estimated_finish, - client_requirement=client_requirement, - team_requirement=team_requirement - ) - else: - user_stories = self.user_stories.filter( - client_requirement=client_requirement, - team_requirement=team_requirement - ) - user_stories = user_stories.prefetch_related('role_points', 'role_points__points') - return self._get_user_stories_points(user_stories) - - @property def project(self): return self @@ -304,45 +279,6 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): def project(self): return self - @property - def future_team_increment(self): - team_increment = self._get_points_increment(False, True) - shared_increment = {key: value / 2 for key, value in self.future_shared_increment.items()} - return dict_sum(team_increment, shared_increment) - - @property - def future_client_increment(self): - client_increment = self._get_points_increment(True, False) - shared_increment = {key: value / 2 for key, value in self.future_shared_increment.items()} - return dict_sum(client_increment, shared_increment) - - @property - def future_shared_increment(self): - return self._get_points_increment(True, True) - - @property - def closed_points(self): - return self.calculated_points["closed"] - - @property - def defined_points(self): - return self.calculated_points["defined"] - - @property - def assigned_points(self): - return self.calculated_points["assigned"] - - @property - def calculated_points(self): - user_stories = self.user_stories.all().prefetch_related('role_points', 'role_points__points') - closed_user_stories = user_stories.filter(is_closed=True) - assigned_user_stories = user_stories.filter(milestone__isnull=False) - return { - "defined": self._get_user_stories_points(user_stories), - "closed": self._get_user_stories_points(closed_user_stories), - "assigned": self._get_user_stories_points(assigned_user_stories), - } - def _get_q_watchers(self): return Q(notify_policies__project_id=self.id) & ~Q(notify_policies__notify_level=NotifyLevel.none) diff --git a/taiga/projects/services/stats.py b/taiga/projects/services/stats.py index 727db6cf..7f915a31 100644 --- a/taiga/projects/services/stats.py +++ b/taiga/projects/services/stats.py @@ -19,94 +19,11 @@ from django.db.models import Q, Count from django.apps import apps import datetime import copy +import collections from taiga.projects.history.models import HistoryEntry from taiga.projects.userstories.models import RolePoints - -def _get_total_story_points(project): - return (project.total_story_points if project.total_story_points not in [None, 0] else - sum(project.calculated_points["defined"].values())) - -def _get_total_milestones(project): - return (project.total_milestones if project.total_milestones not in [None, 0] else - project.milestones.count()) - -def _get_milestones_stats_for_backlog(project): - """ - Get collection of stats for each millestone of project. - Data returned by this function are used on backlog. - """ - current_evolution = 0 - current_team_increment = 0 - current_client_increment = 0 - - optimal_points_per_sprint = 0 - - total_story_points = _get_total_story_points(project) - total_milestones = _get_total_milestones(project) - - if total_story_points and total_milestones: - optimal_points_per_sprint = total_story_points / total_milestones - - future_team_increment = sum(project.future_team_increment.values()) - future_client_increment = sum(project.future_client_increment.values()) - - milestones = project.milestones.order_by('estimated_start').\ - prefetch_related("user_stories", - "user_stories__role_points", - "user_stories__role_points__points") - - milestones = list(milestones) - milestones_count = len(milestones) - optimal_points = 0 - team_increment = 0 - client_increment = 0 - - for current_milestone in range(0, max(milestones_count, total_milestones)): - optimal_points = (total_story_points - - (optimal_points_per_sprint * current_milestone)) - - evolution = (total_story_points - current_evolution - if current_evolution is not None else None) - - if current_milestone < milestones_count: - ml = milestones[current_milestone] - - milestone_name = ml.name - team_increment = current_team_increment - client_increment = current_client_increment - - current_evolution += sum(ml.closed_points.values()) - current_team_increment += sum(ml.team_increment_points.values()) - current_client_increment += sum(ml.client_increment_points.values()) - - else: - milestone_name = _("Future sprint") - team_increment = current_team_increment + future_team_increment, - client_increment = current_client_increment + future_client_increment, - current_evolution = None - - yield { - 'name': milestone_name, - 'optimal': optimal_points, - 'evolution': evolution, - 'team-increment': team_increment, - 'client-increment': client_increment, - } - - optimal_points -= optimal_points_per_sprint - evolution = (total_story_points - current_evolution - if current_evolution is not None and total_story_points else None) - yield { - 'name': _('Project End'), - 'optimal': optimal_points, - 'evolution': evolution, - 'team-increment': team_increment, - 'client-increment': client_increment, - } - - def _count_status_object(status_obj, counting_storage): if status_obj.id in counting_storage: counting_storage[status_obj.id]['count'] += 1 @@ -218,35 +135,217 @@ def get_stats_for_project_issues(project): return project_issues_stats +def _get_milestones_stats_for_backlog(project, milestones): + """ + Calculates the stats associated to the milestones parameter. + + - project is a Project model instance + We assume this object have also the following numeric attributes: + - _defined_points + - _future_team_increment + - _future_client_increment + + - milestones is a sorted dict of Milestone model instances sorted by estimated_start. + We assume this objects have also the following numeric attributes: + - _closed_points + - _team_increment_points + - _client_increment_points + + The returned result is a list of dicts where each entry contains the following keys: + - name + - optimal + - evolution + - team + - client + """ + current_evolution = 0 + current_team_increment = 0 + current_client_increment = 0 + optimal_points_per_sprint = 0 + optimal_points = 0 + team_increment = 0 + client_increment = 0 + + total_story_points = project.total_story_points\ + if project.total_story_points not in [None, 0] else project._defined_points + + total_milestones = project.total_milestones\ + if project.total_milestones not in [None, 0] else len(milestones) + + if total_story_points and total_milestones: + optimal_points_per_sprint = total_story_points / total_milestones + + milestones_count = len(milestones) + milestones_stats = [] + for current_milestone_pos in range(0, max(milestones_count, total_milestones)): + optimal_points = (total_story_points - + (optimal_points_per_sprint * current_milestone_pos)) + + evolution = (total_story_points - current_evolution + if current_evolution is not None else None) + + if current_milestone_pos < milestones_count: + current_milestone = list(milestones.values())[current_milestone_pos] + milestone_name = current_milestone.name + team_increment = current_team_increment + client_increment = current_client_increment + current_evolution += current_milestone._closed_points + current_team_increment += current_milestone._team_increment_points + current_client_increment += current_milestone._client_increment_points + + else: + milestone_name = _("Future sprint") + team_increment = current_team_increment + project._future_team_increment, + client_increment = current_client_increment + project._future_client_increment, + current_evolution = None + + milestones_stats.append({ + 'name': milestone_name, + 'optimal': optimal_points, + 'evolution': evolution, + 'team-increment': team_increment, + 'client-increment': client_increment, + }) + + optimal_points -= optimal_points_per_sprint + evolution = (total_story_points - current_evolution + if current_evolution is not None and total_story_points else None) + + milestones_stats.append({ + 'name': _('Project End'), + 'optimal': optimal_points, + 'evolution': evolution, + 'team-increment': team_increment, + 'client-increment': client_increment, + }) + + return milestones_stats + + def get_stats_for_project(project): - project = apps.get_model("projects", "Project").objects.\ - prefetch_related("milestones", - "user_stories").\ - get(id=project.id) + # Let's fetch all the estimations related to a project with all the necesary + # related data + role_points = RolePoints.objects.filter( + user_story__project = project, + ).prefetch_related( + "user_story", + "user_story__assigned_to", + "user_story__milestone", + "user_story__status", + "role", + "points") - points = project.calculated_points - closed_points = sum(points["closed"].values()) - closed_points_from_closed_milestones = sum(RolePoints.objects.filter( - Q(user_story__project=project) & Q(user_story__milestone__closed=True) - ).exclude(points__value__isnull=True).values_list("points__value", flat=True)) + # Data inicialization + project._closed_points = 0 + project._closed_points_per_role = {} + project._closed_points_from_closed_milestones = 0 + project._defined_points = 0 + project._defined_points_per_role = {} + project._assigned_points = 0 + project._assigned_points_per_role = {} + project._future_team_increment = 0 + project._future_client_increment = 0 - closed_milestones = project.milestones.filter(closed=True).count() + # The key will be the milestone id and it will be ordered by estimated_start + milestones = collections.OrderedDict() + for milestone in project.milestones.order_by("estimated_start"): + milestone._closed_points = 0 + milestone._team_increment_points = 0 + milestone._client_increment_points = 0 + milestones[milestone.id] = milestone + + def _find_milestone_for_userstory(user_story): + for m in milestones.values(): + if m.estimated_finish > user_story.created_date.date() and\ + m.estimated_start <= user_story.created_date.date(): + + return m + + return None + + def _update_team_increment(milestone, value): + if milestone: + milestones[milestone.id]._team_increment_points += value + else: + project._future_team_increment += value + + def _update_client_increment(milestone, value): + if milestone: + milestones[milestone.id]._client_increment_points += value + else: + project._future_client_increment += value + + # Iterate over all the project estimations and update our stats + for role_point in role_points: + role_id = role_point.role.id + points_value = role_point.points.value + milestone = role_point.user_story.milestone + is_team_requirement = role_point.user_story.team_requirement + is_client_requirement = role_point.user_story.client_requirement + us_milestone = _find_milestone_for_userstory(role_point.user_story) + + # None estimations doesn't affect to project stats + if points_value is None: + continue + + # Total defined points + project._defined_points += points_value + + # Defined points per role + project._defined_points_for_role = project._defined_points_per_role.get(role_id, 0) + project._defined_points_for_role += points_value + project._defined_points_per_role[role_id] = project._defined_points_for_role + + # Closed points + if role_point.user_story.is_closed: + project._closed_points += points_value + closed_points_for_role = project._closed_points_per_role.get(role_id, 0) + closed_points_for_role += points_value + project._closed_points_per_role[role_id] = closed_points_for_role + + if milestone is not None: + milestones[milestone.id]._closed_points += points_value + + if milestone is not None and milestone.closed: + project._closed_points_from_closed_milestones += points_value + + # Assigned to milestone points + if role_point.user_story.milestone is not None: + project._assigned_points += points_value + assigned_points_for_role = project._assigned_points_per_role.get(role_id, 0) + assigned_points_for_role += points_value + project._assigned_points_per_role[role_id] = assigned_points_for_role + + # Extra requirements + if is_team_requirement and is_client_requirement: + _update_team_increment(us_milestone, points_value/2) + _update_client_increment(us_milestone, points_value/2) + + if is_team_requirement and not is_client_requirement: + _update_team_increment(us_milestone, points_value) + + if not is_team_requirement and is_client_requirement: + _update_client_increment(us_milestone, points_value) + + # Speed calculations speed = 0 - + closed_milestones = len([m for m in milestones.values() if m.closed]) if closed_milestones != 0: - speed = closed_points_from_closed_milestones / closed_milestones + speed = project._closed_points_from_closed_milestones / closed_milestones + + milestones_stats = _get_milestones_stats_for_backlog(project, milestones) project_stats = { 'name': project.name, 'total_milestones': project.total_milestones, 'total_points': project.total_story_points, - 'closed_points': closed_points, - 'closed_points_per_role': points["closed"], - 'defined_points': sum(points["defined"].values()), - 'defined_points_per_role': points["defined"], - 'assigned_points': sum(points["assigned"].values()), - 'assigned_points_per_role': points["assigned"], - 'milestones': _get_milestones_stats_for_backlog(project), + 'closed_points': project._closed_points, + 'closed_points_per_role': project._closed_points_per_role, + 'defined_points': project._defined_points, + 'defined_points_per_role': project._defined_points_per_role, + 'assigned_points': project._assigned_points, + 'assigned_points_per_role': project._assigned_points_per_role, + 'milestones': milestones_stats, 'speed': speed, } return project_stats diff --git a/tests/integration/test_stats.py b/tests/integration/test_stats.py index 11038330..df68970b 100644 --- a/tests/integration/test_stats.py +++ b/tests/integration/test_stats.py @@ -86,36 +86,46 @@ def data(): def test_project_defined_points(client, data): - assert data.project.defined_points == {data.role1.pk: 63} + project_stats = get_stats_for_project(data.project) + assert project_stats["defined_points_per_role"] == {data.role1.pk: 63} data.role_points1.role = data.role2 data.role_points1.save() - assert data.project.defined_points == {data.role1.pk: 62, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["defined_points_per_role"] == {data.role1.pk: 62, data.role2.pk: 1} def test_project_closed_points(client, data): - assert data.project.closed_points == {} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {} data.role_points1.role = data.role2 data.role_points1.save() - assert data.project.closed_points == {} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {} data.user_story1.is_closed = True data.user_story1.save() - assert data.project.closed_points == {data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role2.pk: 1} data.user_story2.is_closed = True data.user_story2.save() - assert data.project.closed_points == {data.role1.pk: 2, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role1.pk: 2, data.role2.pk: 1} data.user_story3.is_closed = True data.user_story3.save() - assert data.project.closed_points == {data.role1.pk: 6, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role1.pk: 6, data.role2.pk: 1} data.user_story4.is_closed = True data.user_story4.save() - assert data.project.closed_points == {data.role1.pk: 14, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role1.pk: 14, data.role2.pk: 1} data.user_story5.is_closed = True data.user_story5.save() - assert data.project.closed_points == {data.role1.pk: 30, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role1.pk: 30, data.role2.pk: 1} data.user_story6.is_closed = True data.user_story6.save() - assert data.project.closed_points == {data.role1.pk: 62, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points_per_role"] == {data.role1.pk: 62, data.role2.pk: 1} project_stats = get_stats_for_project(data.project) assert project_stats["closed_points"] == 63 @@ -123,19 +133,25 @@ def test_project_closed_points(client, data): def test_project_assigned_points(client, data): - assert data.project.assigned_points == {data.role1.pk: 48} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 48} data.role_points1.role = data.role2 data.role_points1.save() - assert data.project.assigned_points == {data.role1.pk: 48} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 48} data.user_story1.milestone = data.milestone data.user_story1.save() - assert data.project.assigned_points == {data.role1.pk: 48, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 48, data.role2.pk: 1} data.user_story2.milestone = data.milestone data.user_story2.save() - assert data.project.assigned_points == {data.role1.pk: 50, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 50, data.role2.pk: 1} data.user_story3.milestone = data.milestone data.user_story3.save() - assert data.project.assigned_points == {data.role1.pk: 54, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 54, data.role2.pk: 1} data.user_story4.milestone = data.milestone data.user_story4.save() - assert data.project.assigned_points == {data.role1.pk: 62, data.role2.pk: 1} + project_stats = get_stats_for_project(data.project) + assert project_stats["assigned_points_per_role"] == {data.role1.pk: 62, data.role2.pk: 1} From b041f2cfba669fd6b717398b2f92bf0e57079221 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 16 Nov 2015 17:37:15 +0100 Subject: [PATCH 28/64] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 373bafac..b8e1fc20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Misc - Improve the django admin panel, now it is more usable and all the selector fields works properly. +- [API] Performance improvements for project stats. - Lots of small and not so small bugfixes. From a42711476216b5fea22ea4bfce161db2abc442fc Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 16 Nov 2015 08:20:57 +0100 Subject: [PATCH 29/64] Enabling lowercase for username or email when allowed --- taiga/users/api.py | 10 +---- taiga/users/services.py | 26 ++++++++---- tests/integration/test_auth_api.py | 64 ++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 15 deletions(-) diff --git a/taiga/users/api.py b/taiga/users/api.py index d72d021d..20031395 100644 --- a/taiga/users/api.py +++ b/taiga/users/api.py @@ -35,7 +35,7 @@ from taiga.base.api.utils import get_object_or_404 from taiga.base.filters import MembersFilterBackend from taiga.base.mails import mail_builder from taiga.projects.votes import services as votes_service - +from taiga.users.services import get_user_by_username_or_email from easy_thumbnails.source_generators import pil_image from . import models @@ -145,13 +145,7 @@ class UsersViewSet(ModelCrudViewSet): if not username_or_email: raise exc.WrongArguments(_("Invalid username or email")) - try: - queryset = models.User.objects.all() - user = queryset.get(Q(username=username_or_email) | - Q(email=username_or_email)) - except models.User.DoesNotExist: - raise exc.WrongArguments(_("Invalid username or email")) - + user = get_user_by_username_or_email(username_or_email) user.token = str(uuid.uuid1()) user.save(update_fields=["token"]) diff --git a/taiga/users/services.py b/taiga/users/services.py index 3ef4672d..5dd8bc0f 100644 --- a/taiga/users/services.py +++ b/taiga/users/services.py @@ -37,6 +37,24 @@ from .gravatar import get_gravatar_url from django.conf import settings + +def get_user_by_username_or_email(username_or_email): + user_model = apps.get_model("users", "User") + qs = user_model.objects.filter(Q(username__iexact=username_or_email) | + Q(email__iexact=username_or_email)) + + if len(qs) > 1: + qs = qs.filter(Q(username=username_or_email) | + Q(email=username_or_email)) + + if len(qs) == 0: + raise exc.WrongArguments(_("Username or password does not matches user.")) + + user = qs[0] + return user + + + def get_and_validate_user(*, username:str, password:str) -> bool: """ Check if user with username/email exists and specified @@ -46,13 +64,7 @@ def get_and_validate_user(*, username:str, password:str) -> bool: exception is raised. """ - user_model = apps.get_model("users", "User") - qs = user_model.objects.filter(Q(username=username) | - Q(email=username)) - if len(qs) == 0: - raise exc.WrongArguments(_("Username or password does not matches user.")) - - user = qs[0] + user = get_user_by_username_or_email(username) if not user.check_password(password): raise exc.WrongArguments(_("Username or password does not matches user.")) diff --git a/tests/integration/test_auth_api.py b/tests/integration/test_auth_api.py index e7a7805a..02df17fa 100644 --- a/tests/integration/test_auth_api.py +++ b/tests/integration/test_auth_api.py @@ -106,3 +106,67 @@ def test_respond_400_if_username_or_email_is_duplicate(client, settings, registe register_form["email"] = "ff@dd.com" response = client.post(reverse("auth-register"), register_form) assert response.status_code == 400 + + +def test_auth_uppercase_ignore(client, settings): + settings.PUBLIC_REGISTER_ENABLED = True + + register_form = {"username": "Username", + "password": "password", + "full_name": "fname", + "email": "User@email.com", + "type": "public"} + response = client.post(reverse("auth-register"), register_form) + + #Only exists one user with the same lowercase version of username/password + login_form = {"type": "normal", + "username": "Username", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 200 + + login_form = {"type": "normal", + "username": "User@email.com", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 200 + + #Now we have two users with the same lowercase version of username/password + # 1.- The capitalized version works + register_form = {"username": "username", + "password": "password", + "full_name": "fname", + "email": "user@email.com", + "type": "public"} + response = client.post(reverse("auth-register"), register_form) + + login_form = {"type": "normal", + "username": "Username", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 200 + + login_form = {"type": "normal", + "username": "User@email.com", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 200 + + # 2.- If we capitalize a new version it doesn't + login_form = {"type": "normal", + "username": "uSername", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 400 + + login_form = {"type": "normal", + "username": "uSer@email.com", + "password": "password"} + + response = client.post(reverse("auth-list"), login_form) + assert response.status_code == 400 From 9d7adea9e28a18a50a92e63d2b4620490964185e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 17 Nov 2015 16:57:24 +0100 Subject: [PATCH 30/64] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8e1fc20..ab886bcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. ### Misc +- Improve login and forgot password: allow username or email case-insensitive if the query only + match with one user. - Improve the django admin panel, now it is more usable and all the selector fields works properly. - [API] Performance improvements for project stats. - Lots of small and not so small bugfixes. From cf717055ac5cb379e3ac45e4ed52abacd98e67ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 6 Nov 2015 09:11:49 +0100 Subject: [PATCH 31/64] Fix TypeErrors: sequence item expected str, None found (ex: ','.join([None, 'a', 'b'])) --- taiga/projects/history/templatetags/functions.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/taiga/projects/history/templatetags/functions.py b/taiga/projects/history/templatetags/functions.py index b5118c3a..3c3ce143 100644 --- a/taiga/projects/history/templatetags/functions.py +++ b/taiga/projects/history/templatetags/functions.py @@ -40,4 +40,12 @@ def verbose_name(obj_class, field_name): @library.global_function def lists_diff(list1, list2): - return (list(set(list1) - set(list2))) + """ + Get the difference of two list and remove None values. + + >>> list1 = ["a", None, "b", "c"] + >>> list2 = [None, "b", "d", "e"] + >>> list(filter(None.__ne__, set(list1) - set(list2))) + ['c', 'a'] + """ + return list(filter(None.__ne__, set(list1) - set(list2))) From b3b18fa49f5ae40734671b18dfb7cc7b7cb423b9 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 17 Nov 2015 10:23:46 +0100 Subject: [PATCH 32/64] Adding card thumbnail to attachments --- CHANGELOG.md | 1 + settings/common.py | 3 ++ taiga/projects/attachments/serializers.py | 20 ++++++------- taiga/projects/attachments/services.py | 36 +++++++++++++++++++++++ taiga/projects/history/freeze_impl.py | 11 ++----- tests/integration/test_users.py | 8 ++--- 6 files changed, 56 insertions(+), 23 deletions(-) create mode 100644 taiga/projects/attachments/services.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b8e1fc20..12c08f45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. +- [Attachment] Generate 'card-image' size (300x200) thumbnails for attached image files. ### Misc - Improve the django admin panel, now it is more usable and all the selector fields works properly. diff --git a/settings/common.py b/settings/common.py index 355a6597..e1500ce8 100644 --- a/settings/common.py +++ b/settings/common.py @@ -448,12 +448,15 @@ SOUTH_MIGRATION_MODULES = { DEFAULT_AVATAR_SIZE = 80 # 80x80 pixels DEFAULT_BIG_AVATAR_SIZE = 300 # 300x300 pixels DEFAULT_TIMELINE_IMAGE_SIZE = 640 # 640x??? pixels +DEFAUL_CARD_IMAGE_WIDTH = 300 # 300 pixels +DEFAUL_CARD_IMAGE_HEIGHT = 200 # 200 pixels THUMBNAIL_ALIASES = { '': { 'avatar': {'size': (DEFAULT_AVATAR_SIZE, DEFAULT_AVATAR_SIZE), 'crop': True}, 'big-avatar': {'size': (DEFAULT_BIG_AVATAR_SIZE, DEFAULT_BIG_AVATAR_SIZE), 'crop': True}, 'timeline-image': {'size': (DEFAULT_TIMELINE_IMAGE_SIZE, 0), 'crop': True}, + 'card-image': {'size': (DEFAUL_CARD_IMAGE_WIDTH, DEFAUL_CARD_IMAGE_HEIGHT), 'crop': True}, }, } diff --git a/taiga/projects/attachments/serializers.py b/taiga/projects/attachments/serializers.py index 549acabd..42dc30d2 100644 --- a/taiga/projects/attachments/serializers.py +++ b/taiga/projects/attachments/serializers.py @@ -14,28 +14,26 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from os import path -import hashlib - -from django.conf import settings - from taiga.base.api import serializers -from taiga.base.utils.urls import reverse - +from . import services from . import models class AttachmentSerializer(serializers.ModelSerializer): url = serializers.SerializerMethodField("get_url") + thumbnail_card_url = serializers.SerializerMethodField("get_thumbnail_card_url") attached_file = serializers.FileField(required=True) class Meta: model = models.Attachment - fields = ("id", "project", "owner", "name", "attached_file", "size", "url", - "description", "is_deprecated", "created_date", "modified_date", - "object_id", "order", "sha1") + fields = ("id", "project", "owner", "name", "attached_file", "size", + "url", "thumbnail_card_url", "description", "is_deprecated", + "created_date", "modified_date", "object_id", "order", "sha1") read_only_fields = ("owner", "created_date", "modified_date", "sha1") def get_url(self, obj): - return obj.attached_file.url \ No newline at end of file + return obj.attached_file.url + + def get_thumbnail_card_url(self, obj): + return services.get_card_image_thumbnailer_url(obj) diff --git a/taiga/projects/attachments/services.py b/taiga/projects/attachments/services.py new file mode 100644 index 00000000..6dc70160 --- /dev/null +++ b/taiga/projects/attachments/services.py @@ -0,0 +1,36 @@ +# Copyright (C) 2014-2015 Taiga Agile LLC +# 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 taiga.base.utils.urls import get_absolute_url + +from easy_thumbnails.files import get_thumbnailer +from easy_thumbnails.exceptions import InvalidImageFormatError + + +def _get_attachment_thumbnailer_url(attachment, thumbnailer_size): + try: + thumb_url = get_thumbnailer(attachment.attached_file)[thumbnailer_size].url + thumb_url = get_absolute_url(thumb_url) + except InvalidImageFormatError: + thumb_url = None + + return thumb_url + + +def get_timeline_image_thumbnailer_url(attachment): + return _get_attachment_thumbnailer_url(attachment, "timeline-image") + + +def get_card_image_thumbnailer_url(attachment): + return _get_attachment_thumbnailer_url(attachment, "card-image") diff --git a/taiga/projects/history/freeze_impl.py b/taiga/projects/history/freeze_impl.py index a51d3011..6e327b52 100644 --- a/taiga/projects/history/freeze_impl.py +++ b/taiga/projects/history/freeze_impl.py @@ -21,14 +21,13 @@ from django.apps import apps from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from easy_thumbnails.files import get_thumbnailer -from easy_thumbnails.exceptions import InvalidImageFormatError - from taiga.base.utils.urls import get_absolute_url from taiga.base.utils.iterators import as_tuple from taiga.base.utils.iterators import as_dict from taiga.mdrender.service import render as mdrender +from taiga.projects.attachments.services import get_timeline_image_thumbnailer_url + import os #################### @@ -178,11 +177,7 @@ def _generic_extract(obj:object, fields:list, default=None) -> dict: @as_tuple def extract_attachments(obj) -> list: for attach in obj.attachments.all(): - try: - thumb_url = get_thumbnailer(attach.attached_file)['timeline-image'].url - thumb_url = get_absolute_url(thumb_url) - except InvalidImageFormatError as e: - thumb_url = None + thumb_url = get_timeline_image_thumbnailer_url(attach) yield {"id": attach.id, "filename": os.path.basename(attach.attached_file.name), diff --git a/tests/integration/test_users.py b/tests/integration/test_users.py index 3b435f0a..0410b579 100644 --- a/tests/integration/test_users.py +++ b/tests/integration/test_users.py @@ -216,7 +216,7 @@ def test_change_avatar_removes_the_old_one(client): thumbnailer = get_thumbnailer(user.photo) original_photo_paths = [user.photo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] - assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True] + assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True, True] client.login(user) avatar.write(DUMMY_BMP_DATA) @@ -225,7 +225,7 @@ def test_change_avatar_removes_the_old_one(client): response = client.post(url, post_data) assert response.status_code == 200 - assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False] + assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False, False] def test_remove_avatar(client): @@ -242,13 +242,13 @@ def test_remove_avatar(client): thumbnailer = get_thumbnailer(user.photo) original_photo_paths = [user.photo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] - assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True] + assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True, True] client.login(user) response = client.post(url) assert response.status_code == 200 - assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False] + assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False, False] def test_list_contacts_private_projects(client): From 8c3b3d640f9144996e04cbfeab2ffde98f0a6c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 18 Nov 2015 16:56:32 +0100 Subject: [PATCH 33/64] Fix sample_data command --- taiga/projects/management/commands/sample_data.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/taiga/projects/management/commands/sample_data.py b/taiga/projects/management/commands/sample_data.py index 8cc587a0..7d18b9f0 100644 --- a/taiga/projects/management/commands/sample_data.py +++ b/taiga/projects/management/commands/sample_data.py @@ -30,6 +30,7 @@ from taiga.permissions.permissions import ANON_PERMISSIONS from taiga.projects.models import * from taiga.projects.milestones.models import * from taiga.projects.notifications.choices import NotifyLevel +from taiga.projects.services.stats import get_stats_for_project from taiga.projects.userstories.models import * from taiga.projects.tasks.models import * @@ -220,8 +221,8 @@ class Command(BaseCommand): wiki_page = self.create_wiki(project, "home") # Set a value to total_story_points to show the deadline in the backlog - defined_points = sum(project.defined_points.values()) - project.total_story_points = int(defined_points * self.sd.int(5,12) / 10) + get_stats_for_project(project) + project.total_story_points = int(project._defined_points * self.sd.int(5,12) / 10) project.save() self.create_likes(project) From cd45aa5cbf0a6d59080e7932cd5a3d6e01431ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 18 Nov 2015 17:33:45 +0100 Subject: [PATCH 34/64] Fix some imports mistakes --- taiga/base/api/permissions.py | 2 ++ taiga/base/filters.py | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/taiga/base/api/permissions.py b/taiga/base/api/permissions.py index 54e3be02..d9e052fd 100644 --- a/taiga/base/api/permissions.py +++ b/taiga/base/api/permissions.py @@ -16,6 +16,8 @@ import abc +from functools import reduce + from taiga.base.utils import sequence as sq from taiga.permissions.service import user_has_perm, is_project_owner from django.apps import apps diff --git a/taiga/base/filters.py b/taiga/base/filters.py index a6cf64e3..2c139df1 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -13,8 +13,6 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import operator -from functools import reduce import logging from django.apps import apps From cff78589dee2a0fde363a85867dd0245a4879b21 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 19 Nov 2015 07:47:58 +0100 Subject: [PATCH 35/64] Fixing sample data --- taiga/projects/management/commands/sample_data.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/taiga/projects/management/commands/sample_data.py b/taiga/projects/management/commands/sample_data.py index 7d18b9f0..ae72c3e4 100644 --- a/taiga/projects/management/commands/sample_data.py +++ b/taiga/projects/management/commands/sample_data.py @@ -43,6 +43,7 @@ from taiga.projects.history.services import take_snapshot from taiga.projects.likes.services import add_like from taiga.projects.votes.services import add_vote from taiga.events.apps import disconnect_events_signals +from taiga.projects.services.stats import get_stats_for_project ATTACHMENT_SAMPLE_DATA = [ @@ -221,8 +222,9 @@ class Command(BaseCommand): wiki_page = self.create_wiki(project, "home") # Set a value to total_story_points to show the deadline in the backlog - get_stats_for_project(project) - project.total_story_points = int(project._defined_points * self.sd.int(5,12) / 10) + project_stats = get_stats_for_project(project) + defined_points = project_stats["defined_points"] + project.total_story_points = int(defined_points * self.sd.int(5,12) / 10) project.save() self.create_likes(project) @@ -500,4 +502,3 @@ class Command(BaseCommand): obj.add_watcher(user) else: obj.add_watcher(user, notify_level) - From 3ba759e5d166f65839021aa0b30da156dbc49add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 25 Nov 2015 17:13:35 +0100 Subject: [PATCH 36/64] Remove duplicate code --- taiga/projects/models.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/taiga/projects/models.py b/taiga/projects/models.py index d7f77a10..1d96dd75 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -275,10 +275,6 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): def project(self): return self - @property - def project(self): - return self - def _get_q_watchers(self): return Q(notify_policies__project_id=self.id) & ~Q(notify_policies__notify_level=NotifyLevel.none) From fd12f849697402ecf23797acd9fd1d084ff505cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Thu, 26 Nov 2015 18:47:25 +0100 Subject: [PATCH 37/64] Task #3538: Add tribe_gig PickledObjectField attribute to UserStory model --- CHANGELOG.md | 1 + taiga/base/fields.py | 13 +++++++ taiga/projects/api.py | 34 +++++++++---------- taiga/projects/history/freeze_impl.py | 1 + .../emails/includes/fields_diff-html.jinja | 3 +- .../emails/includes/fields_diff-text.jinja | 3 +- .../migrations/0011_userstory_tribe_gig.py | 20 +++++++++++ taiga/projects/userstories/models.py | 5 +++ taiga/projects/userstories/serializers.py | 5 ++- tests/integration/test_userstories.py | 21 ++++++++++++ 10 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 taiga/projects/userstories/migrations/0011_userstory_tribe_gig.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6df31f60..a16bdd9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Improve login and forgot password: allow username or email case-insensitive if the query only match with one user. - Improve the django admin panel, now it is more usable and all the selector fields works properly. +- [API] Add tribe_gig field to user stories (improve integration between Taiga and Taiga Tribe). - [API] Performance improvements for project stats. - Lots of small and not so small bugfixes. diff --git a/taiga/base/fields.py b/taiga/base/fields.py index 0c5d96aa..28c04a11 100644 --- a/taiga/base/fields.py +++ b/taiga/base/fields.py @@ -84,6 +84,19 @@ class PgArrayField(serializers.WritableField): return data +class PickledObjectField(serializers.WritableField): + """ + PickledObjectField objects serializer. + """ + widget = widgets.Textarea + + def to_native(self, obj): + return obj + + def from_native(self, data): + return data + + class TagsField(serializers.WritableField): """ Pickle objects serializer. diff --git a/taiga/projects/api.py b/taiga/projects/api.py index ba49b1a1..fa473d50 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -76,6 +76,23 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) return qs + def get_serializer_class(self): + if self.action == "list": + return self.list_serializer_class + elif self.action == "create": + return self.serializer_class + + if self.action == "by_slug": + slug = self.request.QUERY_PARAMS.get("slug", None) + project = get_object_or_404(models.Project, slug=slug) + else: + project = self.get_object() + + if permissions_service.is_project_owner(self.request.user, project): + return self.admin_serializer_class + + return self.serializer_class + @detail_route(methods=["POST"]) def watch(self, request, pk=None): project = self.get_object() @@ -105,23 +122,6 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) services.update_projects_order_in_bulk(data, "user_order", request.user) return response.NoContent(data=None) - def get_serializer_class(self): - if self.action == "list": - return self.list_serializer_class - elif self.action == "create": - return self.serializer_class - - if self.action == "by_slug": - slug = self.request.QUERY_PARAMS.get("slug", None) - project = get_object_or_404(models.Project, slug=slug) - else: - project = self.get_object() - - if permissions_service.is_project_owner(self.request.user, project): - return self.admin_serializer_class - - return self.serializer_class - @list_route(methods=["GET"]) def by_slug(self, request): slug = request.QUERY_PARAMS.get("slug", None) diff --git a/taiga/projects/history/freeze_impl.py b/taiga/projects/history/freeze_impl.py index 6e327b52..6a551304 100644 --- a/taiga/projects/history/freeze_impl.py +++ b/taiga/projects/history/freeze_impl.py @@ -286,6 +286,7 @@ def userstory_freezer(us) -> dict: "blocked_note": us.blocked_note, "blocked_note_html": mdrender(us.project, us.blocked_note), "custom_attributes": extract_user_story_custom_attributes(us), + "tribe_gig": us.tribe_gig, } return snapshot diff --git a/taiga/projects/history/templates/emails/includes/fields_diff-html.jinja b/taiga/projects/history/templates/emails/includes/fields_diff-html.jinja index 4c99f755..eadca5c3 100644 --- a/taiga/projects/history/templates/emails/includes/fields_diff-html.jinja +++ b/taiga/projects/history/templates/emails/includes/fields_diff-html.jinja @@ -9,7 +9,8 @@ "kanban_order", "taskboard_order", "us_order", - "custom_attributes" + "custom_attributes", + "tribe_gig", ] %} {% for field_name, values in changed_fields.items() %} diff --git a/taiga/projects/history/templates/emails/includes/fields_diff-text.jinja b/taiga/projects/history/templates/emails/includes/fields_diff-text.jinja index 5ecbf496..ff0a1b0d 100644 --- a/taiga/projects/history/templates/emails/includes/fields_diff-text.jinja +++ b/taiga/projects/history/templates/emails/includes/fields_diff-text.jinja @@ -9,7 +9,8 @@ "us_order", "blocked_note_diff", "blocked_note_html", - "custom_attributes" + "custom_attributes", + "tribe_gig", ] %} {% for field_name, values in changed_fields.items() %} {% if field_name not in excluded_fields %} diff --git a/taiga/projects/userstories/migrations/0011_userstory_tribe_gig.py b/taiga/projects/userstories/migrations/0011_userstory_tribe_gig.py new file mode 100644 index 00000000..af85e462 --- /dev/null +++ b/taiga/projects/userstories/migrations/0011_userstory_tribe_gig.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import picklefield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('userstories', '0010_remove_userstory_watchers'), + ] + + operations = [ + migrations.AddField( + model_name='userstory', + name='tribe_gig', + field=picklefield.fields.PickledObjectField(editable=False, null=True, default=None, verbose_name='taiga tribe gig', blank=True), + ), + ] diff --git a/taiga/projects/userstories/models.py b/taiga/projects/userstories/models.py index 2b29a275..6b49654e 100644 --- a/taiga/projects/userstories/models.py +++ b/taiga/projects/userstories/models.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from djorm_pgarray.fields import TextArrayField +from picklefield.fields import PickledObjectField from taiga.base.tags import TaggedMixin from taiga.projects.occ import OCCModelMixin @@ -101,6 +102,10 @@ class UserStory(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, mod related_name="generated_user_stories", verbose_name=_("generated from issue")) external_reference = TextArrayField(default=None, verbose_name=_("external reference")) + + tribe_gig = PickledObjectField(null=True, blank=True, default=None, + verbose_name="taiga tribe gig") + _importing = None class Meta: diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index c3f93d67..98cc2bb4 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -17,6 +17,7 @@ from django.apps import apps from taiga.base.api import serializers from taiga.base.fields import TagsField +from taiga.base.fields import PickledObjectField from taiga.base.fields import PgArrayField from taiga.base.neighbors import NeighborsSerializerMixin from taiga.base.utils import json @@ -45,7 +46,8 @@ class RolePointsField(serializers.WritableField): return json.loads(obj) -class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): +class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, + serializers.ModelSerializer): tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) points = RolePointsField(source="role_points", required=False) @@ -59,6 +61,7 @@ class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, Editab status_extra_info = BasicUserStoryStatusSerializer(source="status", required=False, read_only=True) assigned_to_extra_info = UserBasicInfoSerializer(source="assigned_to", required=False, read_only=True) owner_extra_info = UserBasicInfoSerializer(source="owner", required=False, read_only=True) + tribe_gig = PickledObjectField(required=False) class Meta: model = models.UserStory diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 4ddaece0..8502c4ca 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -514,3 +514,24 @@ def test_update_userstory_remove_watchers(client): assert response.data["watchers"] == [] watcher_ids = list(us.get_watchers().values_list("id", flat=True)) assert watcher_ids == [] + + +def test_update_userstory_update_tribe_gig(client): + project = f.ProjectFactory.create() + us = f.UserStoryFactory.create(project=project, status__project=project, milestone__project=project) + f.MembershipFactory.create(project=us.project, user=us.owner, is_owner=True) + + url = reverse("userstories-detail", kwargs={"pk": us.pk}) + data = { + "tribe_gig": { + "id": 2, + "title": "This is a gig test title" + }, + "version":1 + } + + client.login(user=us.owner) + response = client.json.patch(url, json.dumps(data)) + + assert response.status_code == 200 + assert response.data["tribe_gig"] == data["tribe_gig"] From 45f20b6e64add029e8b44c88eef850fca61f85a3 Mon Sep 17 00:00:00 2001 From: Allister Antosik Date: Wed, 25 Nov 2015 13:48:46 +0000 Subject: [PATCH 38/64] Protected US CSV export assignment against undefined property --- AUTHORS.rst | 1 + taiga/projects/userstories/services.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 7242d6b1..54224670 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -15,6 +15,7 @@ people who have submitted patches, reported bugs, added translations, helped answer newbie questions, and generally made taiga that much better: - Alejandro Gómez +- Allister Antosik - Alonso Torres - Andrea Stagi - Andrés Moya diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index d1e54394..bb05ae29 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -153,8 +153,8 @@ def userstories_to_csv(project,queryset): "subject": us.subject, "description": us.description, "milestone": us.milestone.name if us.milestone else None, - "owner": us.owner.username, - "owner_full_name": us.owner.get_full_name(), + "owner": us.owner.username if us.owner else None, + "owner_full_name": us.owner.get_full_name() if us.owner else None, "assigned_to": us.assigned_to.username if us.assigned_to else None, "assigned_to_full_name": us.assigned_to.get_full_name() if us.assigned_to else None, "status": us.status.name, From 3df824fad5b9c52a45ba5af774b4c672b14c3c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 1 Dec 2015 21:01:52 +0100 Subject: [PATCH 39/64] Protected issue and task CSV export if owner in None --- taiga/projects/issues/services.py | 4 ++-- taiga/projects/tasks/services.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index d646f30d..8f8b4a06 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -98,8 +98,8 @@ def issues_to_csv(project, queryset): "subject": issue.subject, "description": issue.description, "milestone": issue.milestone.name if issue.milestone else None, - "owner": issue.owner.username, - "owner_full_name": issue.owner.get_full_name(), + "owner": issue.owner.username if issue.owner else None, + "owner_full_name": issue.owner.get_full_name() if issue.owner else None, "assigned_to": issue.assigned_to.username if issue.assigned_to else None, "assigned_to_full_name": issue.assigned_to.get_full_name() if issue.assigned_to else None, "status": issue.status.name, diff --git a/taiga/projects/tasks/services.py b/taiga/projects/tasks/services.py index 46cbedfd..9e47eb5e 100644 --- a/taiga/projects/tasks/services.py +++ b/taiga/projects/tasks/services.py @@ -110,8 +110,8 @@ def tasks_to_csv(project, queryset): "description": task.description, "user_story": task.user_story.ref if task.user_story else None, "milestone": task.milestone.name if task.milestone else None, - "owner": task.owner.username, - "owner_full_name": task.owner.get_full_name(), + "owner": task.owner.username if task.owner else None, + "owner_full_name": task.owner.get_full_name() if task.owner else None, "assigned_to": task.assigned_to.username if task.assigned_to else None, "assigned_to_full_name": task.assigned_to.get_full_name() if task.assigned_to else None, "status": task.status.name, From 325e3060bebd451f7c9d1f29adb9afdfc829c3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 2 Dec 2015 10:20:07 +0100 Subject: [PATCH 40/64] Remove deprecated documentation --- doc/.gitignore | 1 - doc/Makefile | 153 ------- doc/source/_templates/layout.html | 39 -- doc/source/_templates/sidebarintro.html | 9 - doc/source/_templates/sidebarlogo.html | 5 - doc/source/_theme/celery/static/celery.css_t | 394 ------------------- doc/source/_theme/celery/theme.conf | 5 - doc/source/coding_rules.rst | 57 --- doc/source/conf.py | 255 ------------ doc/source/index.rst | 43 -- doc/source/overview.rst | 78 ---- doc/source/settings.rst | 22 -- 12 files changed, 1061 deletions(-) delete mode 100755 doc/.gitignore delete mode 100755 doc/Makefile delete mode 100755 doc/source/_templates/layout.html delete mode 100755 doc/source/_templates/sidebarintro.html delete mode 100755 doc/source/_templates/sidebarlogo.html delete mode 100755 doc/source/_theme/celery/static/celery.css_t delete mode 100755 doc/source/_theme/celery/theme.conf delete mode 100644 doc/source/coding_rules.rst delete mode 100755 doc/source/conf.py delete mode 100755 doc/source/index.rst delete mode 100755 doc/source/overview.rst delete mode 100755 doc/source/settings.rst diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100755 index 378eac25..00000000 --- a/doc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100755 index d7e64f5f..00000000 --- a/doc/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Green-Mine.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Green-Mine.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Green-Mine" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Green-Mine" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/source/_templates/layout.html b/doc/source/_templates/layout.html deleted file mode 100755 index 276e8956..00000000 --- a/doc/source/_templates/layout.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "!layout.html" %} - -{% block body %} -

- - {% if version == "0.7" or version == "0.8" %} -

- This document is for Celery's development version, which can be - significantly different from previous releases. Get old docs here: - - 2.5. -

- {% else %} -

- This document describes stdnet {{ version }}. For development docs, - go here. -

- {% endif %} - -
- {{ body }} -{% endblock %} - -{% block footer %} -{{ super() }} - -{% endblock %} \ No newline at end of file diff --git a/doc/source/_templates/sidebarintro.html b/doc/source/_templates/sidebarintro.html deleted file mode 100755 index f4cdf0fe..00000000 --- a/doc/source/_templates/sidebarintro.html +++ /dev/null @@ -1,9 +0,0 @@ -

Green-Mine

-

- Green-Mine is a project managment web application - build on top of django (1.4). -

-

Useful Links

- diff --git a/doc/source/_templates/sidebarlogo.html b/doc/source/_templates/sidebarlogo.html deleted file mode 100755 index 77a3eb09..00000000 --- a/doc/source/_templates/sidebarlogo.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/doc/source/_theme/celery/static/celery.css_t b/doc/source/_theme/celery/static/celery.css_t deleted file mode 100755 index 4151fe6b..00000000 --- a/doc/source/_theme/celery/static/celery.css_t +++ /dev/null @@ -1,394 +0,0 @@ -/* - * celery.css_t - * ~~~~~~~~~~~~ - * - * :copyright: Copyright 2010 by Armin Ronacher. - * :license: BSD, see LICENSE for details. - */ - -{% set page_width = 940 %} -{% set sidebar_width = 220 %} -{% set body_font_stack = 'Optima, Segoe, "Segoe UI", Candara, Calibri, Arial, sans-serif' %} -{% set headline_font_stack = 'Futura, "Trebuchet MS", Arial, sans-serif' %} -{% set code_font_stack = "'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace" %} - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: {{ body_font_stack }}; - font-size: 17px; - background-color: white; - color: #000; - margin: 30px 0 0 0; - padding: 0; -} - -div.document { - width: {{ page_width }}px; - margin: 0 auto; -} - -div.related { - width: {{ page_width - 20 }}px; - padding: 5px 10px; - background: #F2FCEE; - margin: 15px auto 15px auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 {{ sidebar_width }}px; -} - -div.sphinxsidebar { - width: {{ sidebar_width }}px; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -img.celerylogo { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - width: {{ page_width - 15 }}px; - margin: 10px auto 30px auto; - padding-right: 15px; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dashed #DCF0D5; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebar { - font-size: 14px; - line-height: 1.5; -} - -div.sphinxsidebarwrapper { - padding: 7px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0 0 20px 0; - margin: 0; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: {{ headline_font_stack }}; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar input { - border: 1px solid #ccc; - font-family: {{ body_font_stack }}; - font-size: 1em; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #348613; - text-decoration: underline; -} - -a:hover { - color: #59B833; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: {{ headline_font_stack }}; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 200%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -div.body h1 a.toc-backref, -div.body h2 a.toc-backref, -div.body h3 a.toc-backref, -div.body h4 a.toc-backref, -div.body h5 a.toc-backref, -div.body h6 a.toc-backref { - color: inherit!important; - text-decoration: none; -} - -a.headerlink { - color: #ddd; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition p.admonition-title { - font-family: {{ headline_font_stack }}; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight{ - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: {{ code_font_stack }}; - font-size: 0.9em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; - background: #fdfdfd; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td.label { - width: 0px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul { - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #F0FFEB; - padding: 7px 10px; - margin: 15px 0; - border: 1px solid #C7ECB8; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - line-height: 1.3em; -} - -tt { - background: #F0FFEB; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background: #F0FFEB; - border-bottom: 1px solid white; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dashed #DCF0D5; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dashed #DCF0D5; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt { - background: #EEE; -} - diff --git a/doc/source/_theme/celery/theme.conf b/doc/source/_theme/celery/theme.conf deleted file mode 100755 index 537f3779..00000000 --- a/doc/source/_theme/celery/theme.conf +++ /dev/null @@ -1,5 +0,0 @@ -[theme] -inherit = basic -stylesheet = celery.css - -[options] \ No newline at end of file diff --git a/doc/source/coding_rules.rst b/doc/source/coding_rules.rst deleted file mode 100644 index 421a8d79..00000000 --- a/doc/source/coding_rules.rst +++ /dev/null @@ -1,57 +0,0 @@ - -============ -Coding rules -============ - -Django models -============= - -* All model names in singular an CamelCase. - -* All models have a **Meta** with at least: - - - **verbose_name** and **verbose_name_plural**: unicode strings, lowercase, with spaces. - - **ordering**: return a consistent order, using pk if no other unique field or combination exists. - -* All models have **__unicode__** method, returning a human-readable, descriptive, short text. - -* All fields have **verbose_name**. Also **help_text** if needed to fully explain the field meaning. - -* All fields have explicit **blank** and **null** parameters. Use only those combinations, unless - there a documented need of other thing: - - Normal fields (IntegerField, DateField, ForeignKey, FileField...) - - (optional) **null = True**, **blank = True** - - (required) **null = False**, **blank = False** - - Text fields (CharField, TextField, URLField...) - - (optional) **null = False**, **blank = True** - - (required) **null = False**, **blank = False** - - Boolean fields: - - (two values, T/F) **null = False**, **blank = True** - - (three values, T/F/Null) **null = False**, **blank = True** - -* Don't create text fields with **null = True**, unless you need to distinguish between empty string and None. - -* Don't create boolean fields with **blank = False**, otherwise they could only be True. - -Example:: - - class SomeClass(models.Model): - name = models.CharField(max_length=100, null = False, blank = False, unique=True, - verbose_name = _(u'name')) - slug = models.SlugField(max_length=100, null = False, blank = False, unique=True, - verbose_name = _(u'slug'), - help_text = (u'Identifier of this object. Only letters, digits and underscore "_" allowed.')) - text = models.TextField(null = False, blank = True, - verbose_name = _(u'text')) - - class Meta: - verbose_name = _(u'some class') - verbose_name_plural = _(u'some classes') - ordering = ['name'] - - def __unicode__(self): - return self.name - diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100755 index 46770d5c..00000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,255 +0,0 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 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 . - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'taiga' -copyright = u'2012, Andrei Antoukh' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.0.10' -# The full version, including alpha/beta/rc tags. -release = '0.0.10' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' -html_theme = 'celery' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] -html_theme_path = ["_theme"] - - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} -html_sidebars = { - 'index': ['sidebarlogo.html', 'sidebarintro.html', - 'sourcelink.html', 'searchbox.html'], - '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', - 'sourcelink.html', 'searchbox.html'], -} - - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'taigadoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'taiga.tex', u'taiga documentation', - u'Andrei Antoukh', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'green-mine', u'taiga documentation', - [u'Andrei Antoukh'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'taiga', u'taiga documentation', - u'Andrei Antoukh', 'taiga', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100755 index 16d33901..00000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,43 +0,0 @@ -========== -Green-Mine -========== - -.. rubric:: Project management web application build on top of Django. - -Currently there is no stable version, but the project is already usable. All contributions and bug fixes is welcome. - - -First steps -=========== - -**From scratch:** -:ref:`Overview and Installation ` - -**Tutorials:** TODO - -**Miscellaneous:** -:ref:`Contributing ` | -:ref:`Tests ` | -:ref:`Changelog ` | -:ref:`License ` - - -Contents: -========= - -.. toctree:: - :maxdepth: 1 - - overview.rst - settings.rst - coding_rules.rst - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/doc/source/overview.rst b/doc/source/overview.rst deleted file mode 100755 index 0a2db96b..00000000 --- a/doc/source/overview.rst +++ /dev/null @@ -1,78 +0,0 @@ -.. _intro-overview: - -======== -Overview -======== - -Requirements -============ - -* python 2.6 or 2.7 -* django-superview >= 0.2 -* psycopg2 >= 2.4 (if postgresql is used) -* pyzmq >= 2.2 (for async mailserver) -* sphinx >= 1.1.3 (for build this documentation) -* django >= 1.4 (builtin) -* markdown >= 2.1 (for markdown wiki) -* docutils >= 0.7 (for restructuredtext wiki) - -Philosophy -========== - -TODO - -Installing -========== - -TODO - -Version Check -============= - -TODO - -.. _runtests: - -Running tests -============= - -Requirements for running tests: same as standard requierements. - -To run tests, open a shell on a package directory and type:: - - python manage.py test -v2 taiga - -To access coverage of tests you need to install the coverage_ package and run the tests using:: - - coverage run --omit=extern manage.py test -v2 taiga - -and to check out the coverage report:: - - coverage html - - -.. _contributing: - -Contributing -============ - -Develpment of Green-Mine happens at github: https://github.com/niwibe/Green-Mine - -We very much welcome your contribution of course. To do so, simply follow these guidelines: - -1. Fork ``taiga`` on github. -2. Create feature branch. Example: ``git checkout -b my_new_feature`` -3. Push your changes. Example: ``git push -u origin my_new_feature`` -4. Send me a pull-request. - -.. _license: - -License -======= - -This software is licensed under the `GNU Affero General Public License`_, Version -3. See the LICENSE file in the top distribution directory for the full license -text. - -.. _coverage: http://nedbatchelder.com/code/coverage/ -.. _`GNU Affero General Public License`: http://www.gnu.org/licenses/agpl.html diff --git a/doc/source/settings.rst b/doc/source/settings.rst deleted file mode 100755 index 873b0cb2..00000000 --- a/doc/source/settings.rst +++ /dev/null @@ -1,22 +0,0 @@ -Settings introduced by taiga. -============================= - -Default settings ----------------- - -The setting instance contains few default parameters used in throughout -the library. This parameters can be changed by the user by simply -overriding them. - -.. attribute:: settings.HOST - - Set a full host name, this is used for making urls for email - notifications. In the future, it will be automatic. - - Default: ``"http://localhost:8000"`` (ready for developers) - -.. attribute:: settings.DISABLE_REGISTRATION - - Set this, disables user registration. - - Default: ``False`` From e977c82427f1579f35d82dfbd3b82eeb3f1a3a42 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 30 Nov 2015 23:29:00 +0100 Subject: [PATCH 41/64] Improving API performance --- taiga/base/api/pagination.py | 103 ++++++++++++- taiga/permissions/service.py | 8 +- taiga/projects/issues/api.py | 4 +- taiga/projects/issues/serializers.py | 6 +- taiga/projects/issues/services.py | 173 ++++++++++++++-------- taiga/projects/milestones/api.py | 12 +- taiga/projects/milestones/serializers.py | 12 +- taiga/projects/tasks/api.py | 7 + taiga/projects/userstories/api.py | 7 +- taiga/projects/userstories/serializers.py | 12 ++ taiga/projects/userstories/services.py | 93 ++++++++---- taiga/timeline/api.py | 9 ++ taiga/timeline/serializers.py | 57 ++++--- taiga/timeline/service.py | 5 +- taiga/users/models.py | 64 ++++++++ 15 files changed, 420 insertions(+), 152 deletions(-) diff --git a/taiga/base/api/pagination.py b/taiga/base/api/pagination.py index dbab110b..e501ec9c 100644 --- a/taiga/base/api/pagination.py +++ b/taiga/base/api/pagination.py @@ -14,7 +14,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.core.paginator import Paginator, InvalidPage +from django.core.paginator import ( + EmptyPage, + Page, + PageNotAnInteger, + Paginator, + InvalidPage, +) from django.http import Http404 from django.utils.translation import ugettext as _ @@ -36,6 +42,90 @@ def strict_positive_int(integer_string, cutoff=None): return ret +class CustomPage(Page): + """Handle different number of items on the first page.""" + + def start_index(self): + """Return the 1-based index of the first item on this page.""" + paginator = self.paginator + # Special case, return zero if no items. + if paginator.count == 0: + return 0 + elif self.number == 1: + return 1 + return ( + (self.number - 2) * paginator.per_page + paginator.first_page + 1) + + def end_index(self): + """Return the 1-based index of the last item on this page.""" + paginator = self.paginator + # Special case for the last page because there can be orphans. + if self.number == paginator.num_pages: + return paginator.count + return (self.number - 1) * paginator.per_page + paginator.first_page + + +class LazyPaginator(Paginator): + """Implement lazy pagination.""" + + def __init__(self, object_list, per_page, **kwargs): + if 'first_page' in kwargs: + self.first_page = kwargs.pop('first_page') + else: + self.first_page = per_page + super(LazyPaginator, self).__init__(object_list, per_page, **kwargs) + + def get_current_per_page(self, number): + return self.first_page if number == 1 else self.per_page + + def validate_number(self, number): + try: + number = int(number) + except ValueError: + raise PageNotAnInteger('That page number is not an integer') + if number < 1: + raise EmptyPage('That page number is less than 1') + return number + + def page(self, number): + number = self.validate_number(number) + current_per_page = self.get_current_per_page(number) + if number == 1: + bottom = 0 + else: + bottom = ((number - 2) * self.per_page + self.first_page) + top = bottom + current_per_page + # Retrieve more objects to check if there is a next page. + objects = list(self.object_list[bottom:top + self.orphans + 1]) + objects_count = len(objects) + if objects_count > (current_per_page + self.orphans): + # If another page is found, increase the total number of pages. + self._num_pages = number + 1 + # In any case, return only objects for this page. + objects = objects[:current_per_page] + elif (number != 1) and (objects_count <= self.orphans): + raise EmptyPage('That page contains no results') + else: + # This is the last page. + self._num_pages = number + return Page(objects, number, self) + + def _get_count(self): + raise NotImplementedError + + count = property(_get_count) + + def _get_num_pages(self): + return self._num_pages + + num_pages = property(_get_num_pages) + + def _get_page_range(self): + raise NotImplementedError + + page_range = property(_get_page_range) + + class PaginationMixin(object): # Pagination settings paginate_by = api_settings.PAGINATE_BY @@ -77,6 +167,12 @@ class PaginationMixin(object): Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ + if "HTTP_X_DISABLE_PAGINATION" in self.request.META: + return None + + if "HTTP_X_LAZY_PAGINATION" in self.request.META: + self.paginator_class = LazyPaginator + deprecated_style = False if page_size is not None: warnings.warn('The `page_size` parameter to `paginate_queryset()` ' @@ -103,6 +199,7 @@ class PaginationMixin(object): paginator = self.paginator_class(queryset, page_size, allow_empty_first_page=self.allow_empty) + page_kwarg = self.kwargs.get(self.page_kwarg) page_query_param = self.request.QUERY_PARAMS.get(self.page_kwarg) page = page_kwarg or page_query_param or 1 @@ -124,7 +221,9 @@ class PaginationMixin(object): if page is None: return page - self.headers["x-pagination-count"] = page.paginator.count + if not "HTTP_X_LAZY_PAGINATION" in self.request.META: + self.headers["x-pagination-count"] = page.paginator.count + self.headers["x-paginated"] = "true" self.headers["x-paginated-by"] = page.paginator.per_page self.headers["x-pagination-current"] = page.number diff --git a/taiga/permissions/service.py b/taiga/permissions/service.py index 90ed3050..0048fc26 100644 --- a/taiga/permissions/service.py +++ b/taiga/permissions/service.py @@ -24,10 +24,8 @@ def _get_user_project_membership(user, project): if user.is_anonymous(): return None - try: - return Membership.objects.get(user=user, project=project) - except Membership.DoesNotExist: - return None + return user.cached_membership_for_project(project) + def _get_object_project(obj): project = None @@ -48,6 +46,8 @@ def is_project_owner(user, obj): return True project = _get_object_project(obj) + if project is None: + return False membership = _get_user_project_membership(user, project) if membership and membership.is_owner: diff --git a/taiga/projects/issues/api.py b/taiga/projects/issues/api.py index 1df9875e..f38bfb2e 100644 --- a/taiga/projects/issues/api.py +++ b/taiga/projects/issues/api.py @@ -67,6 +67,7 @@ class IssueViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixin, W filter_fields = ("project", "status__is_closed") + order_by_fields = ("type", "status", "severity", @@ -143,7 +144,8 @@ class IssueViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixin, W def get_queryset(self): qs = super().get_queryset() - qs = qs.prefetch_related("attachments") + qs = qs.prefetch_related("attachments", "generated_user_stories") + qs = qs.select_related("owner", "assigned_to", "status", "project") qs = self.attach_votes_attrs_to_queryset(qs) return self.attach_watchers_attrs_to_queryset(qs) diff --git a/taiga/projects/issues/serializers.py b/taiga/projects/issues/serializers.py index f4457a5f..cfc10feb 100644 --- a/taiga/projects/issues/serializers.py +++ b/taiga/projects/issues/serializers.py @@ -52,7 +52,11 @@ class IssueSerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWa return "" def get_generated_user_stories(self, obj): - return obj.generated_user_stories.values("id", "ref", "subject") + return [{ + "id": us.id, + "ref": us.ref, + "subject": us.subject, + } for us in obj.generated_user_stories.all()] def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index 8f8b4a06..83a5f818 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -133,18 +133,22 @@ def _get_issues_statuses(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "projects_issuestatus"."id", + WITH counters AS ( + SELECT status_id, count(status_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY status_id + ) + SELECT "projects_issuestatus"."id", "projects_issuestatus"."name", "projects_issuestatus"."color", "projects_issuestatus"."order", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."status_id" = "projects_issuestatus"."id") + COALESCE(counters.count, 0) FROM "projects_issuestatus" - WHERE "projects_issuestatus"."project_id" = %s - ORDER BY "projects_issuestatus"."order"; + LEFT OUTER JOIN counters ON counters.status_id = projects_issuestatus.id + WHERE "projects_issuestatus"."project_id" = %s + ORDER BY "projects_issuestatus"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -170,18 +174,22 @@ def _get_issues_types(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "projects_issuetype"."id", + WITH counters AS ( + SELECT type_id, count(type_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY type_id + ) + SELECT "projects_issuetype"."id", "projects_issuetype"."name", "projects_issuetype"."color", "projects_issuetype"."order", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."type_id" = "projects_issuetype"."id") + COALESCE(counters.count, 0) FROM "projects_issuetype" - WHERE "projects_issuetype"."project_id" = %s - ORDER BY "projects_issuetype"."order"; + LEFT OUTER JOIN counters ON counters.type_id = projects_issuetype.id + WHERE "projects_issuetype"."project_id" = %s + ORDER BY "projects_issuetype"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -207,18 +215,22 @@ def _get_issues_priorities(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "projects_priority"."id", + WITH counters AS ( + SELECT priority_id, count(priority_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY priority_id + ) + SELECT "projects_priority"."id", "projects_priority"."name", "projects_priority"."color", "projects_priority"."order", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."priority_id" = "projects_priority"."id") + COALESCE(counters.count, 0) FROM "projects_priority" - WHERE "projects_priority"."project_id" = %s - ORDER BY "projects_priority"."order"; + LEFT OUTER JOIN counters ON counters.priority_id = projects_priority.id + WHERE "projects_priority"."project_id" = %s + ORDER BY "projects_priority"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -244,18 +256,22 @@ def _get_issues_severities(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "projects_severity"."id", + WITH counters AS ( + SELECT severity_id, count(severity_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY severity_id + ) + SELECT "projects_severity"."id", "projects_severity"."name", "projects_severity"."color", "projects_severity"."order", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."severity_id" = "projects_severity"."id") + COALESCE(counters.count, 0) FROM "projects_severity" - WHERE "projects_severity"."project_id" = %s - ORDER BY "projects_severity"."order"; + LEFT OUTER JOIN counters ON counters.severity_id = projects_severity.id + WHERE "projects_severity"."project_id" = %s + ORDER BY "projects_severity"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -281,37 +297,55 @@ def _get_issues_assigned_to(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT NULL, - NULL, - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id" ) - WHERE {where} AND "issues_issue"."assigned_to_id" IS NULL) - UNION SELECT "users_user"."id", - "users_user"."full_name", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id" ) - WHERE {where} AND "issues_issue"."assigned_to_id" = "projects_membership"."user_id") - FROM "projects_membership" - INNER JOIN "users_user" ON - ("projects_membership"."user_id" = "users_user"."id") - WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL; + WITH counters AS ( + SELECT assigned_to_id, count(assigned_to_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} AND "issues_issue"."assigned_to_id" IS NOT NULL + GROUP BY assigned_to_id + ) + SELECT + "projects_membership"."user_id" user_id, + "users_user"."full_name", + COALESCE("counters".count, 0) count + FROM projects_membership + LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."assigned_to_id") + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL + + -- unassigned issues + UNION + SELECT NULL user_id, NULL, count(coalesce(assigned_to_id, -1)) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} AND "issues_issue"."assigned_to_id" IS NULL + GROUP BY assigned_to_id """.format(where=where) with closing(connection.cursor()) as cursor: - cursor.execute(extra_sql, where_params + where_params + [project.id]) + cursor.execute(extra_sql, where_params + [project.id] + where_params) rows = cursor.fetchall() result = [] + none_valued_added = False for id, full_name, count in rows: result.append({ "id": id, "full_name": full_name or "", "count": count, }) + + if id is None: + none_valued_added = True + + # If there was no issue with null assigned_to we manually add it + if not none_valued_added: + result.append({ + "id": None, + "full_name": "", + "count": 0, + }) + return sorted(result, key=itemgetter("full_name")) @@ -322,18 +356,31 @@ def _get_issues_owners(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "users_user"."id", - "users_user"."full_name", - (SELECT count(*) - FROM "issues_issue" - INNER JOIN "projects_project" ON - ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} and "issues_issue"."owner_id" = "projects_membership"."user_id") - FROM "projects_membership" - RIGHT OUTER JOIN "users_user" ON - ("projects_membership"."user_id" = "users_user"."id") - WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) - OR ("users_user"."is_system" IS TRUE); + WITH counters AS ( + SELECT "issues_issue"."owner_id" owner_id, count("issues_issue"."owner_id") count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY "issues_issue"."owner_id" + ) + SELECT + "projects_membership"."user_id" id, + "users_user"."full_name", + COALESCE("counters".count, 0) count + FROM projects_membership + LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."owner_id") + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) + + -- System users + UNION + SELECT + "users_user"."id" user_id, + "users_user"."full_name" full_name, + COALESCE("counters".count, 0) count + FROM users_user + LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") + WHERE ("users_user"."is_system" IS TRUE) """.format(where=where) with closing(connection.cursor()) as cursor: diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index d9e044be..056ed7d3 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -62,14 +62,16 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView def get_queryset(self): qs = super().get_queryset() - qs = self.attach_watchers_attrs_to_queryset(qs) qs = qs.prefetch_related("user_stories", "user_stories__role_points", "user_stories__role_points__points", - "user_stories__role_points__role", - "user_stories__generated_from_issue", - "user_stories__project") - qs = qs.select_related("project") + "user_stories__role_points__role") + + qs = qs.select_related("project", + "owner") + + qs = self.attach_watchers_attrs_to_queryset(qs) + qs = qs.order_by("-estimated_start") return qs diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index 50e90a49..e3773654 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -21,16 +21,14 @@ from taiga.base.utils import json from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.validators import WatchersValidator -from ..userstories.serializers import UserStorySerializer +from ..userstories.serializers import MilestoneUserStorySerializer from . import models class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): - user_stories = UserStorySerializer(many=True, required=False, read_only=True) + user_stories = MilestoneUserStorySerializer(many=True, required=False, read_only=True) total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") - client_increment_points = serializers.SerializerMethodField("get_client_increment_points") - team_increment_points = serializers.SerializerMethodField("get_team_increment_points") class Meta: model = models.Milestone @@ -42,12 +40,6 @@ class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, ser def get_closed_points(self, obj): return sum(obj.closed_points.values()) - def get_client_increment_points(self, obj): - return sum(obj.client_increment_points.values()) - - def get_team_increment_points(self, obj): - return sum(obj.team_increment_points.values()) - def validate_name(self, attrs, source): """ Check the milestone name is not duplicated in the project on creation diff --git a/taiga/projects/tasks/api.py b/taiga/projects/tasks/api.py index d48791e2..afd7d619 100644 --- a/taiga/projects/tasks/api.py +++ b/taiga/projects/tasks/api.py @@ -88,6 +88,13 @@ class TaskViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixin, Wa def get_queryset(self): qs = super().get_queryset() qs = self.attach_votes_attrs_to_queryset(qs) + qs = qs.select_related( + "milestone", + "owner", + "assigned_to", + "status", + "project") + return self.attach_watchers_attrs_to_queryset(qs) def pre_save(self, obj): diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 66c7b521..6e8d747c 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -116,7 +116,12 @@ class UserStoryViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixi qs = qs.prefetch_related("role_points", "role_points__points", "role_points__role") - qs = qs.select_related("milestone", "project") + qs = qs.select_related("milestone", + "project", + "status", + "owner", + "assigned_to", + "generated_from_issue") qs = self.attach_votes_attrs_to_queryset(qs) return self.attach_watchers_attrs_to_queryset(qs) diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index c3f93d67..19dcab9f 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -45,6 +45,18 @@ class RolePointsField(serializers.WritableField): return json.loads(obj) +class MilestoneUserStorySerializer(serializers.ModelSerializer): + total_points = serializers.SerializerMethodField("get_total_points") + + class Meta: + model = models.UserStory + depth = 0 + fields = ("id", "ref", "subject", "is_closed", "is_blocked", "total_points") + + def get_total_points(self, obj): + return obj.get_total_points() + + class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index bb05ae29..40d6a092 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -236,37 +236,55 @@ def _get_userstories_assigned_to(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT NULL, - NULL, - (SELECT count(*) - FROM "userstories_userstory" - INNER JOIN "projects_project" ON - ("userstories_userstory"."project_id" = "projects_project"."id" ) - WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NULL) - UNION SELECT "users_user"."id", - "users_user"."full_name", - (SELECT count(*) - FROM "userstories_userstory" - INNER JOIN "projects_project" ON - ("userstories_userstory"."project_id" = "projects_project"."id" ) - WHERE {where} AND "userstories_userstory"."assigned_to_id" = "projects_membership"."user_id") - FROM "projects_membership" - INNER JOIN "users_user" ON - ("projects_membership"."user_id" = "users_user"."id") - WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL; + WITH counters AS ( + SELECT assigned_to_id, count(assigned_to_id) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NOT NULL + GROUP BY assigned_to_id + ) + SELECT + "projects_membership"."user_id" user_id, + "users_user"."full_name", + COALESCE("counters".count, 0) count + FROM projects_membership + LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."assigned_to_id") + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL + + -- unassigned userstories + UNION + SELECT NULL user_id, NULL, count(coalesce(assigned_to_id, -1)) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NULL + GROUP BY assigned_to_id """.format(where=where) with closing(connection.cursor()) as cursor: - cursor.execute(extra_sql, where_params + where_params + [project.id]) + cursor.execute(extra_sql, where_params + [project.id] + where_params) rows = cursor.fetchall() result = [] + none_valued_added = False for id, full_name, count in rows: result.append({ "id": id, "full_name": full_name or "", "count": count, }) + + if id is None: + none_valued_added = True + + # If there was no userstory with null assigned_to we manually add it + if not none_valued_added: + result.append({ + "id": None, + "full_name": "", + "count": 0, + }) + return sorted(result, key=itemgetter("full_name")) @@ -277,18 +295,31 @@ def _get_userstories_owners(project, queryset): where_params = queryset_where_tuple[1] extra_sql = """ - SELECT "users_user"."id", - "users_user"."full_name", - (SELECT count(*) - FROM "userstories_userstory" - INNER JOIN "projects_project" ON - ("userstories_userstory"."project_id" = "projects_project"."id") - WHERE {where} AND "userstories_userstory"."owner_id" = "projects_membership"."user_id") - FROM "projects_membership" - RIGHT OUTER JOIN "users_user" ON - ("projects_membership"."user_id" = "users_user"."id") - WHERE (("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) - OR ("users_user"."is_system" IS TRUE)); + WITH counters AS ( + SELECT "userstories_userstory"."owner_id" owner_id, count(coalesce("userstories_userstory"."owner_id", -1)) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY "userstories_userstory"."owner_id" + ) + SELECT + "projects_membership"."user_id" id, + "users_user"."full_name", + COALESCE("counters".count, 0) count + FROM projects_membership + LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."owner_id") + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) + + -- System users + UNION + SELECT + "users_user"."id" user_id, + "users_user"."full_name" full_name, + COALESCE("counters".count, 0) count + FROM users_user + LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") + WHERE ("users_user"."is_system" IS TRUE) """.format(where=where) with closing(connection.cursor()) as cursor: diff --git a/taiga/timeline/api.py b/taiga/timeline/api.py index 49504499..3137f913 100644 --- a/taiga/timeline/api.py +++ b/taiga/timeline/api.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from django.contrib.contenttypes.models import ContentType +from django.apps import apps from taiga.base import response from taiga.base.api.utils import get_object_or_404 @@ -46,6 +47,14 @@ class TimelineViewSet(ReadOnlyListViewSet): # Switch between paginated or standard style responses page = self.paginate_queryset(queryset) if page is not None: + user_ids = list(set([obj.data.get("user", {}).get("id", None) for obj in page.object_list])) + User = apps.get_model("users", "User") + users = {u.id: u for u in User.objects.filter(id__in=user_ids)} + + for obj in page.object_list: + user_id = obj.data.get("user", {}).get("id", None) + obj._prefetched_user = users.get(user_id, None) + serializer = self.get_pagination_serializer(page) else: serializer = self.get_serializer(queryset, many=True) diff --git a/taiga/timeline/serializers.py b/taiga/timeline/serializers.py index f5defc56..b5af436a 100644 --- a/taiga/timeline/serializers.py +++ b/taiga/timeline/serializers.py @@ -24,39 +24,34 @@ from taiga.users.services import get_photo_or_gravatar_url, get_big_photo_or_gra from . import models from . import service -class TimelineDataJsonField(serializers.WritableField): - """ - Timeline Json objects serializer. - """ - widget = widgets.Textarea - - def to_native(self, obj): - #Updates the data user info saved if the user exists - User = apps.get_model("users", "User") - userData = obj.get("user", None) - if userData: - try: - user = User.objects.get(id=userData["id"]) - obj["user"] = { - "id": user.pk, - "name": user.get_full_name(), - "photo": get_photo_or_gravatar_url(user), - "big_photo": get_big_photo_or_gravatar_url(user), - "username": user.username, - "is_profile_visible": user.is_active and not user.is_system, - "date_joined": user.date_joined - } - except User.DoesNotExist: - pass - - return obj - - def from_native(self, data): - return data - class TimelineSerializer(serializers.ModelSerializer): - data = TimelineDataJsonField() + data = serializers.SerializerMethodField("get_data") class Meta: model = models.Timeline + + def get_data(self, obj): + #Updates the data user info saved if the user exists + if hasattr(obj, "_prefetched_user"): + user = obj._prefetched_user + else: + User = apps.get_model("users", "User") + userData = obj.data.get("user", None) + try: + user = User.objects.get(id=userData["id"]) + except User.DoesNotExist: + user = None + + if user is not None: + obj.data["user"] = { + "id": user.pk, + "name": user.get_full_name(), + "photo": get_photo_or_gravatar_url(user), + "big_photo": get_big_photo_or_gravatar_url(user), + "username": user.username, + "is_profile_visible": user.is_active and not user.is_system, + "date_joined": user.date_joined + } + + return obj.data diff --git a/taiga/timeline/service.py b/taiga/timeline/service.py index cc03d676..5bfdeebb 100644 --- a/taiga/timeline/service.py +++ b/taiga/timeline/service.py @@ -96,6 +96,7 @@ def get_timeline(obj, namespace=None): if namespace is not None: timeline = timeline.filter(namespace=namespace) + timeline = timeline.select_related("project") timeline = timeline.order_by("-created", "-id") return timeline @@ -128,9 +129,7 @@ def filter_timeline_for_user(timeline, user): # Filtering private projects where user is member if not user.is_anonymous(): - membership_model = apps.get_model('projects', 'Membership') - memberships_qs = membership_model.objects.filter(user=user) - for membership in memberships_qs: + for membership in user.cached_memberships: for content_type_key, content_type in content_types.items(): if content_type_key in membership.role.permissions or membership.is_owner: tl_filter |= Q(project=membership.project, data_content_type=content_type) diff --git a/taiga/users/models.py b/taiga/users/models.py index b2828912..6bbd1ae2 100644 --- a/taiga/users/models.py +++ b/taiga/users/models.py @@ -23,6 +23,8 @@ import uuid from unidecode import unidecode +from django.apps import apps +from django.contrib.contenttypes.models import ContentType from django.db import models from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ @@ -39,6 +41,7 @@ from taiga.auth.tokens import get_token_for_user from taiga.base.utils.slug import slugify_uniquely from taiga.base.utils.iterators import split_by_n from taiga.permissions.permissions import MEMBERS_PERMISSIONS +from taiga.projects.notifications.choices import NotifyLevel from easy_thumbnails.files import get_thumbnailer @@ -135,6 +138,10 @@ class User(AbstractBaseUser, PermissionsMixin): new_email = models.EmailField(_('new email address'), null=True, blank=True) is_system = models.BooleanField(null=False, blank=False, default=False) + _cached_memberships = None + _cached_liked_ids = None + _cached_watched_ids = None + _cached_notify_levels = None USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] @@ -152,6 +159,63 @@ class User(AbstractBaseUser, PermissionsMixin): def __str__(self): return self.get_full_name() + def _fill_cached_memberships(self): + self._cached_memberships = {} + qs = self.memberships.prefetch_related("user", "project", "role") + for membership in qs.all(): + self._cached_memberships[membership.project.id] = membership + + @property + def cached_memberships(self): + if self._cached_memberships is None: + self._fill_cached_memberships() + + return self._cached_memberships.values() + + def cached_membership_for_project(self, project): + if self._cached_memberships is None: + self._fill_cached_memberships() + + return self._cached_memberships.get(project.id, None) + + def is_fan(self, obj): + if self._cached_liked_ids is None: + self._cached_liked_ids = set() + for like in self.likes.select_related("content_type").all(): + like_id = "{}-{}".format(like.content_type.id, like.object_id) + self._cached_liked_ids.add(like_id) + + obj_type = ContentType.objects.get_for_model(obj) + obj_id = "{}-{}".format(obj_type.id, obj.id) + return obj_id in self._cached_liked_ids + + def is_watcher(self, obj): + if self._cached_watched_ids is None: + self._cached_watched_ids = set() + for watched in self.watched.select_related("content_type").all(): + watched_id = "{}-{}".format(watched.content_type.id, watched.object_id) + self._cached_watched_ids.add(watched_id) + + notify_policies = self.notify_policies.select_related("project")\ + .exclude(notify_level=NotifyLevel.none) + + for notify_policy in notify_policies: + obj_type = ContentType.objects.get_for_model(notify_policy.project) + watched_id = "{}-{}".format(obj_type.id, notify_policy.project.id) + self._cached_watched_ids.add(watched_id) + + obj_type = ContentType.objects.get_for_model(obj) + obj_id = "{}-{}".format(obj_type.id, obj.id) + return obj_id in self._cached_watched_ids + + def get_notify_level(self, project): + if self._cached_notify_levels is None: + self._cached_notify_levels = {} + for notify_policy in self.notify_policies.select_related("project"): + self._cached_notify_levels[notify_policy.project.id] = notify_policy.notify_level + + return self._cached_notify_levels.get(project.id, None) + def get_short_name(self): "Returns the short name for the user." return self.username From 818c8b4381b25e4a2c42a4c82ecdfa3d42ed0190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 8 Dec 2015 20:36:48 +0100 Subject: [PATCH 42/64] fix issue #3630: I cannot open a story from the taskboard when I click on the story title. --- taiga/projects/userstories/serializers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index 19dcab9f..04e6225e 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -51,13 +51,14 @@ class MilestoneUserStorySerializer(serializers.ModelSerializer): class Meta: model = models.UserStory depth = 0 - fields = ("id", "ref", "subject", "is_closed", "is_blocked", "total_points") + fields = ("id", "ref", "subject", "milestone", "is_closed", "is_blocked", "total_points") def get_total_points(self, obj): return obj.get_total_points() -class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): +class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, + serializers.ModelSerializer): tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) points = RolePointsField(source="role_points", required=False) From 987ca8c37305d224344d131ec3e57604fc4014e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 8 Dec 2015 20:59:03 +0100 Subject: [PATCH 43/64] Use UserStorySerializer instead MilestoneUserStorySerializer --- taiga/projects/milestones/serializers.py | 4 ++-- taiga/projects/userstories/serializers.py | 12 ------------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index e3773654..e189b5fd 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -21,12 +21,12 @@ from taiga.base.utils import json from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.validators import WatchersValidator -from ..userstories.serializers import MilestoneUserStorySerializer +from ..userstories.serializers import UserStorySerializer from . import models class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): - user_stories = MilestoneUserStorySerializer(many=True, required=False, read_only=True) + user_stories = UserStorySerializer(many=True, required=False, read_only=True) total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index 04e6225e..5d38548b 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -45,18 +45,6 @@ class RolePointsField(serializers.WritableField): return json.loads(obj) -class MilestoneUserStorySerializer(serializers.ModelSerializer): - total_points = serializers.SerializerMethodField("get_total_points") - - class Meta: - model = models.UserStory - depth = 0 - fields = ("id", "ref", "subject", "milestone", "is_closed", "is_blocked", "total_points") - - def get_total_points(self, obj): - return obj.get_total_points() - - class UserStorySerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) From 38f3ae0d8fad1a75e39f3acd5e3c427bb003f28a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 9 Dec 2015 12:40:35 +0100 Subject: [PATCH 44/64] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a16bdd9a..6b0debdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog # -## 1.10.0 ????? (unreleased) +## 1.9.1 Taiga Tribe (unreleased) ### Features - [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. From 067ce86478977159e6595b9dcddea383de13e5eb Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 11 Dec 2015 11:47:20 +0100 Subject: [PATCH 45/64] Improving neighbor calculation --- taiga/base/neighbors.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/taiga/base/neighbors.py b/taiga/base/neighbors.py index 0a23f2d6..3a7c0d44 100644 --- a/taiga/base/neighbors.py +++ b/taiga/base/neighbors.py @@ -18,7 +18,8 @@ from collections import namedtuple from django.db import connection - +from django.core.exceptions import ObjectDoesNotExist +from django.db.models.sql.datastructures import EmptyResultSet from taiga.base.api import serializers Neighbor = namedtuple("Neighbor", "left right") @@ -35,15 +36,27 @@ def get_neighbors(obj, results_set=None): :return: Tuple `, `. Left and right neighbors can be `None`. """ - if results_set is None or results_set.count() == 0: + if results_set is None: results_set = type(obj).objects.get_queryset() + # Neighbors calculation is at least at project level + results_set = results_set.filter(project_id=obj.project.id) + compiler = results_set.query.get_compiler('default') - base_sql, base_params = compiler.as_sql(with_col_aliases=True) + try: + base_sql, base_params = compiler.as_sql(with_col_aliases=True) + except EmptyResultSet: + # Generate a not empty queryset + results_set = type(obj).objects.get_queryset().filter(project_id=obj.project.id) + compiler = results_set.query.get_compiler('default') + base_sql, base_params = compiler.as_sql(with_col_aliases=True) query = """ SELECT * FROM - (SELECT "col1" as id, ROW_NUMBER() OVER() + (SELECT "col1" as id, + ROW_NUMBER() OVER(), + LAG("col1", 1) OVER() AS prev, + LEAD("col1", 1) OVER() AS next FROM (%s) as ID_AND_ROW) AS SELECTED_ID_AND_ROW """ % (base_sql) @@ -57,15 +70,17 @@ def get_neighbors(obj, results_set=None): return Neighbor(None, None) obj_position = row[1] - 1 + left_object_id = row[2] + right_object_id = row[3] try: - left = obj_position > 0 and results_set[obj_position - 1] or None - except IndexError: + left = results_set.get(id=left_object_id) + except ObjectDoesNotExist: left = None try: - right = results_set[obj_position + 1] - except IndexError: + right = results_set.get(id=right_object_id) + except ObjectDoesNotExist: right = None return Neighbor(left, right) From a7c60fd1b3a7454904080ce39989b7fbd0d2f5b7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 11 Dec 2015 12:30:44 +0100 Subject: [PATCH 46/64] Adding only relevant filter to timeline API --- taiga/timeline/api.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/taiga/timeline/api.py b/taiga/timeline/api.py index 3137f913..41b24548 100644 --- a/taiga/timeline/api.py +++ b/taiga/timeline/api.py @@ -74,6 +74,18 @@ class TimelineViewSet(ReadOnlyListViewSet): self.check_permissions(request, "retrieve", obj) qs = self.get_timeline(obj) + + if request.GET.get("only_relevant", None) is not None: + qs = qs.exclude(event_type="issues.issue.change", data__at_values_diff="{}") + qs = qs.exclude(event_type="tasks.task.change", data__at_values_diff="{}") + qs = qs.exclude(event_type="userstories.userstory.change", data__at_values_diff="{}") + qs = qs.exclude(event_type="wiki.wikipage.change", data__at_values_diff="{}") + qs = qs.exclude(event_type="issues.issue.delete") + qs = qs.exclude(event_type="tasks.task.delete") + qs = qs.exclude(event_type="userstories.userstory.delete") + qs = qs.exclude(event_type="wiki.wikipage.delete") + qs = qs.exclude(event_type="projects.project.change") + return self.response_for_queryset(qs) From fefd0b06d37a2fa92fc30133c07ff64b4139197e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 11 Dec 2015 13:13:29 +0100 Subject: [PATCH 47/64] Add 'x-lazy-pagination' to COORS_ALLOWED_HEADERS --- taiga/base/middleware/cors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/taiga/base/middleware/cors.py b/taiga/base/middleware/cors.py index b4ed438f..a27ada91 100644 --- a/taiga/base/middleware/cors.py +++ b/taiga/base/middleware/cors.py @@ -22,8 +22,8 @@ COORS_ALLOWED_ORIGINS = "*" COORS_ALLOWED_METHODS = ["POST", "GET", "OPTIONS", "PUT", "DELETE", "PATCH", "HEAD"] COORS_ALLOWED_HEADERS = ["content-type", "x-requested-with", "authorization", "accept-encoding", - "x-disable-pagination", "x-host", - "x-session-id"] + "x-disable-pagination", "x-lazy-pagination", + "x-host", "x-session-id"] COORS_ALLOWED_CREDENTIALS = True COORS_EXPOSE_HEADERS = ["x-pagination-count", "x-paginated", "x-paginated-by", "x-pagination-current", "x-pagination-next", "x-pagination-prev", From 9ecf762e1198325a94dd0142b108de9f8cc4e8e6 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Sat, 12 Dec 2015 21:00:09 +0100 Subject: [PATCH 48/64] Fixing attach_watchers_attrs_to_queryset method --- taiga/projects/notifications/mixins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taiga/projects/notifications/mixins.py b/taiga/projects/notifications/mixins.py index a147431b..ede48093 100644 --- a/taiga/projects/notifications/mixins.py +++ b/taiga/projects/notifications/mixins.py @@ -53,7 +53,7 @@ class WatchedResourceMixin: def attach_watchers_attrs_to_queryset(self, queryset): qs = attach_watchers_to_queryset(queryset) - qs = attach_total_watchers_to_queryset(queryset) + qs = attach_total_watchers_to_queryset(qs) if self.request.user.is_authenticated(): qs = attach_is_watcher_to_queryset(qs, self.request.user) From afb5af15279dd7a081cf1e7a589f3b499f168c1e Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Sun, 13 Dec 2015 22:22:24 +0100 Subject: [PATCH 49/64] Improving timeline API performance --- taiga/timeline/api.py | 26 +++++++++++++++++--------- taiga/timeline/service.py | 7 +++---- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/taiga/timeline/api.py b/taiga/timeline/api.py index 41b24548..e940e019 100644 --- a/taiga/timeline/api.py +++ b/taiga/timeline/api.py @@ -76,15 +76,23 @@ class TimelineViewSet(ReadOnlyListViewSet): qs = self.get_timeline(obj) if request.GET.get("only_relevant", None) is not None: - qs = qs.exclude(event_type="issues.issue.change", data__at_values_diff="{}") - qs = qs.exclude(event_type="tasks.task.change", data__at_values_diff="{}") - qs = qs.exclude(event_type="userstories.userstory.change", data__at_values_diff="{}") - qs = qs.exclude(event_type="wiki.wikipage.change", data__at_values_diff="{}") - qs = qs.exclude(event_type="issues.issue.delete") - qs = qs.exclude(event_type="tasks.task.delete") - qs = qs.exclude(event_type="userstories.userstory.delete") - qs = qs.exclude(event_type="wiki.wikipage.delete") - qs = qs.exclude(event_type="projects.project.change") + qs = qs.extra(where=[ + """ + NOT( + data::text LIKE '%%\"values_diff\": {}%%' + AND + event_type::text = ANY('{issues.issue.change, + tasks.task.change, + userstories.userstory.change, + wiki.wikipage.change}'::text[]) + ) + """]) + + qs = qs.exclude(event_type__in=["issues.issue.delete", + "tasks.task.delete", + "userstories.userstory.delete", + "wiki.wikipage.delete", + "projects.project.change"]) return self.response_for_queryset(qs) diff --git a/taiga/timeline/service.py b/taiga/timeline/service.py index 5bfdeebb..88c85a9a 100644 --- a/taiga/timeline/service.py +++ b/taiga/timeline/service.py @@ -130,10 +130,9 @@ def filter_timeline_for_user(timeline, user): # Filtering private projects where user is member if not user.is_anonymous(): for membership in user.cached_memberships: - for content_type_key, content_type in content_types.items(): - if content_type_key in membership.role.permissions or membership.is_owner: - tl_filter |= Q(project=membership.project, data_content_type=content_type) - tl_filter |= Q(project=membership.project, data_content_type=membership_content_type) + data_content_types = list(filter(None, [content_types.get(a, None) for a in membership.role.permissions])) + data_content_types.append(membership_content_type) + tl_filter |= Q(project=membership.project, data_content_type__in=data_content_types) timeline = timeline.filter(tl_filter) return timeline From 8d241479faa22992e8004ef49da6da38ceb7122f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 17 Dec 2015 10:10:55 +0100 Subject: [PATCH 50/64] Improving milestones API --- taiga/projects/milestones/serializers.py | 29 ++++++++++++++++++++++-- taiga/projects/notifications/mixins.py | 2 +- taiga/projects/notifications/utils.py | 2 +- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index e189b5fd..a622ea0f 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -20,13 +20,15 @@ from taiga.base.api import serializers from taiga.base.utils import json from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.validators import WatchersValidator +from taiga.projects.votes.utils import attach_total_voters_to_queryset, attach_is_voter_to_queryset +from taiga.projects.notifications.utils import attach_watchers_to_queryset, attach_is_watcher_to_queryset -from ..userstories.serializers import UserStorySerializer +from ..userstories.serializers import UserStoryListSerializer from . import models class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): - user_stories = UserStorySerializer(many=True, required=False, read_only=True) + user_stories = serializers.SerializerMethodField("get_user_stories") total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") @@ -34,6 +36,29 @@ class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, ser model = models.Milestone read_only_fields = ("id", "created_date", "modified_date") + def get_user_stories(self, obj): + qs = obj.user_stories.prefetch_related("role_points", + "role_points__points", + "role_points__role") + + qs = qs.select_related("milestone", + "project", + "status", + "owner", + "assigned_to", + "generated_from_issue") + + request = self.context.get("request", None) + requesting_user = request and request.user or None + if requesting_user and requesting_user.is_authenticated(): + qs = attach_is_voter_to_queryset(requesting_user, qs) + qs = attach_is_watcher_to_queryset(requesting_user, qs) + + qs = attach_total_voters_to_queryset(qs) + qs = attach_watchers_to_queryset(qs) + + return UserStoryListSerializer(qs, many=True).data + def get_total_points(self, obj): return sum(obj.total_points.values()) diff --git a/taiga/projects/notifications/mixins.py b/taiga/projects/notifications/mixins.py index ede48093..26726703 100644 --- a/taiga/projects/notifications/mixins.py +++ b/taiga/projects/notifications/mixins.py @@ -55,7 +55,7 @@ class WatchedResourceMixin: qs = attach_watchers_to_queryset(queryset) qs = attach_total_watchers_to_queryset(qs) if self.request.user.is_authenticated(): - qs = attach_is_watcher_to_queryset(qs, self.request.user) + qs = attach_is_watcher_to_queryset(self.request.user, qs) return qs diff --git a/taiga/projects/notifications/utils.py b/taiga/projects/notifications/utils.py index 49aea78d..b8138e0a 100644 --- a/taiga/projects/notifications/utils.py +++ b/taiga/projects/notifications/utils.py @@ -40,7 +40,7 @@ def attach_watchers_to_queryset(queryset, as_field="watchers"): return qs -def attach_is_watcher_to_queryset(queryset, user, as_field="is_watcher"): +def attach_is_watcher_to_queryset(user, queryset, as_field="is_watcher"): """Attach is_watcher boolean to each object of the queryset. :param user: A users.User object model From 1f8ef9bec388e38889f80bac4daa677ef414d089 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 18 Dec 2015 09:20:48 +0100 Subject: [PATCH 51/64] Improving milestones API a bit more --- taiga/projects/milestones/api.py | 31 +++++++++++++++++++----- taiga/projects/milestones/serializers.py | 27 +-------------------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index 056ed7d3..94cb04ec 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from django.apps import apps +from django.db.models import Prefetch from taiga.base import filters from taiga.base import response @@ -25,6 +26,8 @@ from taiga.base.utils.db import get_object_or_none from taiga.projects.notifications.mixins import WatchedResourceMixin, WatchersViewSetMixin from taiga.projects.history.mixins import HistoryResourceMixin +from taiga.projects.votes.utils import attach_total_voters_to_queryset, attach_is_voter_to_queryset +from taiga.projects.notifications.utils import attach_watchers_to_queryset, attach_is_watcher_to_queryset from . import serializers from . import models @@ -62,14 +65,30 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView def get_queryset(self): qs = super().get_queryset() - qs = qs.prefetch_related("user_stories", - "user_stories__role_points", - "user_stories__role_points__points", - "user_stories__role_points__role") - qs = qs.select_related("project", - "owner") + # Userstories prefetching + UserStory = apps.get_model("userstories", "UserStory") + us_qs = UserStory.objects.prefetch_related("role_points", + "role_points__points", + "role_points__role") + us_qs = us_qs.select_related("milestone", + "project", + "status", + "owner", + "assigned_to", + "generated_from_issue") + + us_qs = self.attach_watchers_attrs_to_queryset(us_qs) + + if self.request.user.is_authenticated(): + us_qs = attach_is_voter_to_queryset(self.request.user, us_qs) + us_qs = attach_is_watcher_to_queryset(self.request.user, us_qs) + + qs = qs.prefetch_related(Prefetch("user_stories", queryset=us_qs)) + + # Milestones prefetching + qs = qs.select_related("project", "owner") qs = self.attach_watchers_attrs_to_queryset(qs) qs = qs.order_by("-estimated_start") diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index a622ea0f..5d3ddf7b 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -20,15 +20,13 @@ from taiga.base.api import serializers from taiga.base.utils import json from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.validators import WatchersValidator -from taiga.projects.votes.utils import attach_total_voters_to_queryset, attach_is_voter_to_queryset -from taiga.projects.notifications.utils import attach_watchers_to_queryset, attach_is_watcher_to_queryset from ..userstories.serializers import UserStoryListSerializer from . import models class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): - user_stories = serializers.SerializerMethodField("get_user_stories") + user_stories = UserStoryListSerializer(many=True, required=False, read_only=True) total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") @@ -36,29 +34,6 @@ class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, ser model = models.Milestone read_only_fields = ("id", "created_date", "modified_date") - def get_user_stories(self, obj): - qs = obj.user_stories.prefetch_related("role_points", - "role_points__points", - "role_points__role") - - qs = qs.select_related("milestone", - "project", - "status", - "owner", - "assigned_to", - "generated_from_issue") - - request = self.context.get("request", None) - requesting_user = request and request.user or None - if requesting_user and requesting_user.is_authenticated(): - qs = attach_is_voter_to_queryset(requesting_user, qs) - qs = attach_is_watcher_to_queryset(requesting_user, qs) - - qs = attach_total_voters_to_queryset(qs) - qs = attach_watchers_to_queryset(qs) - - return UserStoryListSerializer(qs, many=True).data - def get_total_points(self, obj): return sum(obj.total_points.values()) From 7141339a4387645a227c2d6bc190ddea0c77d2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Sun, 20 Dec 2015 19:22:14 +0200 Subject: [PATCH 52/64] Update requirements --- requirements-devel.txt | 6 +++--- requirements.txt | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-devel.txt b/requirements-devel.txt index cccd2a5e..da4f0eb9 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,12 +1,12 @@ -r requirements.txt factory_boy==2.6.0 -py==1.4.30 -pytest==2.8.2 +py==1.4.31 +pytest==2.8.5 pytest-django==2.9.1 pytest-pythonpath==0.7 -coverage==4.0.1 +coverage==4.0.3 coveralls==1.1 django-slowdown==0.0.1 diff --git a/requirements.txt b/requirements.txt index cb7735b4..bb872ac8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,11 +11,11 @@ amqp==1.4.7 djmail==0.11 django-pgjson==0.3.1 djorm-pgarray==1.2 -django-jinja==1.4.1 +django-jinja==2.1.1 jinja2==2.8 pygments==2.0.2 django-sites==0.8 -Markdown==2.6.4 +Markdown==2.6.5 fn==0.4.3 diff-match-patch==20121119 requests==2.8.1 @@ -24,7 +24,7 @@ easy-thumbnails==2.2.1 celery==3.1.19 redis==2.10.5 Unidecode==0.04.18 -raven==5.8.1 +raven==5.9.2 bleach==1.4.2 django-ipware==1.1.2 premailer==2.9.6 @@ -32,4 +32,4 @@ cssutils==1.0.1 # Compatible with python 3.5 django-transactional-cleanup==0.1.15 lxml==3.5.0b1 git+https://github.com/Xof/django-pglocks.git@dbb8d7375066859f897604132bd437832d2014ea -pyjwkest==1.0.7 +pyjwkest==1.0.9 From 73912e61288be52dddd6d204a39d25204b69505c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 21 Dec 2015 14:11:13 +0100 Subject: [PATCH 53/64] Fixing delete project dump asynch task --- taiga/export_import/api.py | 2 +- tests/integration/test_exporter_api.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py index fe422836..12f0470d 100644 --- a/taiga/export_import/api.py +++ b/taiga/export_import/api.py @@ -63,7 +63,7 @@ class ProjectExporterViewSet(mixins.ImportThrottlingPolicyMixin, GenericViewSet) if settings.CELERY_ENABLED: task = tasks.dump_project.delay(request.user, project) - tasks.delete_project_dump.apply_async((project.pk, project.slug), + tasks.delete_project_dump.apply_async((project.pk, project.slug, task.id), countdown=settings.EXPORTS_TTL) return response.Accepted({"export_id": task.id}) diff --git a/tests/integration/test_exporter_api.py b/tests/integration/test_exporter_api.py index 69f58c32..d84f29a1 100644 --- a/tests/integration/test_exporter_api.py +++ b/tests/integration/test_exporter_api.py @@ -16,6 +16,8 @@ import pytest +from unittest import mock + from django.core.urlresolvers import reverse from .. import factories as f @@ -61,10 +63,16 @@ def test_valid_project_export_with_celery_enabled(client, settings): url = reverse("exporter-detail", args=[project.pk]) - response = client.get(url, content_type="application/json") - assert response.status_code == 202 - response_data = response.data - assert "export_id" in response_data + #delete_project_dump task should have been launched + with mock.patch('taiga.export_import.tasks.delete_project_dump') as delete_project_dump_mock: + response = client.get(url, content_type="application/json") + assert response.status_code == 202 + response_data = response.data + assert "export_id" in response_data + + args = (project.id, project.slug, response_data["export_id"],) + kwargs = {"countdown": settings.EXPORTS_TTL} + delete_project_dump_mock.apply_async.assert_called_once_with(args, **kwargs) def test_valid_project_with_throttling(client, settings): From 03a5b5f39cffbd61cae2e2609996a5dcb6774012 Mon Sep 17 00:00:00 2001 From: Samuel Marks Date: Tue, 22 Dec 2015 13:03:32 +1100 Subject: [PATCH 54/64] Upgraded lxml from 3.5.0b1 to 3.5.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bb872ac8..8b54d05a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,6 +30,6 @@ django-ipware==1.1.2 premailer==2.9.6 cssutils==1.0.1 # Compatible with python 3.5 django-transactional-cleanup==0.1.15 -lxml==3.5.0b1 +lxml==3.5.0 git+https://github.com/Xof/django-pglocks.git@dbb8d7375066859f897604132bd437832d2014ea pyjwkest==1.0.9 From 7e23b5978f6a205818d7d6027894c8bf16475609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 23 Dec 2015 09:11:52 +0100 Subject: [PATCH 55/64] Logo color is blurry --- taiga/base/static/emails/logo-color.png | Bin 3903 -> 7345 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/taiga/base/static/emails/logo-color.png b/taiga/base/static/emails/logo-color.png index 49888fa4ae8ca3b90504c75210acc618da94be1d..7a1e3a9cbe65afc2cbee3756e3277057b1d22514 100644 GIT binary patch literal 7345 zcmV;i98TkjP)Fi00004b3#c}2nYxW zd z#yBPni9;p{uOuVR4ny{k9Ztd{j4~vFf$W;V?4IO=$zU5o)&Y`T2mGLA1UN5DhGc<2 z!0(4%Evcn`Rd-e0`|Tf6o0e4FT~*z(q;vc`$LCm8_wjZ8>VCiPJ`0%Tcq;kKnl16I z*G#t^<$|W$fO4?e*tQ%p^CVd4%yjcj4cEOl-8T7!m~I37;st&oL^AszLDUc-2$B!} zh_}^Dw_ScQYl#?48{Y)z?A+gi#PX`7dCzp(R1Rh(5nJM0uK{EI#Os2vW=rbXS*aJZ zP9vVmJbR|Hcr%EqobEHjoQ--ht6IcX-dZgs9xOxx0L)gsm{mk%lk^Q@oLMTJAhEnU zmAUt1*ilL)l>)P9+mznA_okZ9 z{UUd**uxftMOg(QF!pPSKyY>?g6WuFyZpBZp&f-%9x^zSq~-ws{q0BN3>*wrhhoyQ zuOZR^K_&qv5qYVk7zheFYz_&jJ+$SQ&s@RBsLJcZE(R(1h+pG;6H%869E;avnYetx zXP|+IK2g(9w?Zj|00~Hd2n@gmkx3vE1dB)*LQuMBc{XZbaSbsAAQ1#}kQI&n)-iL> zr(4j6gTh9oh(^#BzFUOv@b%VqiLqZi@K`)m1kJtE%R> zOHF~2DHtWw000(J1AmAc-PK#7PNME|+-O-u5aDP!`2j!=212!Ubqn35SImNoyHo;u zaJlDkGtcF+`zp--^#Lf82v+dz69Iq#QP3_g-`*#AW@!oD2oWa42=i`gVpYJVLZ4eHtY zw_bE>8erccY-(`0S1FnGoUxcjC?72%!zR5>J)ZN8K>=1dp({|4VQ})@Di~17p^@VZ zZ=EVa;kTZ=62Z*kH98L4f9Od-S)nUX0U`)gR+F?XJDW))`@Q5*48dTh5Y=1g3V{Ah zeH=43wiI@zS^g3MWLfXg{o%5DTmHjf7PXweR5v)LFuemUN#5gl^ z%vj8_cwJug!ZCz(+lOFgu@@zEK`A8$qOqm1=*aTH==_lgO<~vgioba=D+^)|YF;*y3jvK#GmJAt3Gb_xPRdkRo zlQf3SOva5~On&HYBBnkrsSAnW4gk- z6nzFLK9XKA*f;8`7^=IYqx`x0iVz`FDxU9(N+IW}IHMe06$2_6iysGbVIMv@ge9=U zyh9FZR2Qg#E?60}D%uk}BV(8iZhk{1JL;;^>5T8*cs|M|qGR*@t1?H7wG&-YDJV;Z z(npMfuF5v8Y&wxFsu%ga=#ru9JJef97jmx1meNyaP)Zeu^^IKdojd;Zra~>qEqrJ0 z*xC_<75tha{=Cr90G*cjElaP}Mna3Kdr6xdG1WCSEG{%SsA;07_w9ZY02ZIyEI3We z94qMKIQ>o>pLkg*C58v%iwu{ozzND$y;7+dvwB%ce7obZuf_e8D6z(^t`?khW`z~A$G!c`?5G!m?+=RYckNtYrcB*3 zEN%OJJDdC8>mUDn6f<6*tP9CRs&TN-yDM^pV)KNppk@Ld_v5NuC(d_8PWQEtIGc%m zwXliMYqgQklB(YPfwWLvbz^OP{UTtLgdKP72xXJzIQs)NL0)&?)!7ASFBr}D7J6tu z4d?Dx!WB&bTUqNbAeywq%d4w$_29m-xnsEo{e&xW0_ms+`J4-w0A+ENigUeICDIfa zbyd=|Gg?3o4j&w;aUx+fpQQc2IiM}MV6m#TYewiz5zXDpX3eU>X!)*ae1)(SJ5K`; z(F!5Zw(`=e-*V%sO16mmp8D=e7IYsm*B47Cg0vU{zGmDCfk>#}!cb3Ojur=i*#6<# z-#)VU9Mge>d<3e4eATKo?=7CUI0=lpqIfLbTyA7D35t`J?L5Tu0oWww$L@LL_MZ_Z zx11ab8n$6;NAUb2u4p1efaXENd^c&mLa)_EQbuOvcN<^(kY(7ehPeZQfLycks(saZ z&72ClqH$owL$)nl4aorLlD7KiLaxe@h>oZKWwB)Y0Rql5; ztt%=BVj_?ZLXZRk0D=%AK!gwkf?i4TOF|C5$rydu7PGRzWHPhG;4Bof3S35%IO?kI zedKFT=U+YXsY**+?1XACA=%H^UfH5NO-tyf= zy2cLxbiou?UKq?o;scUKdJ=VieCDnBR@SP>c$lW?e8~lu4$Nt2N`g5HCi5gb>=NJ} zDfPQL9{n$GQODB{v`Fwj`F2H9fcWuv%^&~In;*7K>3`dR12j#S7oL0Z`%R7WDzam! zGGJ2?HtLeq0s=g*wwp?fdW_2N@1tDFGYAaWg2jmT%Co!QzT)~dd!W=O36<>!c(;lP zj8L#H7@V_Yjv3uISj$pXgb+<={E72E8J*kEB$=TRz^L3N7@y$3WJ&z}w>RGQ#)%*K z@aBhW6S{d1fVQcvn>7XktT@P{GhhK$2!c5yAKbokTy;)~JAV4Tb0zoz0-VS9ohp#3M%ui9 z6$gRJ4F2Vih$h9Gzxs1XdL%;=8h`w}i@lRj3dB-Cn1X14gqC!lkq_vwzj@cjI}S{| z;}{xteBthQ8|>hh0PJ#Gg<`H@rK&4U0ssW6szw%`yZC*f30XSzD1;Dl+0qs7g@VC> zO4|b_O)*z9*!2LSBKd-h)!pbs0^lMtx%a92uM;Hx5k*#D1AuMH#Vl1t#h#fs9yOwg z{`4Re!x%AYd;fg&9F(w|0A8|m#lAUp^>F~G4%O7xRW~dWtX1?S5rl-M1&S^%E98nM zl~t;;?|kuF&k4|%QF2F&yER2_AuU+ZgCmC%y{SQ{(V#OEPu1&HdKM@gg%ZGeAec=h z;wJ|BjBGj)OAH=TY?Zafbt1UPV(76H2LjM;E=2<1az3K#+0KDaUAuOhCG4dDo#m89 zS!w|)v??T%v=ak|hL74Ad1Ce}9ZS?FdPWu!5tB|z*-FENmXRYtkWiLwg#<`eRaa*K zK(Uf((-_f669FyYdqc{E`h*bLpwm4?@&y&E|N6In*dBGd?@*RE-22r1*9jr+#JHWC zEG)x5$7@*=!AzWpW(MND$#H(&%$ULG`@Jh5KUgoNSP45LgTRTsZyXpSA(w^-+}ynM zaBX$}@sMJUGGRy% zSwd)&Y+%KjX=a1<^$p_)u9T}HB7;a|yt<-E<@hxqhkKv8|2k#y!z@+l69FcmkSod| zHJEG|J~~ivy_B7`4=bh806-+Ff`Q-}h0>nZG_S9zsmXDExg1v|hqdiM(>Ac6m zmX5$lT^!`+NR3!quWjgg*_ zRID3NN|0EJ3b^>PiCEv>UPHj>DsaU}^czEi`$i7g7LR)<(o$CRVEk|)J;)(7m~1cx zlcggt#giVo!sKfckv7tGL&LG6tJV!OH4;nqAGDP|4mO)H`+%){weZ$L}OESW95 zafan`0Dp8-cOjJBBBYJw1#c=wCT^A_0RVA1HC?2mU}9T2r2yg#$a_YTisYYTsq}s zaFMNItR_cOZctraldP$(^SuI4+1B(Cp{TrQp=rguUcD;defqM94)|#iLes3~`OV#; zjDZSL+Vl~jtMVcy0&&xd1;du8>|ZNGay5lAMrI4l3I&ITa~wYd|VF zsFX@Ds|*~@fXeAYh0F&5wdI7cz6bqI)8#TKtx`+pO#wukmd<;-@4fEJSt`X0im^KLYQCz-{Odh?cWueP^w?96#R0?tyfZQRWRk=ZhB}Lw<oxep)Ic ziu6qcF%1yWPZZ=ao%ACqq9Z@wxUnMNlW1Pi_%A(&uU2iiu*_g3J0Kn0n1N)aRK5GGp&Mm7T=3no5 zZP!B;GHXgOqd$=e0E<@4d58huUsGgopYBl?rUNrpBl6)}FJ`zdWmQB^7SRhEz^$`E7xFP{TvHC+-TULq7M*pRh{8_y1&bfNx_8H{ z(1m==IwAnzX!rgDj(Wk^^XlFm-=7|<%EPSEhd_{H<302Tsx0|h>5$;>55Wac{nT)Jn^o>c%`b;y)bI)E?{ zz3wJ`YisL=nR%m9>S_Q65xuOG`T-FQ0LU_P6%nmq=KloXRw2aKgb;56_&D4Tm$U=8 zkeP1*@Xs#uj6*>pB9X`yh33N^-vA^5{I^sp^~2x(_O}H$-M6*1)k-NpD})HZB?)WSt_@k1brVKO{c=Y~$9LSe z?tE1A>}`)|2QUcW#{lkVX=$0))zww86DeC;TW?_IO#uF&Y1%bAckV2?^ncf`T`2&Y zywqdc_H_W}0k{*u!+ZAZX$4U748Mt(7NJ_detivqFER5k0Bi;j(lqVHN|hfDhd;{9 zKL+rYZQCo|kl+{0+)hMq+qV4(fG81t)lWIoLPRE$`5b^oP1Bx^L?Z71c!P+(Qo$^{2qB&T5L8NeZrvxHh}ElC ze+;7{{ga%iNhyB{z*I{4YS#IXQrgqZM0587y;_Cq3 z!f5c}X|Cs_6G23O2S6&Np2%Gr6X|V4v>_Z0mvx#l5w!t0GS#iYvaHVlm`6n8`Z7fH z1b}l^uU>t*m-0?35jl|tuzmOL-QzyuI_92giRf?rmfzCS(umQ$Y`-tZPM2s0&^I(R z^sD@fN~tFS*j`2Zq!M8m#`PHOC_X;%o|JM2fF5S{?Vf_cVD6+G-}@BYU`(X11n|Tk z{_ux!Tgy5-JNuY7Nfmx*Dy^ps_VMN%#J7e=YgMp{`r{Gja92wB}MTAk#i4! z!`Q!4_$q*zL4;u#pU3F1^YxKPq~O~Ij7C1Xu6JYf2Y4c)tE(&1+S>XCGhf`&(xQ7A z%65acwzhMXQda_aBoc|-Q7U~n9R3ex{z6Mj%RiRt;h(IisU1MHsj2Cgr4n{^bqxb} z4!{*{ZEc>nY%%l80BUtzugu=NJSe5w0g#k(Qq<>!u|7tP%oo0ndC>1{W8EX#TdK-x{8 zV#kG&2&Dh!5 z**CU;;o7UNx@yIa9Xk$r$-jH|?%%9hwdxWf#M1yCG7RI+a5(%k053}^->Ryr8j@0` zZQE`nqSJ`z3;Q_o7g%HPx=uZHC3E*lXdI`W) zO-)VD0w+ZJCIGMd8Fm2xUDr1QFpIe-Uo9e)O5HPe?%ew$kx0Q)A%zg{>bgF+rl!XC z$&sC%ojcd9TQ@hAN}U*3i$o&vb?es69U2;PdnhCC+O=yNfNd=;EqW*vI$uiJ4B)h} z4@PCAl*fr^e`jasq|?mi&!2Cl)9DWhA&Q?5UIg2>Z;!5ByLP@|7&BrG)hV39%*X!+ X)SO`l8$SSr00000NkvXXu0mjfT&L#d literal 3903 zcmV-F55Vw=P) z2&n05g090fGg$nt%><@1v#C-Er%3;O~`m z3n>WP)7E7Ej^#0yTZU0$7wiKlA^}hBv?caK-|DQ6I-u(8%zXnEu6mS4|9oVsM`JHc;k?^&^Ccv$6hybt| zc&4q%ECwZjOVn{0Fb}8)0&QRW!e?v65S*k&^r?YP2j&C62WXq$epmo;U_?zwtgb%% zzVzkoLK6wVQ<5z=0(Ae};})>e)IXI@ z>p-<<>YE#9g(BhR8hwT=09)k3Xkd|?S%b~LIVFJCEx$7lI9NftenWHP8AvH70XR^0 z&`-#DRotou?3_xKt_WBNp(RJ-y;Z#b2lqU}72Cchda9_k2D~w4fY&X*Ggj@HbUZbj zO=m_bXhGxnAD4y-mKo=esOFH;ZD0FBYN{ix364wpQY(_580#PE@jbt!SCzhODgazx zBDRJME-z^ZOFXNcjKexn!0(OoJL)wjb|;rQBhHKom^Dos=^xxDggCB$U-}INDqUZ4 zgcr2k1SYEb=x}`Yk)C7A;-iVv3oZ{#8{p)D)WURc`fNaEj%Md2_odFAAPvv=#s)_Y z9%rMHa9M|?A=n`f7YnxUaR1`?XmXAa!XF(@oEhsKJXZ)IryTI@U%eZ5%-tJ*FR{!| z`xB(&XZ=WgS7MoT<+xMJrqZLCL~5X<!sc=ywM#hdx-=7dmYe7v) zUrJ=b_(`(7A`T%y2;|66d`{ny{>4&CQ7*uV^$y%FrM%;m0$#s$Q~vxYaF3MIt(J6T zW7#v4`%??ia-c_!4ek}12mojSjVG>o^5Q4|=&6g{tSiP<`9*C%TCU%|BLj;PW63$y z5+CWy6tHIF+OFAjB^az=%&%Qvp=dTHa@uJZsk zuI-u}-~y@Mq>}d;1q}Ge+R{Dg%Rq8}YEgE;X-UUZsV$#>y532Buv%r4S+?HtFOkgN zY+__MJ~!4oc%GE9CNq;rM|pyL4Bi0z$Hui?w{mjx{x`_=p-OKu|n_7Wqfl&2H&H)sf2%`}}5D}UP13?5K1VK0BieGfST<^Jl z#m+*(5LbW7NQHu-JSbO6=^)8SDbv31r;%h8$D)Sfg$u0i=xpD;acvhJo$bdUH* z*8$%Jk|$X@l7MtlPT-f1zjBf9)uyHaE#O}D$Ihd=MBu z1z-h|U?>s_gc|B(tq<1Kg$dV%11dogH8`$nGywc>RU2Nvb(0Ouu3ZIHYos_%ONxMtjw7b}Ky!pQC&y=}(#dzIGO3CFn zUzQ5i1X zv;Br*uvM#;>$h%Nq#RgbJKssU%O{~$BDQyAUuG&770xNf7sF4eyq?@)f{+ixar9z!jCi)>N0y2O+>+ zz%A03(#?41SF$4^5b^%>z|i4%AAp;2LVfQXI-gvILpGTW15P*`$*aAXKkuA<^^y7% zKvSf-r76;UMin2Tg|yHv6?{C{(b-;8cv*G1*l^Rm`SU}-O$GJg(qJ{A9osv)fACQJ zs0si@->$=p@?aIc3A~k`G$DlSJ$kq`e>0vQ8yJZ9?=6*2PY5lMA>hW2&i3v~;p7Rw zc>q}R*MD`xtk%<>3WWpV5)oDA*!v>~eAo9Bct7@D@4`$X-8dn+NM_#!{BSsY0f=$) z2-k&E3(i@%*Y|xbUn85{Jf}6F1tZ0LyPlICN(`=l^atOaRDL+=0)UhD&g*-3XivO9 zH6S#h0i9}L)fMcoASk}!XXEdBXe>gsPDC1_5 zLI|N^g()xbEE$gqMze{Yo&9g8Ml$h&%q3S{+jF$F7_6#e#mB+>e#wgCk)wxNi&Z$| zWRiWuM|Nf1Y$`8ppk+D$pEIF@fCv;hEg9S0+vT~4C(ClI-RRlOuAmOq}itD;{{R92gsvePB+txKqrG#56 z0oDSVACHa9E|yHOvnl|bskFomj||Q!SJN6VM!-cM8ere^wU%?wI9P?rLMNphS81Ae z*4g_jOdhH@anY@9>!uWN#Y`pK6iGF{>se<4}An|?IFMj7FeBT>m;tl}<+u#U$L^joslvXR zrxNfIU^}^YvOCGWSQ`Vzwmj68C~mxJrLh|LA-QcyH5EOil(#+p^n)?rr|JOU*0yzx z3S5)Yw2RcSbTR;Hj-^-M)h@O?)Fq3qvE`x4LHnweMw`mCWDVx^!)@E``ztlNwQU{6 zHe2f2DN7zEL#tLAY};~{&N1AsiG<0dbnz(0l6JMFISMVR5kFi zsRTPMfD3>xP<686ibe$Z%C_zHYtz9;V7dSwJiKRQ!TiM;;FCoY{!iPs+s{uIAKElZ zm~GqbCspk`PlvW`w;xezKP@z^p8ym%v0swgC;4e0KGk;nq0_3B#++3vjfMQK&~&Qs z$Mi9MOdr$lE*ZM{TgQ_ybn}uLBeFN_sO6OyU;)qrNIPm(Vq^|*wjH(JsKl%twJ>yZ z7H~1SGOSDP<@T#~)bjIfD)bQnX4z5eNVx*Q>orbZ3ouyXx()ouj#}TW^8B9w-!B!; z7Jyi0=;ouqXVfjPFy1$G^BLgJ$$eE*j-FN7*XPSgZb`whh}<5JOwskFwuFGDx~*w9VS z(9KapH@|u+YFdSZ)&U*B-M|-t7l1h@(9fm7I^YRAYTW{qw9)*vQukCp0_X;wQkwKQ z@Wd%e57nTT00}#4bpi&^V(8|)6X@r0U@Q;zB>0)3K;LCYt#&{fy7}o-nGbJ8ePCfn ztpqRx{LLgKTu-j@xQ>&je+7mWF917$^(PHjIjcp$xxfwA*FKRb!;R;Y7NrM0yN zey#_ScGP+`@Ad7d^`ct8Z#gNaW$0!I_y+I~hHkDXxFvzzz?0;@K|JZ&nxUJws{o|1 z-Tijd+FjK22f#~tew2hI@S@VZ`%cD7e^H%pQ%5OAF9CMcAhrBwbc+n#e5*wJ6$Kh2 zfyK%T?=Ap#p_+)R$?Xg(#m{PBiygI22=KSn%w1o?B(iGIwRY56T|-}6l$XBFj#_V( z2uN-(x+aU&+0f1JliQTGtPDT@3AEc$Ys;i0tY-6K6?uIH7%i5FYSRteXXxf%p!o^= zXU|o#zpSB~JAn;~@pPs2w!~O-)sncT0zX~AzZtr@5ZJFx(mC7(?6;%VugV1ncGUVd zxi@{cRRUYU&>E$ZKUWf)3_o91K%c6>&%cxVnEN|+)S9%H{!^uf)#%460;|fj%AURf zTw&{5uTaE3mpR7vf7x8b^Ahiv^Yld!K1H4d8J?*IVfT5fFltbEQ=;k2s zDDW;YQ?0MpsOGL3=Q_pzni|-D4EUCzn_n*_;W(u~Gyf9slpVEX4N`j@coq1|0 Date: Mon, 4 Jan 2016 08:50:03 +0100 Subject: [PATCH 56/64] Update license message --- settings/__init__.py | 6 +++--- settings/celery.py | 6 +++--- settings/common.py | 6 +++--- settings/development.py | 6 +++--- settings/local.py.example | 6 +++--- settings/sr.py | 6 +++--- settings/testing.py | 6 +++--- settings/travis.py | 6 +++--- taiga/__init__.py | 6 +++--- taiga/auth/api.py | 6 +++--- taiga/auth/backends.py | 6 +++--- taiga/auth/permissions.py | 4 ++-- taiga/auth/serializers.py | 6 +++--- taiga/auth/services.py | 6 +++--- taiga/auth/signals.py | 6 +++--- taiga/auth/tokens.py | 6 +++--- taiga/base/__init__.py | 6 +++--- taiga/base/api/__init__.py | 6 +++--- taiga/base/api/authentication.py | 6 +++--- taiga/base/api/fields.py | 6 +++--- taiga/base/api/generics.py | 6 +++--- taiga/base/api/mixins.py | 6 +++--- taiga/base/api/negotiation.py | 6 +++--- taiga/base/api/pagination.py | 6 +++--- taiga/base/api/parsers.py | 6 +++--- taiga/base/api/permissions.py | 6 +++--- taiga/base/api/relations.py | 6 +++--- taiga/base/api/renderers.py | 6 +++--- taiga/base/api/request.py | 6 +++--- taiga/base/api/reverse.py | 6 +++--- taiga/base/api/serializers.py | 8 ++++---- taiga/base/api/settings.py | 8 ++++---- taiga/base/api/static/api/css/bootstrap-tweaks.css | 6 +++--- taiga/base/api/static/api/css/default.css | 6 +++--- taiga/base/api/static/api/css/prettify.css | 6 +++--- taiga/base/api/static/api/js/default.js | 6 +++--- taiga/base/api/static/api/js/prettify-min.js | 6 +++--- taiga/base/api/templatetags/api.py | 6 +++--- taiga/base/api/throttling.py | 6 +++--- taiga/base/api/urlpatterns.py | 6 +++--- taiga/base/api/urls.py | 6 +++--- taiga/base/api/utils.py | 6 +++--- taiga/base/api/utils/__init__.py | 6 +++--- taiga/base/api/utils/breadcrumbs.py | 6 +++--- taiga/base/api/utils/encoders.py | 6 +++--- taiga/base/api/utils/formatting.py | 6 +++--- taiga/base/api/utils/mediatypes.py | 6 +++--- taiga/base/api/views.py | 6 +++--- taiga/base/api/viewsets.py | 6 +++--- taiga/base/apps.py | 6 +++--- taiga/base/connectors/exceptions.py | 6 +++--- taiga/base/decorators.py | 6 +++--- taiga/base/exceptions.py | 8 ++++---- taiga/base/fields.py | 6 +++--- taiga/base/filters.py | 6 +++--- taiga/base/formats/en/formats.py | 6 +++--- taiga/base/formats/es/formats.py | 6 +++--- taiga/base/mails.py | 6 +++--- taiga/base/management/commands/test_emails.py | 6 +++--- taiga/base/middleware/cors.py | 6 +++--- taiga/base/neighbors.py | 8 ++++---- taiga/base/response.py | 8 ++++---- taiga/base/routers.py | 6 +++--- taiga/base/status.py | 8 ++++---- taiga/base/storage.py | 6 +++--- taiga/base/tags.py | 8 ++++---- taiga/base/throttling.py | 6 +++--- taiga/base/utils/contenttypes.py | 6 +++--- taiga/base/utils/db.py | 6 +++--- taiga/base/utils/dicts.py | 6 +++--- taiga/base/utils/diff.py | 6 +++--- taiga/base/utils/functions.py | 8 ++++---- taiga/base/utils/iterators.py | 8 ++++---- taiga/base/utils/json.py | 6 +++--- taiga/base/utils/sequence.py | 6 +++--- taiga/base/utils/signals.py | 8 ++++---- taiga/base/utils/slug.py | 6 +++--- taiga/base/utils/text.py | 6 +++--- taiga/base/utils/urls.py | 8 ++++---- taiga/celery.py | 6 +++--- taiga/contrib_routers.py | 6 +++--- taiga/deferred.py | 6 +++--- taiga/events/__init__.py | 6 +++--- taiga/events/apps.py | 6 +++--- taiga/events/backends/__init__.py | 6 +++--- taiga/events/backends/base.py | 2 +- taiga/events/backends/postgresql.py | 2 +- taiga/events/backends/rabbitmq.py | 2 +- taiga/events/events.py | 2 +- taiga/events/middleware.py | 2 +- taiga/events/signal_handlers.py | 6 +++--- taiga/export_import/api.py | 6 +++--- taiga/export_import/dump_service.py | 6 +++--- taiga/export_import/management/commands/dump_project.py | 6 +++--- taiga/export_import/management/commands/load_dump.py | 6 +++--- taiga/export_import/mixins.py | 6 +++--- taiga/export_import/permissions.py | 6 +++--- taiga/export_import/renderers.py | 6 +++--- taiga/export_import/serializers.py | 6 +++--- taiga/export_import/service.py | 6 +++--- taiga/export_import/tasks.py | 6 +++--- taiga/export_import/throttling.py | 6 +++--- taiga/external_apps/admin.py | 6 +++--- taiga/external_apps/api.py | 6 +++--- taiga/external_apps/auth_backends.py | 6 +++--- taiga/external_apps/encryption.py | 6 +++--- taiga/external_apps/models.py | 6 +++--- taiga/external_apps/permissions.py | 6 +++--- taiga/external_apps/serializers.py | 6 +++--- taiga/external_apps/services.py | 6 +++--- taiga/feedback/__init__.py | 6 +++--- taiga/feedback/admin.py | 6 +++--- taiga/feedback/api.py | 6 +++--- taiga/feedback/apps.py | 6 +++--- taiga/feedback/models.py | 6 +++--- taiga/feedback/permissions.py | 6 +++--- taiga/feedback/routers.py | 6 +++--- taiga/feedback/serializers.py | 6 +++--- taiga/feedback/services.py | 6 +++--- taiga/front/sitemaps/__init__.py | 4 ++-- taiga/front/sitemaps/base.py | 4 ++-- taiga/front/sitemaps/generics.py | 4 ++-- taiga/front/sitemaps/issues.py | 4 ++-- taiga/front/sitemaps/milestones.py | 4 ++-- taiga/front/sitemaps/projects.py | 4 ++-- taiga/front/sitemaps/tasks.py | 4 ++-- taiga/front/sitemaps/users.py | 4 ++-- taiga/front/sitemaps/userstories.py | 4 ++-- taiga/front/sitemaps/wiki.py | 4 ++-- taiga/front/templatetags/functions.py | 6 +++--- taiga/front/urls.py | 6 +++--- taiga/hooks/api.py | 6 +++--- taiga/hooks/bitbucket/api.py | 6 +++--- taiga/hooks/bitbucket/event_hooks.py | 6 +++--- taiga/hooks/bitbucket/services.py | 6 +++--- taiga/hooks/event_hooks.py | 6 +++--- taiga/hooks/exceptions.py | 6 +++--- taiga/hooks/github/api.py | 6 +++--- taiga/hooks/github/event_hooks.py | 6 +++--- taiga/hooks/github/services.py | 6 +++--- taiga/hooks/gitlab/api.py | 6 +++--- taiga/hooks/gitlab/event_hooks.py | 6 +++--- taiga/hooks/gitlab/services.py | 6 +++--- taiga/locale/api.py | 6 +++--- taiga/locale/permissions.py | 6 +++--- taiga/mdrender/__init__.py | 6 +++--- taiga/mdrender/extensions/target_link.py | 8 ++++---- taiga/mdrender/extensions/wikilinks.py | 8 ++++---- taiga/mdrender/service.py | 6 +++--- taiga/mdrender/templatetags/functions.py | 6 +++--- taiga/permissions/permissions.py | 8 ++++---- taiga/permissions/service.py | 8 ++++---- taiga/projects/__init__.py | 6 +++--- taiga/projects/admin.py | 6 +++--- taiga/projects/api.py | 6 +++--- taiga/projects/apps.py | 6 +++--- taiga/projects/attachments/__init__.py | 6 +++--- taiga/projects/attachments/admin.py | 6 +++--- taiga/projects/attachments/api.py | 6 +++--- taiga/projects/attachments/apps.py | 6 +++--- taiga/projects/attachments/models.py | 6 +++--- taiga/projects/attachments/permissions.py | 6 +++--- taiga/projects/attachments/serializers.py | 6 +++--- taiga/projects/attachments/services.py | 2 +- taiga/projects/choices.py | 6 +++--- taiga/projects/custom_attributes/admin.py | 6 +++--- taiga/projects/custom_attributes/api.py | 6 +++--- taiga/projects/custom_attributes/choices.py | 6 +++--- taiga/projects/custom_attributes/models.py | 6 +++--- taiga/projects/custom_attributes/permissions.py | 6 +++--- taiga/projects/custom_attributes/serializers.py | 6 +++--- taiga/projects/custom_attributes/services.py | 6 +++--- taiga/projects/custom_attributes/signals.py | 6 +++--- taiga/projects/history/api.py | 6 +++--- taiga/projects/history/choices.py | 2 +- taiga/projects/history/freeze_impl.py | 6 +++--- taiga/projects/history/mixins.py | 6 +++--- taiga/projects/history/models.py | 2 +- taiga/projects/history/permissions.py | 6 +++--- taiga/projects/history/serializers.py | 6 +++--- taiga/projects/history/services.py | 2 +- taiga/projects/history/templatetags/functions.py | 6 +++--- taiga/projects/issues/__init__.py | 6 +++--- taiga/projects/issues/admin.py | 6 +++--- taiga/projects/issues/api.py | 6 +++--- taiga/projects/issues/apps.py | 6 +++--- taiga/projects/issues/models.py | 6 +++--- taiga/projects/issues/permissions.py | 6 +++--- taiga/projects/issues/serializers.py | 6 +++--- taiga/projects/issues/services.py | 6 +++--- taiga/projects/issues/signals.py | 6 +++--- taiga/projects/likes/admin.py | 6 +++--- taiga/projects/likes/mixins/serializers.py | 6 +++--- taiga/projects/likes/mixins/viewsets.py | 6 +++--- taiga/projects/likes/models.py | 8 ++++---- taiga/projects/likes/serializers.py | 8 ++++---- taiga/projects/likes/services.py | 8 ++++---- taiga/projects/likes/utils.py | 8 ++++---- taiga/projects/management/commands/sample_data.py | 6 +++--- taiga/projects/milestones/admin.py | 6 +++--- taiga/projects/milestones/api.py | 6 +++--- taiga/projects/milestones/models.py | 6 +++--- taiga/projects/milestones/permissions.py | 6 +++--- taiga/projects/milestones/serializers.py | 6 +++--- taiga/projects/milestones/services.py | 6 +++--- taiga/projects/mixins/blocked.py | 6 +++--- taiga/projects/mixins/on_destroy.py | 6 +++--- taiga/projects/mixins/ordering.py | 6 +++--- taiga/projects/models.py | 6 +++--- taiga/projects/notifications/admin.py | 6 +++--- taiga/projects/notifications/api.py | 6 +++--- taiga/projects/notifications/choices.py | 6 +++--- .../management/commands/send_notifications.py | 6 +++--- taiga/projects/notifications/mixins.py | 6 +++--- taiga/projects/notifications/models.py | 6 +++--- taiga/projects/notifications/permissions.py | 6 +++--- taiga/projects/notifications/serializers.py | 6 +++--- taiga/projects/notifications/services.py | 6 +++--- taiga/projects/notifications/utils.py | 8 ++++---- taiga/projects/notifications/validators.py | 6 +++--- taiga/projects/occ/__init__.py | 6 +++--- taiga/projects/occ/mixins.py | 6 +++--- taiga/projects/permissions.py | 6 +++--- taiga/projects/references/api.py | 6 +++--- taiga/projects/references/models.py | 6 +++--- taiga/projects/references/permissions.py | 6 +++--- taiga/projects/references/sequences.py | 6 +++--- taiga/projects/references/serializers.py | 6 +++--- taiga/projects/references/services.py | 6 +++--- taiga/projects/serializers.py | 6 +++--- taiga/projects/services/__init__.py | 6 +++--- taiga/projects/services/bulk_update_order.py | 6 +++--- taiga/projects/services/filters.py | 6 +++--- taiga/projects/services/modules_config.py | 6 +++--- taiga/projects/services/stats.py | 6 +++--- taiga/projects/services/tags_colors.py | 6 +++--- taiga/projects/signals.py | 6 +++--- taiga/projects/tasks/__init__.py | 6 +++--- taiga/projects/tasks/admin.py | 6 +++--- taiga/projects/tasks/api.py | 6 +++--- taiga/projects/tasks/apps.py | 6 +++--- taiga/projects/tasks/models.py | 6 +++--- taiga/projects/tasks/permissions.py | 6 +++--- taiga/projects/tasks/serializers.py | 6 +++--- taiga/projects/tasks/services.py | 6 +++--- taiga/projects/tasks/signals.py | 6 +++--- taiga/projects/translations.py | 6 +++--- taiga/projects/userstories/__init__.py | 6 +++--- taiga/projects/userstories/admin.py | 6 +++--- taiga/projects/userstories/api.py | 6 +++--- taiga/projects/userstories/apps.py | 6 +++--- taiga/projects/userstories/models.py | 6 +++--- taiga/projects/userstories/permissions.py | 6 +++--- taiga/projects/userstories/serializers.py | 6 +++--- taiga/projects/userstories/services.py | 6 +++--- taiga/projects/userstories/signals.py | 6 +++--- taiga/projects/userstories/validators.py | 6 +++--- taiga/projects/validators.py | 6 +++--- taiga/projects/votes/admin.py | 6 +++--- taiga/projects/votes/mixins/serializers.py | 6 +++--- taiga/projects/votes/mixins/viewsets.py | 6 +++--- taiga/projects/votes/models.py | 8 ++++---- taiga/projects/votes/serializers.py | 8 ++++---- taiga/projects/votes/services.py | 8 ++++---- taiga/projects/votes/utils.py | 8 ++++---- taiga/projects/wiki/admin.py | 6 +++--- taiga/projects/wiki/api.py | 6 +++--- taiga/projects/wiki/models.py | 6 +++--- taiga/projects/wiki/permissions.py | 6 +++--- taiga/projects/wiki/serializers.py | 6 +++--- taiga/routers.py | 6 +++--- taiga/searches/api.py | 6 +++--- taiga/searches/serializers.py | 6 +++--- taiga/searches/services.py | 6 +++--- taiga/stats/__init__.py | 2 +- taiga/stats/api.py | 2 +- taiga/stats/apps.py | 2 +- taiga/stats/permissions.py | 2 +- taiga/stats/routers.py | 2 +- taiga/stats/services.py | 2 +- taiga/timeline/__init__.py | 6 +++--- taiga/timeline/api.py | 6 +++--- taiga/timeline/apps.py | 6 +++--- .../commands/_clear_unnecessary_new_membership_entries.py | 6 +++--- .../commands/_rebuild_timeline_for_user_creation.py | 6 +++--- .../commands/_update_timeline_for_updated_tasks.py | 6 +++--- taiga/timeline/management/commands/rebuild_timeline.py | 6 +++--- .../commands/rebuild_timeline_iterating_per_projects.py | 6 +++--- taiga/timeline/models.py | 6 +++--- taiga/timeline/permissions.py | 6 +++--- taiga/timeline/serializers.py | 6 +++--- taiga/timeline/service.py | 6 +++--- taiga/timeline/signals.py | 6 +++--- taiga/timeline/timeline_implementations.py | 6 +++--- taiga/urls.py | 6 +++--- taiga/users/admin.py | 6 +++--- taiga/users/api.py | 6 +++--- taiga/users/filters.py | 6 +++--- taiga/users/forms.py | 6 +++--- taiga/users/gravatar.py | 8 ++++---- taiga/users/models.py | 6 +++--- taiga/users/permissions.py | 6 +++--- taiga/users/serializers.py | 6 +++--- taiga/users/services.py | 6 +++--- taiga/users/signals.py | 6 +++--- taiga/users/validators.py | 8 ++++---- taiga/userstorage/api.py | 6 +++--- taiga/userstorage/filters.py | 6 +++--- taiga/userstorage/models.py | 6 +++--- taiga/userstorage/permissions.py | 6 +++--- taiga/userstorage/serializers.py | 6 +++--- taiga/webhooks/__init__.py | 6 +++--- taiga/webhooks/api.py | 6 +++--- taiga/webhooks/apps.py | 6 +++--- taiga/webhooks/models.py | 6 +++--- taiga/webhooks/permissions.py | 6 +++--- taiga/webhooks/serializers.py | 6 +++--- taiga/webhooks/signal_handlers.py | 6 +++--- taiga/webhooks/tasks.py | 4 ++-- tests/conftest.py | 8 ++++---- tests/factories.py | 8 ++++---- tests/fixtures.py | 8 ++++---- .../test_issues_custom_attributes_resource.py | 6 +++--- .../test_tasks_custom_attributes_resource.py | 6 +++--- .../test_userstories_custom_attributes_resource.py | 6 +++--- tests/integration/test_auth_api.py | 8 ++++---- tests/integration/test_custom_attributes_issues.py | 6 +++--- tests/integration/test_custom_attributes_tasks.py | 6 +++--- tests/integration/test_custom_attributes_user_stories.py | 6 +++--- tests/integration/test_exporter_api.py | 6 +++--- tests/integration/test_history.py | 8 ++++---- tests/integration/test_importer_api.py | 6 +++--- tests/integration/test_mdrender.py | 8 ++++---- tests/integration/test_milestones.py | 8 ++++---- tests/integration/test_neighbors.py | 8 ++++---- tests/integration/test_notifications.py | 8 ++++---- tests/integration/test_occ.py | 6 +++--- tests/integration/test_references_sequences.py | 8 ++++---- tests/integration/test_roles.py | 8 ++++---- tests/integration/test_searches.py | 8 ++++---- tests/integration/test_throwttling.py | 6 +++--- tests/integration/test_timeline.py | 8 ++++---- tests/integration/test_us_autoclosing.py | 8 ++++---- tests/integration/test_userstorage_api.py | 8 ++++---- tests/integration/test_vote_issues.py | 8 ++++---- tests/integration/test_vote_tasks.py | 8 ++++---- tests/integration/test_vote_userstories.py | 8 ++++---- tests/integration/test_votes.py | 8 ++++---- tests/integration/test_watch_issues.py | 8 ++++---- tests/integration/test_watch_milestones.py | 8 ++++---- tests/integration/test_watch_projects.py | 8 ++++---- tests/integration/test_watch_tasks.py | 8 ++++---- tests/integration/test_watch_userstories.py | 8 ++++---- tests/integration/test_watch_wikipages.py | 8 ++++---- tests/integration/test_webhooks.py | 8 ++++---- tests/models.py | 8 ++++---- tests/unit/conftest.py | 8 ++++---- tests/unit/test_base_api_permissions.py | 6 +++--- tests/unit/test_deferred.py | 6 +++--- tests/unit/test_export.py | 6 +++--- tests/unit/test_gravatar.py | 6 +++--- tests/unit/test_mdrender.py | 8 ++++---- tests/unit/test_permissions.py | 6 +++--- tests/unit/test_slug.py | 8 ++++---- tests/unit/test_timeline.py | 8 ++++---- tests/unit/test_tokens.py | 8 ++++---- tests/unit/test_utils.py | 6 +++--- tests/utils.py | 8 ++++---- 368 files changed, 1121 insertions(+), 1121 deletions(-) diff --git a/settings/__init__.py b/settings/__init__.py index fb18d127..d7cec60a 100644 --- a/settings/__init__.py +++ b/settings/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/celery.py b/settings/celery.py index 70cd1095..e157da58 100644 --- a/settings/celery.py +++ b/settings/celery.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/common.py b/settings/common.py index e1500ce8..b937b7e1 100644 --- a/settings/common.py +++ b/settings/common.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/development.py b/settings/development.py index 1a77df9d..8eb52f12 100644 --- a/settings/development.py +++ b/settings/development.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/local.py.example b/settings/local.py.example index b6bcf2b9..2a6ce20a 100644 --- a/settings/local.py.example +++ b/settings/local.py.example @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/sr.py b/settings/sr.py index 9c523878..f0a04360 100644 --- a/settings/sr.py +++ b/settings/sr.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/testing.py b/settings/testing.py index 01eff7c5..ee648e05 100644 --- a/settings/testing.py +++ b/settings/testing.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/settings/travis.py b/settings/travis.py index 20920546..9b041643 100644 --- a/settings/travis.py +++ b/settings/travis.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/__init__.py b/taiga/__init__.py index 721fcd42..8cca4ea3 100644 --- a/taiga/__init__.py +++ b/taiga/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/api.py b/taiga/auth/api.py index c70e7e7f..03994310 100644 --- a/taiga/auth/api.py +++ b/taiga/auth/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/backends.py b/taiga/auth/backends.py index d2f71553..3bf9b971 100644 --- a/taiga/auth/backends.py +++ b/taiga/auth/backends.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/permissions.py b/taiga/auth/permissions.py index 7fe0d452..38ef4662 100644 --- a/taiga/auth/permissions.py +++ b/taiga/auth/permissions.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 Andrey Antukh # Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh # Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/serializers.py b/taiga/auth/serializers.py index 42b077e7..7a33e7ea 100644 --- a/taiga/auth/serializers.py +++ b/taiga/auth/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/services.py b/taiga/auth/services.py index 73b65b5d..70da5281 100644 --- a/taiga/auth/services.py +++ b/taiga/auth/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/signals.py b/taiga/auth/signals.py index 2f674fe1..90cba30f 100644 --- a/taiga/auth/signals.py +++ b/taiga/auth/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/auth/tokens.py b/taiga/auth/tokens.py index a24b91e4..b35fb771 100644 --- a/taiga/auth/tokens.py +++ b/taiga/auth/tokens.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/__init__.py b/taiga/base/__init__.py index 6aa21c11..9ad96b3a 100644 --- a/taiga/base/__init__.py +++ b/taiga/base/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/__init__.py b/taiga/base/api/__init__.py index f8457cd1..c377aeef 100644 --- a/taiga/base/api/__init__.py +++ b/taiga/base/api/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/authentication.py b/taiga/base/api/authentication.py index ad83bdbf..693b17c8 100644 --- a/taiga/base/api/authentication.py +++ b/taiga/base/api/authentication.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/fields.py b/taiga/base/api/fields.py index ad05e422..465fbf8e 100644 --- a/taiga/base/api/fields.py +++ b/taiga/base/api/fields.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/generics.py b/taiga/base/api/generics.py index 2315bfc1..db1e0e0b 100644 --- a/taiga/base/api/generics.py +++ b/taiga/base/api/generics.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/mixins.py b/taiga/base/api/mixins.py index 371b44c7..d8a32342 100644 --- a/taiga/base/api/mixins.py +++ b/taiga/base/api/mixins.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/negotiation.py b/taiga/base/api/negotiation.py index f4984a11..7749d48e 100644 --- a/taiga/base/api/negotiation.py +++ b/taiga/base/api/negotiation.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/pagination.py b/taiga/base/api/pagination.py index e501ec9c..19d58f97 100644 --- a/taiga/base/api/pagination.py +++ b/taiga/base/api/pagination.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/parsers.py b/taiga/base/api/parsers.py index 3b254633..6799ce13 100644 --- a/taiga/base/api/parsers.py +++ b/taiga/base/api/parsers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/permissions.py b/taiga/base/api/permissions.py index d9e052fd..fabf161e 100644 --- a/taiga/base/api/permissions.py +++ b/taiga/base/api/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/relations.py b/taiga/base/api/relations.py index 4c02ec91..8215ff34 100644 --- a/taiga/base/api/relations.py +++ b/taiga/base/api/relations.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/renderers.py b/taiga/base/api/renderers.py index c30cb074..951d2dd1 100644 --- a/taiga/base/api/renderers.py +++ b/taiga/base/api/renderers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/request.py b/taiga/base/api/request.py index 0e5fe48a..9cf69817 100644 --- a/taiga/base/api/request.py +++ b/taiga/base/api/request.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/reverse.py b/taiga/base/api/reverse.py index 1049388f..8c79494d 100644 --- a/taiga/base/api/reverse.py +++ b/taiga/base/api/reverse.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/serializers.py b/taiga/base/api/serializers.py index 3f33e180..10b677ea 100644 --- a/taiga/base/api/serializers.py +++ b/taiga/base/api/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 @@ -15,7 +15,7 @@ # along with this program. If not, see . # This code is partially taken from django-rest-framework: -# Copyright (c) 2011-2015, Tom Christie +# Copyright (c) 2011-2016, Tom Christie """ diff --git a/taiga/base/api/settings.py b/taiga/base/api/settings.py index 5eda4866..42f2fce9 100644 --- a/taiga/base/api/settings.py +++ b/taiga/base/api/settings.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 @@ -15,7 +15,7 @@ # along with this program. If not, see . # This code is partially taken from django-rest-framework: -# Copyright (c) 2011-2015, Tom Christie +# Copyright (c) 2011-2016, Tom Christie """ diff --git a/taiga/base/api/static/api/css/bootstrap-tweaks.css b/taiga/base/api/static/api/css/bootstrap-tweaks.css index 98b0348f..6b30f2d1 100644 --- a/taiga/base/api/static/api/css/bootstrap-tweaks.css +++ b/taiga/base/api/static/api/css/bootstrap-tweaks.css @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014-2015 Andrey Antukh - * Copyright (C) 2014-2015 Jesús Espino - * Copyright (C) 2014-2015 David Barragán + * Copyright (C) 2014-2016 Andrey Antukh + * Copyright (C) 2014-2016 Jesús Espino + * Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/static/api/css/default.css b/taiga/base/api/static/api/css/default.css index cbd7191c..f9a400d0 100644 --- a/taiga/base/api/static/api/css/default.css +++ b/taiga/base/api/static/api/css/default.css @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014-2015 Andrey Antukh - * Copyright (C) 2014-2015 Jesús Espino - * Copyright (C) 2014-2015 David Barragán + * Copyright (C) 2014-2016 Andrey Antukh + * Copyright (C) 2014-2016 Jesús Espino + * Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/static/api/css/prettify.css b/taiga/base/api/static/api/css/prettify.css index 1511794c..598734e2 100644 --- a/taiga/base/api/static/api/css/prettify.css +++ b/taiga/base/api/static/api/css/prettify.css @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014-2015 Andrey Antukh - * Copyright (C) 2014-2015 Jesús Espino - * Copyright (C) 2014-2015 David Barragán + * Copyright (C) 2014-2016 Andrey Antukh + * Copyright (C) 2014-2016 Jesús Espino + * Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/static/api/js/default.js b/taiga/base/api/static/api/js/default.js index fc8563d2..8996f763 100644 --- a/taiga/base/api/static/api/js/default.js +++ b/taiga/base/api/static/api/js/default.js @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014-2015 Andrey Antukh - * Copyright (C) 2014-2015 Jesús Espino - * Copyright (C) 2014-2015 David Barragán + * Copyright (C) 2014-2016 Andrey Antukh + * Copyright (C) 2014-2016 Jesús Espino + * Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/static/api/js/prettify-min.js b/taiga/base/api/static/api/js/prettify-min.js index c225269f..7c37d5c3 100644 --- a/taiga/base/api/static/api/js/prettify-min.js +++ b/taiga/base/api/static/api/js/prettify-min.js @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014-2015 Andrey Antukh - * Copyright (C) 2014-2015 Jesús Espino - * Copyright (C) 2014-2015 David Barragán + * Copyright (C) 2014-2016 Andrey Antukh + * Copyright (C) 2014-2016 Jesús Espino + * Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/templatetags/api.py b/taiga/base/api/templatetags/api.py index 642b476d..5f097b60 100644 --- a/taiga/base/api/templatetags/api.py +++ b/taiga/base/api/templatetags/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/throttling.py b/taiga/base/api/throttling.py index 89cf4c7d..5f8c74d8 100644 --- a/taiga/base/api/throttling.py +++ b/taiga/base/api/throttling.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/urlpatterns.py b/taiga/base/api/urlpatterns.py index 4c67ad23..249017ae 100644 --- a/taiga/base/api/urlpatterns.py +++ b/taiga/base/api/urlpatterns.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/urls.py b/taiga/base/api/urls.py index e7e4af2b..ba7eb521 100644 --- a/taiga/base/api/urls.py +++ b/taiga/base/api/urls.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils.py b/taiga/base/api/utils.py index 8f803b0a..b5a8b960 100644 --- a/taiga/base/api/utils.py +++ b/taiga/base/api/utils.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils/__init__.py b/taiga/base/api/utils/__init__.py index a555ba83..61a219d5 100644 --- a/taiga/base/api/utils/__init__.py +++ b/taiga/base/api/utils/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils/breadcrumbs.py b/taiga/base/api/utils/breadcrumbs.py index 950fe710..d0ff8c7b 100644 --- a/taiga/base/api/utils/breadcrumbs.py +++ b/taiga/base/api/utils/breadcrumbs.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils/encoders.py b/taiga/base/api/utils/encoders.py index cc998d24..f87a77b6 100644 --- a/taiga/base/api/utils/encoders.py +++ b/taiga/base/api/utils/encoders.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils/formatting.py b/taiga/base/api/utils/formatting.py index c8a1781e..44d89218 100644 --- a/taiga/base/api/utils/formatting.py +++ b/taiga/base/api/utils/formatting.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/utils/mediatypes.py b/taiga/base/api/utils/mediatypes.py index b049f166..90e53bdf 100644 --- a/taiga/base/api/utils/mediatypes.py +++ b/taiga/base/api/utils/mediatypes.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/views.py b/taiga/base/api/views.py index 0d5a60da..a718893d 100644 --- a/taiga/base/api/views.py +++ b/taiga/base/api/views.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/api/viewsets.py b/taiga/base/api/viewsets.py index 9122972a..714172e3 100644 --- a/taiga/base/api/viewsets.py +++ b/taiga/base/api/viewsets.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/apps.py b/taiga/base/apps.py index 32ef371c..04c717fd 100644 --- a/taiga/base/apps.py +++ b/taiga/base/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/connectors/exceptions.py b/taiga/base/connectors/exceptions.py index 7173c757..839037e8 100644 --- a/taiga/base/connectors/exceptions.py +++ b/taiga/base/connectors/exceptions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/decorators.py b/taiga/base/decorators.py index 37912397..62b405cf 100644 --- a/taiga/base/decorators.py +++ b/taiga/base/decorators.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/exceptions.py b/taiga/base/exceptions.py index a6e3850f..a4c9d661 100644 --- a/taiga/base/exceptions.py +++ b/taiga/base/exceptions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 @@ -15,7 +15,7 @@ # along with this program. If not, see . # This code is partially taken from django-rest-framework: -# Copyright (c) 2011-2015, Tom Christie +# Copyright (c) 2011-2016, Tom Christie """ diff --git a/taiga/base/fields.py b/taiga/base/fields.py index 28c04a11..0fc5316c 100644 --- a/taiga/base/fields.py +++ b/taiga/base/fields.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 2c139df1..f8901b17 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/formats/en/formats.py b/taiga/base/formats/en/formats.py index 6f5a83d4..3f949e39 100644 --- a/taiga/base/formats/en/formats.py +++ b/taiga/base/formats/en/formats.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/formats/es/formats.py b/taiga/base/formats/es/formats.py index a6c8e8f5..d36c3090 100644 --- a/taiga/base/formats/es/formats.py +++ b/taiga/base/formats/es/formats.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/mails.py b/taiga/base/mails.py index ac0517e0..6ab29280 100644 --- a/taiga/base/mails.py +++ b/taiga/base/mails.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/management/commands/test_emails.py b/taiga/base/management/commands/test_emails.py index c6d20a7d..f29621e1 100644 --- a/taiga/base/management/commands/test_emails.py +++ b/taiga/base/management/commands/test_emails.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/middleware/cors.py b/taiga/base/middleware/cors.py index a27ada91..1bdb3342 100644 --- a/taiga/base/middleware/cors.py +++ b/taiga/base/middleware/cors.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/neighbors.py b/taiga/base/neighbors.py index 3a7c0d44..a1edbef3 100644 --- a/taiga/base/neighbors.py +++ b/taiga/base/neighbors.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/response.py b/taiga/base/response.py index 458411c7..da665972 100644 --- a/taiga/base/response.py +++ b/taiga/base/response.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/routers.py b/taiga/base/routers.py index 6b72826c..996276ff 100644 --- a/taiga/base/routers.py +++ b/taiga/base/routers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/status.py b/taiga/base/status.py index 0000145c..f717f8c8 100644 --- a/taiga/base/status.py +++ b/taiga/base/status.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 @@ -15,7 +15,7 @@ # along with this program. If not, see . # This code is partially taken from django-rest-framework: -# Copyright (c) 2011-2015, Tom Christie +# Copyright (c) 2011-2016, Tom Christie """ diff --git a/taiga/base/storage.py b/taiga/base/storage.py index ad79c9fd..88edb6d1 100644 --- a/taiga/base/storage.py +++ b/taiga/base/storage.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/tags.py b/taiga/base/tags.py index 9af3cfe6..8e59ce7d 100644 --- a/taiga/base/tags.py +++ b/taiga/base/tags.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/throttling.py b/taiga/base/throttling.py index edc1fa14..b13915e3 100644 --- a/taiga/base/throttling.py +++ b/taiga/base/throttling.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/contenttypes.py b/taiga/base/utils/contenttypes.py index a475b352..9f9c14cc 100644 --- a/taiga/base/utils/contenttypes.py +++ b/taiga/base/utils/contenttypes.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py index 82694014..b3ff07a7 100644 --- a/taiga/base/utils/db.py +++ b/taiga/base/utils/db.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/dicts.py b/taiga/base/utils/dicts.py index 4a3c1ce6..10a477b6 100644 --- a/taiga/base/utils/dicts.py +++ b/taiga/base/utils/dicts.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/diff.py b/taiga/base/utils/diff.py index 27f1281e..8c7c4f0d 100644 --- a/taiga/base/utils/diff.py +++ b/taiga/base/utils/diff.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/functions.py b/taiga/base/utils/functions.py index 3570a59a..560fc1c8 100644 --- a/taiga/base/utils/functions.py +++ b/taiga/base/utils/functions.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/utils/iterators.py b/taiga/base/utils/iterators.py index f7249112..8be43791 100644 --- a/taiga/base/utils/iterators.py +++ b/taiga/base/utils/iterators.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/utils/json.py b/taiga/base/utils/json.py index d9e54132..d9293519 100644 --- a/taiga/base/utils/json.py +++ b/taiga/base/utils/json.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/sequence.py b/taiga/base/utils/sequence.py index da50953a..77ac2ca6 100644 --- a/taiga/base/utils/sequence.py +++ b/taiga/base/utils/sequence.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/signals.py b/taiga/base/utils/signals.py index d2700790..cc4fff9b 100644 --- a/taiga/base/utils/signals.py +++ b/taiga/base/utils/signals.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/base/utils/slug.py b/taiga/base/utils/slug.py index 48776ac3..83943f09 100644 --- a/taiga/base/utils/slug.py +++ b/taiga/base/utils/slug.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/text.py b/taiga/base/utils/text.py index b8de6aef..7338974e 100644 --- a/taiga/base/utils/text.py +++ b/taiga/base/utils/text.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/base/utils/urls.py b/taiga/base/utils/urls.py index e13d783e..bd3fe96c 100644 --- a/taiga/base/utils/urls.py +++ b/taiga/base/utils/urls.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/celery.py b/taiga/celery.py index 8084290b..f03594b4 100644 --- a/taiga/celery.py +++ b/taiga/celery.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/contrib_routers.py b/taiga/contrib_routers.py index 129d56b6..ea1cdc2f 100644 --- a/taiga/contrib_routers.py +++ b/taiga/contrib_routers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/deferred.py b/taiga/deferred.py index 084a16f0..8788ed00 100644 --- a/taiga/deferred.py +++ b/taiga/deferred.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/events/__init__.py b/taiga/events/__init__.py index b2d6c236..35f5be4a 100644 --- a/taiga/events/__init__.py +++ b/taiga/events/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/events/apps.py b/taiga/events/apps.py index 1081d6db..385b4bf4 100644 --- a/taiga/events/apps.py +++ b/taiga/events/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/events/backends/__init__.py b/taiga/events/backends/__init__.py index da0d1ba3..bdd3825e 100644 --- a/taiga/events/backends/__init__.py +++ b/taiga/events/backends/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/events/backends/base.py b/taiga/events/backends/base.py index 16189070..9ff0a9b2 100644 --- a/taiga/events/backends/base.py +++ b/taiga/events/backends/base.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/events/backends/postgresql.py b/taiga/events/backends/postgresql.py index beaf04ee..57ae500c 100644 --- a/taiga/events/backends/postgresql.py +++ b/taiga/events/backends/postgresql.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/events/backends/rabbitmq.py b/taiga/events/backends/rabbitmq.py index 18b573b1..3702d47d 100644 --- a/taiga/events/backends/rabbitmq.py +++ b/taiga/events/backends/rabbitmq.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/events/events.py b/taiga/events/events.py index 3bd29173..1e7aa64c 100644 --- a/taiga/events/events.py +++ b/taiga/events/events.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/events/middleware.py b/taiga/events/middleware.py index 6fdbe3ef..669d6167 100644 --- a/taiga/events/middleware.py +++ b/taiga/events/middleware.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/events/signal_handlers.py b/taiga/events/signal_handlers.py index e50b0f4c..f2db51a8 100644 --- a/taiga/events/signal_handlers.py +++ b/taiga/events/signal_handlers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py index 12f0470d..6bc0d1b4 100644 --- a/taiga/export_import/api.py +++ b/taiga/export_import/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/dump_service.py b/taiga/export_import/dump_service.py index e09783a9..7508dd7c 100644 --- a/taiga/export_import/dump_service.py +++ b/taiga/export_import/dump_service.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/management/commands/dump_project.py b/taiga/export_import/management/commands/dump_project.py index 6126a04a..5db2319d 100644 --- a/taiga/export_import/management/commands/dump_project.py +++ b/taiga/export_import/management/commands/dump_project.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/management/commands/load_dump.py b/taiga/export_import/management/commands/load_dump.py index 5afee1b8..6e2680d2 100644 --- a/taiga/export_import/management/commands/load_dump.py +++ b/taiga/export_import/management/commands/load_dump.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/mixins.py b/taiga/export_import/mixins.py index 89a625e6..c05c6154 100644 --- a/taiga/export_import/mixins.py +++ b/taiga/export_import/mixins.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/permissions.py b/taiga/export_import/permissions.py index 23516de9..15d7209d 100644 --- a/taiga/export_import/permissions.py +++ b/taiga/export_import/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/renderers.py b/taiga/export_import/renderers.py index 7f7a2a28..b1ac06fb 100644 --- a/taiga/export_import/renderers.py +++ b/taiga/export_import/renderers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index 86d84018..6d5a6138 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/service.py b/taiga/export_import/service.py index 5e45a6e4..f61ced4a 100644 --- a/taiga/export_import/service.py +++ b/taiga/export_import/service.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/tasks.py b/taiga/export_import/tasks.py index a33d2518..73c66c96 100644 --- a/taiga/export_import/tasks.py +++ b/taiga/export_import/tasks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/export_import/throttling.py b/taiga/export_import/throttling.py index 8a772520..a05e4cf2 100644 --- a/taiga/export_import/throttling.py +++ b/taiga/export_import/throttling.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/admin.py b/taiga/external_apps/admin.py index c1efa854..ea098236 100644 --- a/taiga/external_apps/admin.py +++ b/taiga/external_apps/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/api.py b/taiga/external_apps/api.py index 8da1ca9a..407b0c88 100644 --- a/taiga/external_apps/api.py +++ b/taiga/external_apps/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/auth_backends.py b/taiga/external_apps/auth_backends.py index 6ab025bd..13ce1e5d 100644 --- a/taiga/external_apps/auth_backends.py +++ b/taiga/external_apps/auth_backends.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/encryption.py b/taiga/external_apps/encryption.py index 523c49d1..9693ac4c 100644 --- a/taiga/external_apps/encryption.py +++ b/taiga/external_apps/encryption.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/models.py b/taiga/external_apps/models.py index b1ffed26..a2496c4a 100644 --- a/taiga/external_apps/models.py +++ b/taiga/external_apps/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/permissions.py b/taiga/external_apps/permissions.py index 2132ea2a..8bb0f9e9 100644 --- a/taiga/external_apps/permissions.py +++ b/taiga/external_apps/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/serializers.py b/taiga/external_apps/serializers.py index bc3cc0fc..a4c83e71 100644 --- a/taiga/external_apps/serializers.py +++ b/taiga/external_apps/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/external_apps/services.py b/taiga/external_apps/services.py index 7e1f78a4..1794cb6c 100644 --- a/taiga/external_apps/services.py +++ b/taiga/external_apps/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/__init__.py b/taiga/feedback/__init__.py index 69fa6d10..2b68fc6e 100644 --- a/taiga/feedback/__init__.py +++ b/taiga/feedback/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/admin.py b/taiga/feedback/admin.py index 0c6f5e0c..2eac4260 100644 --- a/taiga/feedback/admin.py +++ b/taiga/feedback/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/api.py b/taiga/feedback/api.py index 46dc31bd..ae529102 100644 --- a/taiga/feedback/api.py +++ b/taiga/feedback/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/apps.py b/taiga/feedback/apps.py index 8d8ec510..dae893ec 100644 --- a/taiga/feedback/apps.py +++ b/taiga/feedback/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/models.py b/taiga/feedback/models.py index f60aee92..f291006e 100644 --- a/taiga/feedback/models.py +++ b/taiga/feedback/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/permissions.py b/taiga/feedback/permissions.py index bbb53bdb..ead7f1d3 100644 --- a/taiga/feedback/permissions.py +++ b/taiga/feedback/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/routers.py b/taiga/feedback/routers.py index 06d8988b..ac7cd1fc 100644 --- a/taiga/feedback/routers.py +++ b/taiga/feedback/routers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/serializers.py b/taiga/feedback/serializers.py index 647c0e96..bd42472d 100644 --- a/taiga/feedback/serializers.py +++ b/taiga/feedback/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/feedback/services.py b/taiga/feedback/services.py index 6fee5c79..80421fea 100644 --- a/taiga/feedback/services.py +++ b/taiga/feedback/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/front/sitemaps/__init__.py b/taiga/front/sitemaps/__init__.py index e07dd928..cf638d3d 100644 --- a/taiga/front/sitemaps/__init__.py +++ b/taiga/front/sitemaps/__init__.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/base.py b/taiga/front/sitemaps/base.py index 418ed739..084d4474 100644 --- a/taiga/front/sitemaps/base.py +++ b/taiga/front/sitemaps/base.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/generics.py b/taiga/front/sitemaps/generics.py index 41479a61..2a4bb3ee 100644 --- a/taiga/front/sitemaps/generics.py +++ b/taiga/front/sitemaps/generics.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/issues.py b/taiga/front/sitemaps/issues.py index 912712fc..c30d74f2 100644 --- a/taiga/front/sitemaps/issues.py +++ b/taiga/front/sitemaps/issues.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/milestones.py b/taiga/front/sitemaps/milestones.py index 049d3c9c..f11dead8 100644 --- a/taiga/front/sitemaps/milestones.py +++ b/taiga/front/sitemaps/milestones.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/projects.py b/taiga/front/sitemaps/projects.py index fc56adca..89cc8340 100644 --- a/taiga/front/sitemaps/projects.py +++ b/taiga/front/sitemaps/projects.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/tasks.py b/taiga/front/sitemaps/tasks.py index fa066a3b..d3b53886 100644 --- a/taiga/front/sitemaps/tasks.py +++ b/taiga/front/sitemaps/tasks.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/users.py b/taiga/front/sitemaps/users.py index 0cd2c2ed..2c2df8d3 100644 --- a/taiga/front/sitemaps/users.py +++ b/taiga/front/sitemaps/users.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/userstories.py b/taiga/front/sitemaps/userstories.py index 669db7ed..3240229f 100644 --- a/taiga/front/sitemaps/userstories.py +++ b/taiga/front/sitemaps/userstories.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/sitemaps/wiki.py b/taiga/front/sitemaps/wiki.py index 33c0cf0e..669c6a75 100644 --- a/taiga/front/sitemaps/wiki.py +++ b/taiga/front/sitemaps/wiki.py @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/taiga/front/templatetags/functions.py b/taiga/front/templatetags/functions.py index 1c2fdaea..411a7146 100644 --- a/taiga/front/templatetags/functions.py +++ b/taiga/front/templatetags/functions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/front/urls.py b/taiga/front/urls.py index 5987e5af..4e85a885 100644 --- a/taiga/front/urls.py +++ b/taiga/front/urls.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/api.py b/taiga/hooks/api.py index d807f19d..0a2f9cc9 100644 --- a/taiga/hooks/api.py +++ b/taiga/hooks/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/bitbucket/api.py b/taiga/hooks/bitbucket/api.py index 781eca96..49b3284e 100644 --- a/taiga/hooks/bitbucket/api.py +++ b/taiga/hooks/bitbucket/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/bitbucket/event_hooks.py b/taiga/hooks/bitbucket/event_hooks.py index 3ee7c92b..7d26f72b 100644 --- a/taiga/hooks/bitbucket/event_hooks.py +++ b/taiga/hooks/bitbucket/event_hooks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/bitbucket/services.py b/taiga/hooks/bitbucket/services.py index ff39d083..30772f89 100644 --- a/taiga/hooks/bitbucket/services.py +++ b/taiga/hooks/bitbucket/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/event_hooks.py b/taiga/hooks/event_hooks.py index eebc45a0..1614e2f4 100644 --- a/taiga/hooks/event_hooks.py +++ b/taiga/hooks/event_hooks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/exceptions.py b/taiga/hooks/exceptions.py index 1a214ab0..6847ba6d 100644 --- a/taiga/hooks/exceptions.py +++ b/taiga/hooks/exceptions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/github/api.py b/taiga/hooks/github/api.py index 9082a2e6..b3437d1a 100644 --- a/taiga/hooks/github/api.py +++ b/taiga/hooks/github/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/github/event_hooks.py b/taiga/hooks/github/event_hooks.py index 20bbf11c..47f5b47a 100644 --- a/taiga/hooks/github/event_hooks.py +++ b/taiga/hooks/github/event_hooks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/github/services.py b/taiga/hooks/github/services.py index 31a4f063..0f37b4fa 100644 --- a/taiga/hooks/github/services.py +++ b/taiga/hooks/github/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/gitlab/api.py b/taiga/hooks/gitlab/api.py index 4cc71fd9..fe33df65 100644 --- a/taiga/hooks/gitlab/api.py +++ b/taiga/hooks/gitlab/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/gitlab/event_hooks.py b/taiga/hooks/gitlab/event_hooks.py index 4c1f7dd3..5324f2fb 100644 --- a/taiga/hooks/gitlab/event_hooks.py +++ b/taiga/hooks/gitlab/event_hooks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/hooks/gitlab/services.py b/taiga/hooks/gitlab/services.py index a441c0dc..32e77e13 100644 --- a/taiga/hooks/gitlab/services.py +++ b/taiga/hooks/gitlab/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/locale/api.py b/taiga/locale/api.py index 03f11d56..3cacf7d9 100644 --- a/taiga/locale/api.py +++ b/taiga/locale/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/locale/permissions.py b/taiga/locale/permissions.py index 1c14c352..2ce79d8e 100644 --- a/taiga/locale/permissions.py +++ b/taiga/locale/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/mdrender/__init__.py b/taiga/mdrender/__init__.py index abec3c69..0a4dc435 100644 --- a/taiga/mdrender/__init__.py +++ b/taiga/mdrender/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/mdrender/extensions/target_link.py b/taiga/mdrender/extensions/target_link.py index 7754d94b..0e183c3f 100644 --- a/taiga/mdrender/extensions/target_link.py +++ b/taiga/mdrender/extensions/target_link.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Alejandro Alonso +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Alejandro Alonso # 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 diff --git a/taiga/mdrender/extensions/wikilinks.py b/taiga/mdrender/extensions/wikilinks.py index 9d106d82..aacadf38 100644 --- a/taiga/mdrender/extensions/wikilinks.py +++ b/taiga/mdrender/extensions/wikilinks.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/mdrender/service.py b/taiga/mdrender/service.py index 326f4b2c..24d64638 100644 --- a/taiga/mdrender/service.py +++ b/taiga/mdrender/service.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/mdrender/templatetags/functions.py b/taiga/mdrender/templatetags/functions.py index fc15c39f..853ca1cf 100644 --- a/taiga/mdrender/templatetags/functions.py +++ b/taiga/mdrender/templatetags/functions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/permissions/permissions.py b/taiga/permissions/permissions.py index 7761abbf..8cb72868 100644 --- a/taiga/permissions/permissions.py +++ b/taiga/permissions/permissions.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/permissions/service.py b/taiga/permissions/service.py index 0048fc26..da47a8aa 100644 --- a/taiga/permissions/service.py +++ b/taiga/permissions/service.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/__init__.py b/taiga/projects/__init__.py index c8c59bf3..c5859639 100644 --- a/taiga/projects/__init__.py +++ b/taiga/projects/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/admin.py b/taiga/projects/admin.py index 184fbcf1..51bcb8d6 100644 --- a/taiga/projects/admin.py +++ b/taiga/projects/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/api.py b/taiga/projects/api.py index fa473d50..e37a9f98 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/apps.py b/taiga/projects/apps.py index 07938210..3eb2749b 100644 --- a/taiga/projects/apps.py +++ b/taiga/projects/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/__init__.py b/taiga/projects/attachments/__init__.py index 17882254..28c3b166 100644 --- a/taiga/projects/attachments/__init__.py +++ b/taiga/projects/attachments/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/admin.py b/taiga/projects/attachments/admin.py index 9f1d5eb3..b725aa60 100644 --- a/taiga/projects/attachments/admin.py +++ b/taiga/projects/attachments/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/api.py b/taiga/projects/attachments/api.py index 0a40f8b7..d2936a4f 100644 --- a/taiga/projects/attachments/api.py +++ b/taiga/projects/attachments/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/apps.py b/taiga/projects/attachments/apps.py index c52458b9..ceed72de 100644 --- a/taiga/projects/attachments/apps.py +++ b/taiga/projects/attachments/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/models.py b/taiga/projects/attachments/models.py index f5c089fa..2a0cfe8d 100644 --- a/taiga/projects/attachments/models.py +++ b/taiga/projects/attachments/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/permissions.py b/taiga/projects/attachments/permissions.py index 603d4f98..4ec542d5 100644 --- a/taiga/projects/attachments/permissions.py +++ b/taiga/projects/attachments/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/serializers.py b/taiga/projects/attachments/serializers.py index 42dc30d2..b9ba6aad 100644 --- a/taiga/projects/attachments/serializers.py +++ b/taiga/projects/attachments/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/attachments/services.py b/taiga/projects/attachments/services.py index 6dc70160..99c0d57a 100644 --- a/taiga/projects/attachments/services.py +++ b/taiga/projects/attachments/services.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/projects/choices.py b/taiga/projects/choices.py index 0e443847..1bae9ac6 100644 --- a/taiga/projects/choices.py +++ b/taiga/projects/choices.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/admin.py b/taiga/projects/custom_attributes/admin.py index 3f67ffaf..56d7bb90 100644 --- a/taiga/projects/custom_attributes/admin.py +++ b/taiga/projects/custom_attributes/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/api.py b/taiga/projects/custom_attributes/api.py index bb490d4e..486344ba 100644 --- a/taiga/projects/custom_attributes/api.py +++ b/taiga/projects/custom_attributes/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/choices.py b/taiga/projects/custom_attributes/choices.py index 9c3e8468..88bc1177 100644 --- a/taiga/projects/custom_attributes/choices.py +++ b/taiga/projects/custom_attributes/choices.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/models.py b/taiga/projects/custom_attributes/models.py index 51c81db6..3f4af228 100644 --- a/taiga/projects/custom_attributes/models.py +++ b/taiga/projects/custom_attributes/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/permissions.py b/taiga/projects/custom_attributes/permissions.py index 7a780a57..43460ad9 100644 --- a/taiga/projects/custom_attributes/permissions.py +++ b/taiga/projects/custom_attributes/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/serializers.py b/taiga/projects/custom_attributes/serializers.py index 4b82a189..760c8604 100644 --- a/taiga/projects/custom_attributes/serializers.py +++ b/taiga/projects/custom_attributes/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/services.py b/taiga/projects/custom_attributes/services.py index 1e5795cb..cd371cf1 100644 --- a/taiga/projects/custom_attributes/services.py +++ b/taiga/projects/custom_attributes/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/custom_attributes/signals.py b/taiga/projects/custom_attributes/signals.py index 1e0e96e3..1f6c4671 100644 --- a/taiga/projects/custom_attributes/signals.py +++ b/taiga/projects/custom_attributes/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/api.py b/taiga/projects/history/api.py index 9e7bef23..c6af2880 100644 --- a/taiga/projects/history/api.py +++ b/taiga/projects/history/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/choices.py b/taiga/projects/history/choices.py index 1c38af8f..c4a6af78 100644 --- a/taiga/projects/history/choices.py +++ b/taiga/projects/history/choices.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/projects/history/freeze_impl.py b/taiga/projects/history/freeze_impl.py index 6a551304..0a68806e 100644 --- a/taiga/projects/history/freeze_impl.py +++ b/taiga/projects/history/freeze_impl.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/mixins.py b/taiga/projects/history/mixins.py index 27fa7632..faec3b00 100644 --- a/taiga/projects/history/mixins.py +++ b/taiga/projects/history/mixins.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/models.py b/taiga/projects/history/models.py index cea42ae4..2663bf2c 100644 --- a/taiga/projects/history/models.py +++ b/taiga/projects/history/models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/projects/history/permissions.py b/taiga/projects/history/permissions.py index 636fe6a9..5f8c1f04 100644 --- a/taiga/projects/history/permissions.py +++ b/taiga/projects/history/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/serializers.py b/taiga/projects/history/serializers.py index eab06fa7..5caad806 100644 --- a/taiga/projects/history/serializers.py +++ b/taiga/projects/history/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/history/services.py b/taiga/projects/history/services.py index a199f7ad..9f520812 100644 --- a/taiga/projects/history/services.py +++ b/taiga/projects/history/services.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Andrey Antukh +# Copyright (C) 2014-2016 Andrey Antukh # 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 diff --git a/taiga/projects/history/templatetags/functions.py b/taiga/projects/history/templatetags/functions.py index 3c3ce143..35236fc6 100644 --- a/taiga/projects/history/templatetags/functions.py +++ b/taiga/projects/history/templatetags/functions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/__init__.py b/taiga/projects/issues/__init__.py index b6be563e..b511b6e7 100644 --- a/taiga/projects/issues/__init__.py +++ b/taiga/projects/issues/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/admin.py b/taiga/projects/issues/admin.py index a11f1d21..a1e0ecfe 100644 --- a/taiga/projects/issues/admin.py +++ b/taiga/projects/issues/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/api.py b/taiga/projects/issues/api.py index f38bfb2e..60633f58 100644 --- a/taiga/projects/issues/api.py +++ b/taiga/projects/issues/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/apps.py b/taiga/projects/issues/apps.py index 485513f0..27fd6e82 100644 --- a/taiga/projects/issues/apps.py +++ b/taiga/projects/issues/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/models.py b/taiga/projects/issues/models.py index 81745d4a..84840ebd 100644 --- a/taiga/projects/issues/models.py +++ b/taiga/projects/issues/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/permissions.py b/taiga/projects/issues/permissions.py index 8c8ddd4d..6684f144 100644 --- a/taiga/projects/issues/permissions.py +++ b/taiga/projects/issues/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/serializers.py b/taiga/projects/issues/serializers.py index cfc10feb..098043a2 100644 --- a/taiga/projects/issues/serializers.py +++ b/taiga/projects/issues/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index 83a5f818..08d76051 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/issues/signals.py b/taiga/projects/issues/signals.py index 1a50a911..17bc0c2b 100644 --- a/taiga/projects/issues/signals.py +++ b/taiga/projects/issues/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/likes/admin.py b/taiga/projects/likes/admin.py index b48f2385..a1d7fc8a 100644 --- a/taiga/projects/likes/admin.py +++ b/taiga/projects/likes/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/likes/mixins/serializers.py b/taiga/projects/likes/mixins/serializers.py index a4875b86..faf8d278 100644 --- a/taiga/projects/likes/mixins/serializers.py +++ b/taiga/projects/likes/mixins/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/likes/mixins/viewsets.py b/taiga/projects/likes/mixins/viewsets.py index b3d9b2e1..f552d2e6 100644 --- a/taiga/projects/likes/mixins/viewsets.py +++ b/taiga/projects/likes/mixins/viewsets.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/likes/models.py b/taiga/projects/likes/models.py index 9b56f923..c87e45f7 100644 --- a/taiga/projects/likes/models.py +++ b/taiga/projects/likes/models.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/likes/serializers.py b/taiga/projects/likes/serializers.py index c507166e..93119a41 100644 --- a/taiga/projects/likes/serializers.py +++ b/taiga/projects/likes/serializers.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/likes/services.py b/taiga/projects/likes/services.py index f9b94a7a..78a44a01 100644 --- a/taiga/projects/likes/services.py +++ b/taiga/projects/likes/services.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/likes/utils.py b/taiga/projects/likes/utils.py index 44035d47..e519d774 100644 --- a/taiga/projects/likes/utils.py +++ b/taiga/projects/likes/utils.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/management/commands/sample_data.py b/taiga/projects/management/commands/sample_data.py index ae72c3e4..01db5dbe 100644 --- a/taiga/projects/management/commands/sample_data.py +++ b/taiga/projects/management/commands/sample_data.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/admin.py b/taiga/projects/milestones/admin.py index 86676373..95519eb9 100644 --- a/taiga/projects/milestones/admin.py +++ b/taiga/projects/milestones/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index 94cb04ec..a61806cc 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/models.py b/taiga/projects/milestones/models.py index 0e380c9b..83fe8cfc 100644 --- a/taiga/projects/milestones/models.py +++ b/taiga/projects/milestones/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/permissions.py b/taiga/projects/milestones/permissions.py index c088d9a9..ac459755 100644 --- a/taiga/projects/milestones/permissions.py +++ b/taiga/projects/milestones/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index 5d3ddf7b..964c1e1b 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/milestones/services.py b/taiga/projects/milestones/services.py index f852403f..2599db35 100644 --- a/taiga/projects/milestones/services.py +++ b/taiga/projects/milestones/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/mixins/blocked.py b/taiga/projects/mixins/blocked.py index 34db95b1..2d5a4fa0 100644 --- a/taiga/projects/mixins/blocked.py +++ b/taiga/projects/mixins/blocked.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/mixins/on_destroy.py b/taiga/projects/mixins/on_destroy.py index 6ba1c40f..a46977c9 100644 --- a/taiga/projects/mixins/on_destroy.py +++ b/taiga/projects/mixins/on_destroy.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/mixins/ordering.py b/taiga/projects/mixins/ordering.py index 29723fd3..d9e6c5ee 100644 --- a/taiga/projects/mixins/ordering.py +++ b/taiga/projects/mixins/ordering.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 1d96dd75..39c18e2a 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/admin.py b/taiga/projects/notifications/admin.py index 4036f787..2b4cd930 100644 --- a/taiga/projects/notifications/admin.py +++ b/taiga/projects/notifications/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/api.py b/taiga/projects/notifications/api.py index 26b8440f..8be8ab5c 100644 --- a/taiga/projects/notifications/api.py +++ b/taiga/projects/notifications/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/choices.py b/taiga/projects/notifications/choices.py index e42d9c91..f9eac02f 100644 --- a/taiga/projects/notifications/choices.py +++ b/taiga/projects/notifications/choices.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/management/commands/send_notifications.py b/taiga/projects/notifications/management/commands/send_notifications.py index 5aac7558..c2034895 100644 --- a/taiga/projects/notifications/management/commands/send_notifications.py +++ b/taiga/projects/notifications/management/commands/send_notifications.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/mixins.py b/taiga/projects/notifications/mixins.py index 26726703..bb90d113 100644 --- a/taiga/projects/notifications/mixins.py +++ b/taiga/projects/notifications/mixins.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/models.py b/taiga/projects/notifications/models.py index 6ce2356b..ae0c897f 100644 --- a/taiga/projects/notifications/models.py +++ b/taiga/projects/notifications/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/permissions.py b/taiga/projects/notifications/permissions.py index 699e0a4a..1ea57b4d 100644 --- a/taiga/projects/notifications/permissions.py +++ b/taiga/projects/notifications/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/serializers.py b/taiga/projects/notifications/serializers.py index e0c988b5..42c4cb18 100644 --- a/taiga/projects/notifications/serializers.py +++ b/taiga/projects/notifications/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/services.py b/taiga/projects/notifications/services.py index bbfc9dd5..b77efe73 100644 --- a/taiga/projects/notifications/services.py +++ b/taiga/projects/notifications/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/notifications/utils.py b/taiga/projects/notifications/utils.py index b8138e0a..b4257669 100644 --- a/taiga/projects/notifications/utils.py +++ b/taiga/projects/notifications/utils.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/notifications/validators.py b/taiga/projects/notifications/validators.py index 1330a09a..7870e263 100644 --- a/taiga/projects/notifications/validators.py +++ b/taiga/projects/notifications/validators.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/occ/__init__.py b/taiga/projects/occ/__init__.py index a25f77db..0786ec9e 100644 --- a/taiga/projects/occ/__init__.py +++ b/taiga/projects/occ/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/occ/mixins.py b/taiga/projects/occ/mixins.py index b473eb2b..789c7599 100644 --- a/taiga/projects/occ/mixins.py +++ b/taiga/projects/occ/mixins.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/permissions.py b/taiga/projects/permissions.py index 0925ce8a..1c839d3b 100644 --- a/taiga/projects/permissions.py +++ b/taiga/projects/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/api.py b/taiga/projects/references/api.py index 4b8027cb..60559931 100644 --- a/taiga/projects/references/api.py +++ b/taiga/projects/references/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/models.py b/taiga/projects/references/models.py index 6e141c8d..e6fd734d 100644 --- a/taiga/projects/references/models.py +++ b/taiga/projects/references/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/permissions.py b/taiga/projects/references/permissions.py index aa818c49..0708321e 100644 --- a/taiga/projects/references/permissions.py +++ b/taiga/projects/references/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/sequences.py b/taiga/projects/references/sequences.py index ca6a4f62..c9bf9af2 100644 --- a/taiga/projects/references/sequences.py +++ b/taiga/projects/references/sequences.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/serializers.py b/taiga/projects/references/serializers.py index 4755a897..6b2ff303 100644 --- a/taiga/projects/references/serializers.py +++ b/taiga/projects/references/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/references/services.py b/taiga/projects/references/services.py index 203cd4e2..d1059b71 100644 --- a/taiga/projects/references/services.py +++ b/taiga/projects/references/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 21347615..752d494b 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/__init__.py b/taiga/projects/services/__init__.py index d63cbe79..11d9ab78 100644 --- a/taiga/projects/services/__init__.py +++ b/taiga/projects/services/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/bulk_update_order.py b/taiga/projects/services/bulk_update_order.py index 83b38a90..de359991 100644 --- a/taiga/projects/services/bulk_update_order.py +++ b/taiga/projects/services/bulk_update_order.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/filters.py b/taiga/projects/services/filters.py index e9c3f28e..bcca6ca5 100644 --- a/taiga/projects/services/filters.py +++ b/taiga/projects/services/filters.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/modules_config.py b/taiga/projects/services/modules_config.py index c0b92d77..31925f2e 100644 --- a/taiga/projects/services/modules_config.py +++ b/taiga/projects/services/modules_config.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/stats.py b/taiga/projects/services/stats.py index 7f915a31..dca20819 100644 --- a/taiga/projects/services/stats.py +++ b/taiga/projects/services/stats.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/services/tags_colors.py b/taiga/projects/services/tags_colors.py index 14d1dbce..fb9a99b0 100644 --- a/taiga/projects/services/tags_colors.py +++ b/taiga/projects/services/tags_colors.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/signals.py b/taiga/projects/signals.py index b4652a8b..622d5727 100644 --- a/taiga/projects/signals.py +++ b/taiga/projects/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/__init__.py b/taiga/projects/tasks/__init__.py index 6e63190e..83ace66e 100644 --- a/taiga/projects/tasks/__init__.py +++ b/taiga/projects/tasks/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/admin.py b/taiga/projects/tasks/admin.py index a9cbd823..fc6c4435 100644 --- a/taiga/projects/tasks/admin.py +++ b/taiga/projects/tasks/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/api.py b/taiga/projects/tasks/api.py index afd7d619..8a9c401b 100644 --- a/taiga/projects/tasks/api.py +++ b/taiga/projects/tasks/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/apps.py b/taiga/projects/tasks/apps.py index a38947e6..5415c3c2 100644 --- a/taiga/projects/tasks/apps.py +++ b/taiga/projects/tasks/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/models.py b/taiga/projects/tasks/models.py index c43869cb..369fab0a 100644 --- a/taiga/projects/tasks/models.py +++ b/taiga/projects/tasks/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/permissions.py b/taiga/projects/tasks/permissions.py index 7a12cd13..7591e346 100644 --- a/taiga/projects/tasks/permissions.py +++ b/taiga/projects/tasks/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/serializers.py b/taiga/projects/tasks/serializers.py index deb9af68..49e43680 100644 --- a/taiga/projects/tasks/serializers.py +++ b/taiga/projects/tasks/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/services.py b/taiga/projects/tasks/services.py index 9e47eb5e..8bd22993 100644 --- a/taiga/projects/tasks/services.py +++ b/taiga/projects/tasks/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/tasks/signals.py b/taiga/projects/tasks/signals.py index f45de621..f12c7671 100644 --- a/taiga/projects/tasks/signals.py +++ b/taiga/projects/tasks/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/translations.py b/taiga/projects/translations.py index b0b32671..193ed97f 100644 --- a/taiga/projects/translations.py +++ b/taiga/projects/translations.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/__init__.py b/taiga/projects/userstories/__init__.py index 13d664b6..01da2fe5 100644 --- a/taiga/projects/userstories/__init__.py +++ b/taiga/projects/userstories/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/admin.py b/taiga/projects/userstories/admin.py index f1772320..9fd7a72d 100644 --- a/taiga/projects/userstories/admin.py +++ b/taiga/projects/userstories/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 6e8d747c..e2a2f066 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/apps.py b/taiga/projects/userstories/apps.py index 240e0375..53515191 100644 --- a/taiga/projects/userstories/apps.py +++ b/taiga/projects/userstories/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/models.py b/taiga/projects/userstories/models.py index 6b49654e..ce734d1e 100644 --- a/taiga/projects/userstories/models.py +++ b/taiga/projects/userstories/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/permissions.py b/taiga/projects/userstories/permissions.py index 95a8e622..c5cb7eb2 100644 --- a/taiga/projects/userstories/permissions.py +++ b/taiga/projects/userstories/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index 98cc2bb4..a8d700d3 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index 40d6a092..9ca9ce8b 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/signals.py b/taiga/projects/userstories/signals.py index ce452992..33039926 100644 --- a/taiga/projects/userstories/signals.py +++ b/taiga/projects/userstories/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/userstories/validators.py b/taiga/projects/userstories/validators.py index f8e2440d..21464ded 100644 --- a/taiga/projects/userstories/validators.py +++ b/taiga/projects/userstories/validators.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/validators.py b/taiga/projects/validators.py index 11cd9f38..c2368030 100644 --- a/taiga/projects/validators.py +++ b/taiga/projects/validators.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/votes/admin.py b/taiga/projects/votes/admin.py index d0e0a74e..3e0dc590 100644 --- a/taiga/projects/votes/admin.py +++ b/taiga/projects/votes/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/votes/mixins/serializers.py b/taiga/projects/votes/mixins/serializers.py index 73e1799b..9147af78 100644 --- a/taiga/projects/votes/mixins/serializers.py +++ b/taiga/projects/votes/mixins/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/votes/mixins/viewsets.py b/taiga/projects/votes/mixins/viewsets.py index aa2100a0..3495e7a8 100644 --- a/taiga/projects/votes/mixins/viewsets.py +++ b/taiga/projects/votes/mixins/viewsets.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/votes/models.py b/taiga/projects/votes/models.py index 6f5abbe5..e4e592c1 100644 --- a/taiga/projects/votes/models.py +++ b/taiga/projects/votes/models.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/votes/serializers.py b/taiga/projects/votes/serializers.py index 210c6057..9dbb7af8 100644 --- a/taiga/projects/votes/serializers.py +++ b/taiga/projects/votes/serializers.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/votes/services.py b/taiga/projects/votes/services.py index 093b685e..2ddbdbcf 100644 --- a/taiga/projects/votes/services.py +++ b/taiga/projects/votes/services.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/votes/utils.py b/taiga/projects/votes/utils.py index dd703bcf..2b38c79e 100644 --- a/taiga/projects/votes/utils.py +++ b/taiga/projects/votes/utils.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/projects/wiki/admin.py b/taiga/projects/wiki/admin.py index f6ffcf20..7ea2e979 100644 --- a/taiga/projects/wiki/admin.py +++ b/taiga/projects/wiki/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/wiki/api.py b/taiga/projects/wiki/api.py index 60cfe8c0..27a5ea7b 100644 --- a/taiga/projects/wiki/api.py +++ b/taiga/projects/wiki/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/wiki/models.py b/taiga/projects/wiki/models.py index de3cb25c..067c65b4 100644 --- a/taiga/projects/wiki/models.py +++ b/taiga/projects/wiki/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/wiki/permissions.py b/taiga/projects/wiki/permissions.py index c1dd1e74..a0365645 100644 --- a/taiga/projects/wiki/permissions.py +++ b/taiga/projects/wiki/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/projects/wiki/serializers.py b/taiga/projects/wiki/serializers.py index d1dfc938..84cc7c07 100644 --- a/taiga/projects/wiki/serializers.py +++ b/taiga/projects/wiki/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/routers.py b/taiga/routers.py index 5e972b83..999a948b 100644 --- a/taiga/routers.py +++ b/taiga/routers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/searches/api.py b/taiga/searches/api.py index 5a985664..206dcb13 100644 --- a/taiga/searches/api.py +++ b/taiga/searches/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/searches/serializers.py b/taiga/searches/serializers.py index 3ec5f289..de409ba0 100644 --- a/taiga/searches/serializers.py +++ b/taiga/searches/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/searches/services.py b/taiga/searches/services.py index d2f84798..82acdf18 100644 --- a/taiga/searches/services.py +++ b/taiga/searches/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/stats/__init__.py b/taiga/stats/__init__.py index 28eceffa..c472cad5 100644 --- a/taiga/stats/__init__.py +++ b/taiga/stats/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/stats/api.py b/taiga/stats/api.py index ab765ed9..0afefeb8 100644 --- a/taiga/stats/api.py +++ b/taiga/stats/api.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/stats/apps.py b/taiga/stats/apps.py index dc893e5c..4adcc38a 100644 --- a/taiga/stats/apps.py +++ b/taiga/stats/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/stats/permissions.py b/taiga/stats/permissions.py index 16fb72a8..db48b945 100644 --- a/taiga/stats/permissions.py +++ b/taiga/stats/permissions.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/stats/routers.py b/taiga/stats/routers.py index dcab7819..e082567f 100644 --- a/taiga/stats/routers.py +++ b/taiga/stats/routers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/stats/services.py b/taiga/stats/services.py index a0d65c45..9d196094 100644 --- a/taiga/stats/services.py +++ b/taiga/stats/services.py @@ -1,4 +1,4 @@ -# Copyright (C) 2014-2015 Taiga Agile LLC +# Copyright (C) 2014-2016 Taiga Agile LLC # 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 diff --git a/taiga/timeline/__init__.py b/taiga/timeline/__init__.py index 21c6a821..937a3b98 100644 --- a/taiga/timeline/__init__.py +++ b/taiga/timeline/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/api.py b/taiga/timeline/api.py index e940e019..5545f467 100644 --- a/taiga/timeline/api.py +++ b/taiga/timeline/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/apps.py b/taiga/timeline/apps.py index 7b926f9e..83119502 100644 --- a/taiga/timeline/apps.py +++ b/taiga/timeline/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/management/commands/_clear_unnecessary_new_membership_entries.py b/taiga/timeline/management/commands/_clear_unnecessary_new_membership_entries.py index b4233923..23ce6ce0 100644 --- a/taiga/timeline/management/commands/_clear_unnecessary_new_membership_entries.py +++ b/taiga/timeline/management/commands/_clear_unnecessary_new_membership_entries.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/management/commands/_rebuild_timeline_for_user_creation.py b/taiga/timeline/management/commands/_rebuild_timeline_for_user_creation.py index bac46080..f1b763fa 100644 --- a/taiga/timeline/management/commands/_rebuild_timeline_for_user_creation.py +++ b/taiga/timeline/management/commands/_rebuild_timeline_for_user_creation.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/management/commands/_update_timeline_for_updated_tasks.py b/taiga/timeline/management/commands/_update_timeline_for_updated_tasks.py index ab1e4047..c26b52b3 100644 --- a/taiga/timeline/management/commands/_update_timeline_for_updated_tasks.py +++ b/taiga/timeline/management/commands/_update_timeline_for_updated_tasks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/management/commands/rebuild_timeline.py b/taiga/timeline/management/commands/rebuild_timeline.py index a7a72955..3179a9d6 100644 --- a/taiga/timeline/management/commands/rebuild_timeline.py +++ b/taiga/timeline/management/commands/rebuild_timeline.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/management/commands/rebuild_timeline_iterating_per_projects.py b/taiga/timeline/management/commands/rebuild_timeline_iterating_per_projects.py index 008da7b8..95b4db30 100644 --- a/taiga/timeline/management/commands/rebuild_timeline_iterating_per_projects.py +++ b/taiga/timeline/management/commands/rebuild_timeline_iterating_per_projects.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/models.py b/taiga/timeline/models.py index c92a87c8..b16bfc14 100644 --- a/taiga/timeline/models.py +++ b/taiga/timeline/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/permissions.py b/taiga/timeline/permissions.py index 5aae5df4..9f41c5f3 100644 --- a/taiga/timeline/permissions.py +++ b/taiga/timeline/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/serializers.py b/taiga/timeline/serializers.py index b5af436a..3a6e3d65 100644 --- a/taiga/timeline/serializers.py +++ b/taiga/timeline/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/service.py b/taiga/timeline/service.py index 88c85a9a..9d180885 100644 --- a/taiga/timeline/service.py +++ b/taiga/timeline/service.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/signals.py b/taiga/timeline/signals.py index 0aafb831..b899d6ea 100644 --- a/taiga/timeline/signals.py +++ b/taiga/timeline/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/timeline/timeline_implementations.py b/taiga/timeline/timeline_implementations.py index 8d85652c..f71ee80d 100644 --- a/taiga/timeline/timeline_implementations.py +++ b/taiga/timeline/timeline_implementations.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/urls.py b/taiga/urls.py index 33407f0f..f92cc8a0 100644 --- a/taiga/urls.py +++ b/taiga/urls.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/admin.py b/taiga/users/admin.py index 57055b2c..c5ac01a7 100644 --- a/taiga/users/admin.py +++ b/taiga/users/admin.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/api.py b/taiga/users/api.py index 20031395..387a964a 100644 --- a/taiga/users/api.py +++ b/taiga/users/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/filters.py b/taiga/users/filters.py index 8d2704b3..5858c41a 100644 --- a/taiga/users/filters.py +++ b/taiga/users/filters.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/forms.py b/taiga/users/forms.py index 7d9521a6..7331943f 100644 --- a/taiga/users/forms.py +++ b/taiga/users/forms.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/gravatar.py b/taiga/users/gravatar.py index f26fde9d..70615a00 100644 --- a/taiga/users/gravatar.py +++ b/taiga/users/gravatar.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/users/models.py b/taiga/users/models.py index 6bbd1ae2..080e897f 100644 --- a/taiga/users/models.py +++ b/taiga/users/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/permissions.py b/taiga/users/permissions.py index de72dd85..ec7761d9 100644 --- a/taiga/users/permissions.py +++ b/taiga/users/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/serializers.py b/taiga/users/serializers.py index 759e5a0f..cb05e2ed 100644 --- a/taiga/users/serializers.py +++ b/taiga/users/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/services.py b/taiga/users/services.py index 5dd8bc0f..91d08582 100644 --- a/taiga/users/services.py +++ b/taiga/users/services.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/signals.py b/taiga/users/signals.py index f1bac392..75fc1587 100644 --- a/taiga/users/signals.py +++ b/taiga/users/signals.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/users/validators.py b/taiga/users/validators.py index bc3a5a0c..ade82141 100644 --- a/taiga/users/validators.py +++ b/taiga/users/validators.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/taiga/userstorage/api.py b/taiga/userstorage/api.py index b767e5d9..eea83500 100644 --- a/taiga/userstorage/api.py +++ b/taiga/userstorage/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/userstorage/filters.py b/taiga/userstorage/filters.py index 31e1062c..c183d526 100644 --- a/taiga/userstorage/filters.py +++ b/taiga/userstorage/filters.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/userstorage/models.py b/taiga/userstorage/models.py index 31be0aae..8db16c1a 100644 --- a/taiga/userstorage/models.py +++ b/taiga/userstorage/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/userstorage/permissions.py b/taiga/userstorage/permissions.py index e3a049cb..0d2207b3 100644 --- a/taiga/userstorage/permissions.py +++ b/taiga/userstorage/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/userstorage/serializers.py b/taiga/userstorage/serializers.py index ecbac6a2..5f5d0493 100644 --- a/taiga/userstorage/serializers.py +++ b/taiga/userstorage/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/__init__.py b/taiga/webhooks/__init__.py index 57095ae0..4a91f101 100644 --- a/taiga/webhooks/__init__.py +++ b/taiga/webhooks/__init__.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/api.py b/taiga/webhooks/api.py index 8b254d10..5c8a5766 100644 --- a/taiga/webhooks/api.py +++ b/taiga/webhooks/api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/apps.py b/taiga/webhooks/apps.py index 589afa48..b17a2df0 100644 --- a/taiga/webhooks/apps.py +++ b/taiga/webhooks/apps.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/models.py b/taiga/webhooks/models.py index 94e253aa..df8c4c19 100644 --- a/taiga/webhooks/models.py +++ b/taiga/webhooks/models.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/permissions.py b/taiga/webhooks/permissions.py index a2ef0207..e28f183c 100644 --- a/taiga/webhooks/permissions.py +++ b/taiga/webhooks/permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/serializers.py b/taiga/webhooks/serializers.py index d05b25ca..65847ee9 100644 --- a/taiga/webhooks/serializers.py +++ b/taiga/webhooks/serializers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/signal_handlers.py b/taiga/webhooks/signal_handlers.py index 193b100b..af964b0a 100644 --- a/taiga/webhooks/signal_handlers.py +++ b/taiga/webhooks/signal_handlers.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/taiga/webhooks/tasks.py b/taiga/webhooks/tasks.py index 1933ed63..fd7136c5 100644 --- a/taiga/webhooks/tasks.py +++ b/taiga/webhooks/tasks.py @@ -1,6 +1,6 @@ # Copyright (C) 2013 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/conftest.py b/tests/conftest.py index fa3ae01f..9f83de14 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/factories.py b/tests/factories.py index c44167c5..27a6fa81 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/fixtures.py b/tests/fixtures.py index 96d6a8fc..f58dbc18 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/resources_permissions/test_issues_custom_attributes_resource.py b/tests/integration/resources_permissions/test_issues_custom_attributes_resource.py index 4dcdfa7f..06135bda 100644 --- a/tests/integration/resources_permissions/test_issues_custom_attributes_resource.py +++ b/tests/integration/resources_permissions/test_issues_custom_attributes_resource.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/resources_permissions/test_tasks_custom_attributes_resource.py b/tests/integration/resources_permissions/test_tasks_custom_attributes_resource.py index da70bd4e..908b2dd9 100644 --- a/tests/integration/resources_permissions/test_tasks_custom_attributes_resource.py +++ b/tests/integration/resources_permissions/test_tasks_custom_attributes_resource.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/resources_permissions/test_userstories_custom_attributes_resource.py b/tests/integration/resources_permissions/test_userstories_custom_attributes_resource.py index 766bae97..c3cc6916 100644 --- a/tests/integration/resources_permissions/test_userstories_custom_attributes_resource.py +++ b/tests/integration/resources_permissions/test_userstories_custom_attributes_resource.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_auth_api.py b/tests/integration/test_auth_api.py index 02df17fa..bc29698c 100644 --- a/tests/integration/test_auth_api.py +++ b/tests/integration/test_auth_api.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_custom_attributes_issues.py b/tests/integration/test_custom_attributes_issues.py index a29c5d45..1726c22e 100644 --- a/tests/integration/test_custom_attributes_issues.py +++ b/tests/integration/test_custom_attributes_issues.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_custom_attributes_tasks.py b/tests/integration/test_custom_attributes_tasks.py index 6ffaf3b5..c3394b85 100644 --- a/tests/integration/test_custom_attributes_tasks.py +++ b/tests/integration/test_custom_attributes_tasks.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_custom_attributes_user_stories.py b/tests/integration/test_custom_attributes_user_stories.py index 4b1f5079..f348fd18 100644 --- a/tests/integration/test_custom_attributes_user_stories.py +++ b/tests/integration/test_custom_attributes_user_stories.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_exporter_api.py b/tests/integration/test_exporter_api.py index d84f29a1..aebc9655 100644 --- a/tests/integration/test_exporter_api.py +++ b/tests/integration/test_exporter_api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_history.py b/tests/integration/test_history.py index 1b5c4f48..127fec05 100644 --- a/tests/integration/test_history.py +++ b/tests/integration/test_history.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_importer_api.py b/tests/integration/test_importer_api.py index aa588bec..a44a5a46 100644 --- a/tests/integration/test_importer_api.py +++ b/tests/integration/test_importer_api.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_mdrender.py b/tests/integration/test_mdrender.py index cd075845..921c03a6 100644 --- a/tests/integration/test_mdrender.py +++ b/tests/integration/test_mdrender.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_milestones.py b/tests/integration/test_milestones.py index d5675399..6f22bd36 100644 --- a/tests/integration/test_milestones.py +++ b/tests/integration/test_milestones.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_neighbors.py b/tests/integration/test_neighbors.py index 92a532dd..afa5c1fe 100644 --- a/tests/integration/test_neighbors.py +++ b/tests/integration/test_neighbors.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_notifications.py b/tests/integration/test_notifications.py index 3e04277c..4e442f21 100644 --- a/tests/integration/test_notifications.py +++ b/tests/integration/test_notifications.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_occ.py b/tests/integration/test_occ.py index 2cbdaced..ba11e8dc 100644 --- a/tests/integration/test_occ.py +++ b/tests/integration/test_occ.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_references_sequences.py b/tests/integration/test_references_sequences.py index 815bf420..67157daf 100644 --- a/tests/integration/test_references_sequences.py +++ b/tests/integration/test_references_sequences.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_roles.py b/tests/integration/test_roles.py index 0bc773e7..157cfbd0 100644 --- a/tests/integration/test_roles.py +++ b/tests/integration/test_roles.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_searches.py b/tests/integration/test_searches.py index c191682f..06c95325 100644 --- a/tests/integration/test_searches.py +++ b/tests/integration/test_searches.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_throwttling.py b/tests/integration/test_throwttling.py index 93c3a26d..9d0b220a 100644 --- a/tests/integration/test_throwttling.py +++ b/tests/integration/test_throwttling.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/integration/test_timeline.py b/tests/integration/test_timeline.py index c96760e9..7e3f7104 100644 --- a/tests/integration/test_timeline.py +++ b/tests/integration/test_timeline.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_us_autoclosing.py b/tests/integration/test_us_autoclosing.py index a3b43c12..947fc802 100644 --- a/tests/integration/test_us_autoclosing.py +++ b/tests/integration/test_us_autoclosing.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_userstorage_api.py b/tests/integration/test_userstorage_api.py index d4050232..60900a06 100644 --- a/tests/integration/test_userstorage_api.py +++ b/tests/integration/test_userstorage_api.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_vote_issues.py b/tests/integration/test_vote_issues.py index 9b880d36..fbd2cdff 100644 --- a/tests/integration/test_vote_issues.py +++ b/tests/integration/test_vote_issues.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_vote_tasks.py b/tests/integration/test_vote_tasks.py index 8b1a3605..ce6b8c40 100644 --- a/tests/integration/test_vote_tasks.py +++ b/tests/integration/test_vote_tasks.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_vote_userstories.py b/tests/integration/test_vote_userstories.py index ae118db1..a1626e59 100644 --- a/tests/integration/test_vote_userstories.py +++ b/tests/integration/test_vote_userstories.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_votes.py b/tests/integration/test_votes.py index 0408529e..d192ffed 100644 --- a/tests/integration/test_votes.py +++ b/tests/integration/test_votes.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_issues.py b/tests/integration/test_watch_issues.py index 36ac157e..6c9f2c8f 100644 --- a/tests/integration/test_watch_issues.py +++ b/tests/integration/test_watch_issues.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_milestones.py b/tests/integration/test_watch_milestones.py index acbbe85a..409ade56 100644 --- a/tests/integration/test_watch_milestones.py +++ b/tests/integration/test_watch_milestones.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_projects.py b/tests/integration/test_watch_projects.py index fd1c9560..5ea1dd2f 100644 --- a/tests/integration/test_watch_projects.py +++ b/tests/integration/test_watch_projects.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_tasks.py b/tests/integration/test_watch_tasks.py index 03b70190..88abfb57 100644 --- a/tests/integration/test_watch_tasks.py +++ b/tests/integration/test_watch_tasks.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_userstories.py b/tests/integration/test_watch_userstories.py index aaf797b8..7a1b05ec 100644 --- a/tests/integration/test_watch_userstories.py +++ b/tests/integration/test_watch_userstories.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_watch_wikipages.py b/tests/integration/test_watch_wikipages.py index e90e2cd1..6565f27f 100644 --- a/tests/integration/test_watch_wikipages.py +++ b/tests/integration/test_watch_wikipages.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/integration/test_webhooks.py b/tests/integration/test_webhooks.py index 4e33b919..cf698bc8 100644 --- a/tests/integration/test_webhooks.py +++ b/tests/integration/test_webhooks.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/models.py b/tests/models.py index 87c667dc..0610c340 100644 --- a/tests/models.py +++ b/tests/models.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index ac4f395d..da106fd8 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/test_base_api_permissions.py b/tests/unit/test_base_api_permissions.py index e0fc748c..fe5bc6a7 100644 --- a/tests/unit/test_base_api_permissions.py +++ b/tests/unit/test_base_api_permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/unit/test_deferred.py b/tests/unit/test_deferred.py index 46afe862..dc97fa83 100644 --- a/tests/unit/test_deferred.py +++ b/tests/unit/test_deferred.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/unit/test_export.py b/tests/unit/test_export.py index 17564fa7..a2c39a12 100644 --- a/tests/unit/test_export.py +++ b/tests/unit/test_export.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/unit/test_gravatar.py b/tests/unit/test_gravatar.py index ba1d18be..ef303b22 100644 --- a/tests/unit/test_gravatar.py +++ b/tests/unit/test_gravatar.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/unit/test_mdrender.py b/tests/unit/test_mdrender.py index a58e5cca..6de7aa4f 100644 --- a/tests/unit/test_mdrender.py +++ b/tests/unit/test_mdrender.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/test_permissions.py b/tests/unit/test_permissions.py index b4c0ae45..f35784c7 100644 --- a/tests/unit/test_permissions.py +++ b/tests/unit/test_permissions.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/unit/test_slug.py b/tests/unit/test_slug.py index 65fb4cf0..e53946d4 100644 --- a/tests/unit/test_slug.py +++ b/tests/unit/test_slug.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/test_timeline.py b/tests/unit/test_timeline.py index 7e8ff24b..2e0b6374 100644 --- a/tests/unit/test_timeline.py +++ b/tests/unit/test_timeline.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/test_tokens.py b/tests/unit/test_tokens.py index ca2b09b2..666fa5e2 100644 --- a/tests/unit/test_tokens.py +++ b/tests/unit/test_tokens.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index ff6889ab..008877e0 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -1,6 +1,6 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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 diff --git a/tests/utils.py b/tests/utils.py index 389d9c59..6f83d418 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,7 +1,7 @@ -# Copyright (C) 2014-2015 Andrey Antukh -# Copyright (C) 2014-2015 Jesús Espino -# Copyright (C) 2014-2015 David Barragán -# Copyright (C) 2014-2015 Anler Hernández +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Anler Hernández # 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 From b142cafc1405f098a4911fd07c541ec2c220907e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 4 Jan 2016 08:50:58 +0100 Subject: [PATCH 57/64] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0debdc..a377e771 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ - Lots of small and not so small bugfixes. -## 1.9.0 Abies Siberica (2015-11-XX) +## 1.9.0 Abies Siberica (2015-11-02) ### Features From a4172012ba4523cf3ee3935d6f0946500e17344c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 5 Nov 2015 10:16:12 +0100 Subject: [PATCH 58/64] Improving milestone stats API --- taiga/projects/milestones/api.py | 11 ++--- taiga/projects/milestones/models.py | 70 +++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index a61806cc..aca1ab24 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -113,10 +113,10 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView 'estimated_finish': milestone.estimated_finish, 'total_points': total_points, 'completed_points': milestone.closed_points.values(), - 'total_userstories': milestone.user_stories.count(), - 'completed_userstories': len([us for us in milestone.user_stories.all() if us.is_closed]), - 'total_tasks': milestone.tasks.all().count(), - 'completed_tasks': milestone.tasks.all().filter(status__is_closed=True).count(), + 'total_userstories': milestone.get_cached_user_stories().count(), + 'completed_userstories': milestone.get_cached_user_stories().filter(is_closed=True).count(), + 'total_tasks': milestone.tasks.count(), + 'completed_tasks': milestone.tasks.filter(status__is_closed=True).count(), 'iocaine_doses': milestone.tasks.filter(is_iocaine=True).count(), 'days': [] } @@ -125,11 +125,12 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView optimal_points = sumTotalPoints milestone_days = (milestone.estimated_finish - milestone.estimated_start).days optimal_points_per_day = sumTotalPoints / milestone_days if milestone_days else 0 + while current_date <= milestone.estimated_finish: milestone_stats['days'].append({ 'day': current_date, 'name': current_date.day, - 'open_points': sumTotalPoints - sum(milestone.closed_points_by_date(current_date).values()), + 'open_points': sumTotalPoints - milestone.total_closed_points_by_date(current_date), 'optimal_points': optimal_points, }) current_date = current_date + datetime.timedelta(days=1) diff --git a/taiga/projects/milestones/models.py b/taiga/projects/milestones/models.py index 83fe8cfc..30936e9a 100644 --- a/taiga/projects/milestones/models.py +++ b/taiga/projects/milestones/models.py @@ -14,7 +14,9 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from django.apps import apps from django.db import models +from django.db.models import Prefetch, Count from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.utils import timezone @@ -53,6 +55,8 @@ class Milestone(WatchedModelMixin, models.Model): order = models.PositiveSmallIntegerField(default=1, null=False, blank=False, verbose_name=_("order")) _importing = None + _total_closed_points_by_date = None + _cached_user_stories = None class Meta: verbose_name = "milestone" @@ -82,6 +86,14 @@ class Milestone(WatchedModelMixin, models.Model): super().save(*args, **kwargs) + def get_cached_user_stories(self): + if self._cached_user_stories is None: + self._cached_user_stories = self.user_stories.\ + prefetch_related("role_points", "role_points__points").\ + annotate(num_tasks=Count("tasks")) + + return self._cached_user_stories + def _get_user_stories_points(self, user_stories): role_points = [us.role_points.all() for us in user_stories] flat_role_points = itertools.chain(*role_points) @@ -91,13 +103,13 @@ class Milestone(WatchedModelMixin, models.Model): @property def total_points(self): return self._get_user_stories_points( - [us for us in self.user_stories.all()] + [us for us in self.get_cached_user_stories()] ) @property def closed_points(self): return self._get_user_stories_points( - [us for us in self.user_stories.all() if us.is_closed] + [us for us in self.get_cached_user_stories() if us.is_closed] ) def _get_increment_points(self): @@ -148,9 +160,51 @@ class Milestone(WatchedModelMixin, models.Model): def shared_increment_points(self): return self._get_increment_points()["shared_increment"] - def closed_points_by_date(self, date): - return self._get_user_stories_points([ - us for us in self.user_stories.filter( - finish_date__lt=date + datetime.timedelta(days=1) - ).prefetch_related('role_points', 'role_points__points') if us.is_closed - ]) + def total_closed_points_by_date(self, date): + # Milestone instance will keep a cache of the total closed points by date + if self._total_closed_points_by_date is None: + self._total_closed_points_by_date = {} + + # We need to keep the milestone user stories indexed by id in a dict + user_stories = {} + for us in self.get_cached_user_stories(): + us._total_us_points = sum(self._get_user_stories_points([us]).values()) + user_stories[us.id] = us + + tasks = self.tasks.\ + select_related("user_story").\ + exclude(finished_date__isnull=True).\ + exclude(user_story__isnull=True) + + # For each finished task we try to know the proporional part of points + # it represetnts from the user story and add it to the closed points + # for that date + # This calulation is the total user story points divided by its number of tasks + for task in tasks: + user_story = user_stories[task.user_story.id] + total_us_points = user_story._total_us_points + us_tasks_counter = user_story.num_tasks + + # If the task was finished before starting the sprint it needs + # to be included + finished_date = task.finished_date.date() + if finished_date < self.estimated_start: + finished_date = self.estimated_start + + points_by_date = self._total_closed_points_by_date.get(finished_date, 0) + points_by_date += total_us_points / us_tasks_counter + self._total_closed_points_by_date[finished_date] = points_by_date + + # At this point self._total_closed_points_by_date keeps a dict where the + # finished date of the task is the key and the value is the increment of points + # We are transforming this dict of increments in an acumulation one including + # all the dates from the sprint + + acumulated_date_points = 0 + current_date = self.estimated_start + while current_date <= self.estimated_finish: + acumulated_date_points += self._total_closed_points_by_date.get(current_date, 0) + self._total_closed_points_by_date[current_date] = acumulated_date_points + current_date = current_date + datetime.timedelta(days=1) + + return self._total_closed_points_by_date.get(date, 0) From 4ea2262400c8f311b2b9f3e4bcc13d1dfc99aed2 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 4 Jan 2016 10:58:50 +0100 Subject: [PATCH 59/64] Issue #3492: Search fails if using quotating marks --- taiga/base/utils/db.py | 3 ++- tests/unit/test_utils.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py index b3ff07a7..f9fd4b9d 100644 --- a/taiga/base/utils/db.py +++ b/taiga/base/utils/db.py @@ -208,10 +208,11 @@ def to_tsquery(term): if not bit: continue - if bit.startswith('"') and bit.endswith('"'): + if bit.startswith('"') and bit.endswith('"') and len(bit)>2: res.append(bit.replace('"', "'")) else: res.append("'%s':*" %(bit.replace("'", ""), )) + res.append("&") while res and res[-1] in magic_values: diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 008877e0..483f2528 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -108,6 +108,9 @@ TS_QUERY_TRANSFORMATIONS = [ ("(1)", "( 1 )"), ("1((", "1"), ("test\\", "'test':*"), + ('"', "'\"':*"), + ('""', "'\"\"':*"), + ('"""', "'\"\"':* & '\"':*"), ] def test_to_tsquery(): for (input, expected) in TS_QUERY_TRANSFORMATIONS: From 93412840c9f8173f2579aac912ca17dc28fd6222 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 4 Jan 2016 12:50:49 +0100 Subject: [PATCH 60/64] Issue #3283: Taiga 1.8.0: HTTP error 500 while trying to delete project as admin. --- taiga/projects/admin.py | 3 +++ taiga/projects/api.py | 25 +------------------------ taiga/projects/models.py | 25 +++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/taiga/projects/admin.py b/taiga/projects/admin.py index 51bcb8d6..632f0f79 100644 --- a/taiga/projects/admin.py +++ b/taiga/projects/admin.py @@ -98,6 +98,9 @@ class ProjectAdmin(admin.ModelAdmin): memberships__project=self.obj) return super().formfield_for_manytomany(db_field, request, **kwargs) + def delete_model(self, request, obj): + obj.delete_related_content() + super().delete_model(request, obj) # User Stories common admins diff --git a/taiga/projects/api.py b/taiga/projects/api.py index e37a9f98..fb333cb0 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -253,36 +253,13 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) super().pre_save(obj) def destroy(self, request, *args, **kwargs): - from taiga.events.apps import connect_events_signals, disconnect_events_signals - from taiga.projects.tasks.apps import connect_all_tasks_signals, disconnect_all_tasks_signals - from taiga.projects.userstories.apps import connect_all_userstories_signals, disconnect_all_userstories_signals - from taiga.projects.issues.apps import connect_all_issues_signals, disconnect_all_issues_signals - from taiga.projects.apps import connect_memberships_signals, disconnect_memberships_signals - obj = self.get_object_or_none() self.check_permissions(request, 'destroy', obj) if obj is None: raise Http404 - disconnect_events_signals() - disconnect_all_issues_signals() - disconnect_all_tasks_signals() - disconnect_all_userstories_signals() - disconnect_memberships_signals() - - try: - obj.tasks.all().delete() - obj.user_stories.all().delete() - obj.issues.all().delete() - obj.memberships.all().delete() - obj.roles.all().delete() - finally: - connect_events_signals() - connect_all_issues_signals() - connect_all_tasks_signals() - connect_all_userstories_signals() - connect_memberships_signals() + obj.delete_related_content() self.pre_delete(obj) self.pre_conditions_on_delete(obj) diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 39c18e2a..95fbdd8c 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -308,6 +308,31 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): notify_policy = get_notify_policy(self, user) set_notify_policy_level_to_ignore(notify_policy) + def delete_related_content(self): + from taiga.events.apps import connect_events_signals, disconnect_events_signals + from taiga.projects.tasks.apps import connect_all_tasks_signals, disconnect_all_tasks_signals + from taiga.projects.userstories.apps import connect_all_userstories_signals, disconnect_all_userstories_signals + from taiga.projects.issues.apps import connect_all_issues_signals, disconnect_all_issues_signals + from taiga.projects.apps import connect_memberships_signals, disconnect_memberships_signals + + disconnect_events_signals() + disconnect_all_issues_signals() + disconnect_all_tasks_signals() + disconnect_all_userstories_signals() + disconnect_memberships_signals() + + try: + self.tasks.all().delete() + self.user_stories.all().delete() + self.issues.all().delete() + self.memberships.all().delete() + self.roles.all().delete() + finally: + connect_events_signals() + connect_all_issues_signals() + connect_all_tasks_signals() + connect_all_userstories_signals() + connect_memberships_signals() class ProjectModulesConfig(models.Model): project = models.OneToOneField("Project", null=False, blank=False, From 7eb138c200edd4ce7e068b58736d37da89bbf87b Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 4 Jan 2016 15:01:17 +0100 Subject: [PATCH 61/64] Adding command to send notification messages --- CHANGELOG.md | 7 ++-- taiga/events/management/__init__.py | 0 .../commands/emit_notification_message.py | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 taiga/events/management/__init__.py create mode 100644 taiga/events/management/commands/emit_notification_message.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a377e771..d67e35c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Improve the django admin panel, now it is more usable and all the selector fields works properly. - [API] Add tribe_gig field to user stories (improve integration between Taiga and Taiga Tribe). - [API] Performance improvements for project stats. +- [Events] Add command to send an instant notifications to all the currently online users. - Lots of small and not so small bugfixes. @@ -24,7 +25,8 @@ - US, tasks and Issues can be upvoted or downvoted and the voters list can be obtained. - Now users can watch public issues, tasks and user stories. - Add endpoints to show the watchers list for issues, tasks and user stories. -- Add a "field type" property for custom fields: 'text', 'multiline text' and 'date' right now (thanks to [@artlepool](https://github.com/artlepool)). +- Add a "field type" property for custom fields: 'text', 'multiline text' and 'date' right nowi + (thanks to [@artlepool](https://github.com/artlepool)). - Allow multiple actions in the commit messages. - Now every user that coments USs, Issues or Tasks will be involved in it (add author to the watchers list). - Now profile timelines only show content about the objects (US/Tasks/Issues/Wiki pages) you are involved. @@ -50,7 +52,8 @@ - API: Improve and fix some errors in issues/filters_data and userstories/filters_data. - API: resolver suport ref GET param and return a story, task or issue. - Webhooks: Add deleted datetime to webhooks responses when isues, tasks or USs are deleted. -- Add headers to allow threading for notification emails about changes to issues, tasks, user stories, and wiki pages. (thanks to [@brett](https://github.com/brettp)). +- Add headers to allow threading for notification emails about changes to issues, tasks, user stories, + and wiki pages. (thanks to [@brett](https://github.com/brettp)). - Lots of small and not so small bugfixes. diff --git a/taiga/events/management/__init__.py b/taiga/events/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/events/management/commands/emit_notification_message.py b/taiga/events/management/commands/emit_notification_message.py new file mode 100644 index 00000000..4d075e92 --- /dev/null +++ b/taiga/events/management/commands/emit_notification_message.py @@ -0,0 +1,34 @@ +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 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.core.management.base import BaseCommand + +from taiga.events.events import emit_event + +class Command(BaseCommand): + help = 'Send a notification message to the current users' + + def add_arguments(self, parser): + parser.add_argument("title", help="The title of the message.") + parser.add_argument("description", help="The description of the message.") + + def handle(self, **options): + data = { + "title": options["title"], + "desc": options["description"], + } + routing_key = "notifications" + emit_event(data, routing_key) From ae65db65b0e018714cf2f4625cfe5fd8d0874c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 27 Nov 2015 22:38:19 +0100 Subject: [PATCH 62/64] Not existing neighbor return None, not empty dict --- taiga/projects/issues/serializers.py | 4 +++- taiga/projects/tasks/serializers.py | 4 +++- taiga/projects/userstories/serializers.py | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/taiga/projects/issues/serializers.py b/taiga/projects/issues/serializers.py index 098043a2..d5f3af66 100644 --- a/taiga/projects/issues/serializers.py +++ b/taiga/projects/issues/serializers.py @@ -81,7 +81,9 @@ class IssueListSerializer(IssueSerializer): class IssueNeighborsSerializer(NeighborsSerializerMixin, IssueSerializer): def serialize_neighbor(self, neighbor): - return NeighborIssueSerializer(neighbor).data + if neighbor: + return NeighborIssueSerializer(neighbor).data + return None class NeighborIssueSerializer(serializers.ModelSerializer): diff --git a/taiga/projects/tasks/serializers.py b/taiga/projects/tasks/serializers.py index 49e43680..09a42763 100644 --- a/taiga/projects/tasks/serializers.py +++ b/taiga/projects/tasks/serializers.py @@ -79,7 +79,9 @@ class TaskListSerializer(TaskSerializer): class TaskNeighborsSerializer(NeighborsSerializerMixin, TaskSerializer): def serialize_neighbor(self, neighbor): - return NeighborTaskSerializer(neighbor).data + if neighbor: + return NeighborTaskSerializer(neighbor).data + return None class NeighborTaskSerializer(serializers.ModelSerializer): diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index a8d700d3..5e761d14 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -113,7 +113,9 @@ class UserStoryListSerializer(UserStorySerializer): class UserStoryNeighborsSerializer(NeighborsSerializerMixin, UserStorySerializer): def serialize_neighbor(self, neighbor): - return NeighborUserStorySerializer(neighbor).data + if neighbor: + return NeighborUserStorySerializer(neighbor).data + return None class NeighborUserStorySerializer(serializers.ModelSerializer): From f30d455ee95106a96a38c91ad5f8abd663a80588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 5 Jan 2016 08:37:27 +0100 Subject: [PATCH 63/64] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d67e35c9..a605221f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog # -## 1.9.1 Taiga Tribe (unreleased) +## 1.9.1 Taiga Tribe (2016-01-05) ### Features - [CSV Reports] Add fields "created_date", "modified_date", "finished_date" to issues CSV report. From d817f19c713bd3d6cadf77b22d239483d039354c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 5 Jan 2016 11:11:53 +0100 Subject: [PATCH 64/64] [i18n] Update locales --- taiga/locale/ca/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/de/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/en/LC_MESSAGES/django.po | 340 ++++++++++---------- taiga/locale/es/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/fi/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/fr/LC_MESSAGES/django.po | 345 +++++++++++---------- taiga/locale/it/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/nl/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/pl/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/pt_BR/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/ru/LC_MESSAGES/django.po | 338 ++++++++++---------- taiga/locale/zh-Hant/LC_MESSAGES/django.po | 338 ++++++++++---------- 12 files changed, 2033 insertions(+), 2032 deletions(-) diff --git a/taiga/locale/ca/LC_MESSAGES/django.po b/taiga/locale/ca/LC_MESSAGES/django.po index 27b52fd7..063a8865 100644 --- a/taiga/locale/ca/LC_MESSAGES/django.po +++ b/taiga/locale/ca/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 13:35+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -182,16 +182,16 @@ msgstr "" "Puja una imatge vàlida. El fitxer que has pujat no ès una imatge o el fitxer " "està corrupte." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "La página no es 'last' ni pot ser convertida a un 'int'" -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Pàgina invàlida (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "" @@ -330,12 +330,12 @@ msgstr "Error d'integritat per argument invàlid o erroni." msgid "Precondition error" msgstr "Precondició errònia." -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "" -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "" @@ -537,7 +537,7 @@ msgid "It contain invalid custom fields." msgstr "Conté camps personalitzats invàlids." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -705,12 +705,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "Nom" @@ -726,8 +726,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "Descripció" @@ -748,11 +748,11 @@ msgstr "" msgid "application" msgstr "" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "Nom complet" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "Adreça d'email" @@ -763,9 +763,9 @@ msgstr "Comentari" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -836,7 +836,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "El payload no és un arxiu json vàlid" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "El projecte no existeix" @@ -1143,11 +1143,11 @@ msgstr "" msgid "Not valid template description" msgstr "" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Al menys un del usuaris ha de ser administrador" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "No tens permisos per a veure açò." @@ -1160,24 +1160,24 @@ msgid "Project ID not matches between object and project" msgstr "" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "Amo" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "Projecte" @@ -1191,9 +1191,9 @@ msgstr "Id d'objecte" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "Data de modificació" @@ -1212,11 +1212,11 @@ msgstr "està obsolet " #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "Ordre" @@ -1258,7 +1258,7 @@ msgid "values" msgstr "" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "història d'usuari" @@ -1294,102 +1294,102 @@ msgstr "Crea" msgid "Delete" msgstr "Borra" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s punts de rol" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "De" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "a" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Afegir nou arxiu" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Arxiu actualitzat" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "Obsolet" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "No obsolet" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Arxiu borrat" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "Afegit" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "Borrat" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Sense assignar" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-borrat-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "a:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "desde:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Afegit" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Canviat" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Borrat" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "afegit:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "borrat:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "Desde:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "A:" @@ -1407,33 +1407,33 @@ msgstr "nota de bloqueig" msgid "sprint" msgstr "" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "No tens permissos per a ficar aquest sprint a aquesta incidència" -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "No tens permissos per a ficar aquest status a aquesta tasca" -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "No tens permissos per a ficar aquesta severitat a aquesta tasca" -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "No tens permissos per a ficar aquesta prioritat a aquesta incidència" -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "No tens permissos per a ficar aquest tipus a aquesta incidència" #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "estatus" @@ -1446,7 +1446,7 @@ msgid "priority" msgstr "prioritat" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "fita" @@ -1455,17 +1455,17 @@ msgid "finished date" msgstr "Data de finalització" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "tema" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "assignada a" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "referència externa" @@ -1482,31 +1482,31 @@ msgstr "" msgid "Like" msgstr "M'agrada" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "Data estimada d'inici" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "Data estimada de finalització" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "està tancat" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibilitat" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "" @@ -1535,7 +1535,7 @@ msgstr "email" msgid "create at" msgstr "" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1591,27 +1591,27 @@ msgstr "total de fites" msgid "total story points" msgstr "total de punts d'història" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "activa panell de backlog" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "activa panell de kanban" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "activa panell de wiki" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "activa panell d'incidències" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "sistema de videoconferència" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "" @@ -1635,67 +1635,67 @@ msgstr "es privat" msgid "tags colors" msgstr "colors de tags" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "configuració de mòdules" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "està arxivat" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "color" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "limit de treball en progrés" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "valor" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "rol d'amo per defecte" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "opcions per defecte" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "status d'històries d'usuari" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "punts" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "status de tasques" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "status d'incidències" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "tipus d'incidències" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "prioritats" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "severitats" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "rols" @@ -2286,23 +2286,23 @@ msgstr "Severitats" msgid "Roles" msgstr "Rols" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" @@ -2680,45 +2680,45 @@ msgstr "" msgid "Stakeholder" msgstr "" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rol" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "ordre de backlog" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "ordre d'sprint" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "data de finalització" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "requeriment de client" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "requeriment d'equip" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "generat desde incidéncia" @@ -2787,57 +2787,57 @@ msgstr "Email duplicat" msgid "Not valid email" msgstr "Email no vàlid" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Nom d'usuari o email invàlid" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Correu enviat satisfactòriament" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Token invàlid" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Paràmetre de password actual requerit" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Paràmetre de password requerit" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Password invàlid, al menys 6 caràcters requerits" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Password actual invàlid" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Arguments incomplets." -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Format d'image invàlid" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Invàlid. Estás segur que el token es correcte i que no l'has usat abans?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Invàlid. Estás segur que el token es correcte?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "estatus de superusuari" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -2845,24 +2845,24 @@ msgstr "" "Designa que aquest usuari te tots els permisos sense asignarli-los " "explícitament." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "mot d'usuari" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Requerit. 30 caràcters o menys. Lletres, nombres i caràcters /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Introdueix un nom d'usuari vàlid" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "actiu" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -2870,43 +2870,43 @@ msgstr "" "Designa si aquest usuari ha de se tractac com actiu. Deselecciona açó en " "lloc de borrar el compte." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografia" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "foto" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "data d'unió" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "llenguatge per defecte" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "zona horaria per defecte" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "coloritza tags" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "token de correu" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nova adreça de correu" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "permissos" @@ -2918,7 +2918,7 @@ msgstr "invàlid" msgid "Invalid username. Try with a different one." msgstr "Nom d'usuari invàlid" -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "" diff --git a/taiga/locale/de/LC_MESSAGES/django.po b/taiga/locale/de/LC_MESSAGES/django.po index 40f4231c..92c3539e 100644 --- a/taiga/locale/de/LC_MESSAGES/django.po +++ b/taiga/locale/de/LC_MESSAGES/django.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-11 09:45+0000\n" "Last-Translator: Guido Brand\n" "Language-Team: German (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -212,16 +212,16 @@ msgstr "" "Bitte laden Sie ein gültiges Bild hoch. Die Datei, die Sie hochgeladen " "haben, ist entweder kein Bild oder defekt." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Seite ist nicht 'letzte', noch kann diese konvertiert werden." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Ungültige Seite (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Ungültige Berechtigungsdefinition" @@ -362,12 +362,12 @@ msgstr "Integritätsfehler wegen falscher oder ungültiger Argumente" msgid "Precondition error" msgstr "Voraussetzungsfehler" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Fehler in Filter Parameter Typen." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' muss ein Integer-Wert sein." @@ -592,7 +592,7 @@ msgid "It contain invalid custom fields." msgstr "Enthält ungültige Benutzerfelder." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -853,12 +853,12 @@ msgstr "Authentifizierung erforderlich" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "Name" @@ -874,8 +874,8 @@ msgstr "Web" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "Beschreibung" @@ -896,11 +896,11 @@ msgstr "Benutzer" msgid "application" msgstr "Applikation" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "vollständiger Name" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "E-Mail Adresse" @@ -911,9 +911,9 @@ msgstr "Kommentar" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -984,7 +984,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "Die Nutzlast ist kein gültiges json" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Das Projekt existiert nicht" @@ -1333,11 +1333,11 @@ msgstr "Unglültiger Templatename" msgid "Not valid template description" msgstr "Ungültige Templatebeschreibung" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Mindestens ein Benutzer muss ein aktiver Administrator sein. " -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Sie haben keine Berechtigungen für diese Ansicht" @@ -1350,24 +1350,24 @@ msgid "Project ID not matches between object and project" msgstr "Nr. unterschreidet sich zwischen dem Objekt und dem Projekt" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "Besitzer" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "Projekt" @@ -1381,9 +1381,9 @@ msgstr "Objekt Nr." #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "Zeitpunkt der Änderung" @@ -1402,11 +1402,11 @@ msgstr "wurde verworfen" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "Reihenfolge" @@ -1448,7 +1448,7 @@ msgid "values" msgstr "Werte" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "User-Story" @@ -1484,102 +1484,102 @@ msgstr "Erzeugen" msgid "Delete" msgstr "Löschen" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s Rollenpunkte " -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "Von" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "An" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Neuen Anhang hinzugefügt" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Anhang aktualisiert" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "verworfen" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "nicht verworfen" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Gelöschter Anhang" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "hinzugefügt" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "entfernt" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Nicht zugewiesen" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-gelöscht-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "An:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "Von:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Hinzugefügt" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Geändert" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Gelöscht" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "hinzugefügt:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "entfernt:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "Von:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "An:" @@ -1597,37 +1597,37 @@ msgstr "Blockierungsgrund" msgid "sprint" msgstr "Sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "" "Sie haben nicht die Berechtigung, das Ticket auf diesen Sprint zu setzen." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "" "Sie haben nicht die Berechtigung, das Ticket auf diesen Status zu setzen. " -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "" "Sie haben nicht die Berechtigung, das Ticket auf diese Gewichtung zu setzen." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "" "Sie haben nicht die Berechtigung, das Ticket auf diese Priorität zu setzen. " -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Sie haben nicht die Berechtigung, das Ticket auf diese Art zu setzen." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "Status" @@ -1640,7 +1640,7 @@ msgid "priority" msgstr "Priorität" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "Meilenstein" @@ -1649,17 +1649,17 @@ msgid "finished date" msgstr "Datum der Fertigstellung" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "Betreff" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "zugewiesen an" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "externe Referenz" @@ -1676,31 +1676,31 @@ msgstr "Likes" msgid "Like" msgstr "Like" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "Slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "geschätzter Starttermin" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "geschätzter Endtermin" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "ist geschlossen" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "Verfügbarkeit" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "Der erwartete Beginn muss vor dem erwarteten Ende liegen. " @@ -1729,7 +1729,7 @@ msgstr "E-Mail" msgid "create at" msgstr "erstellt am " -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "Token" @@ -1785,27 +1785,27 @@ msgstr "Meilensteine Gesamt" msgid "total story points" msgstr "Story Punkte insgesamt" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "aktives Backlog Panel" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "aktives Kanban Panel" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "aktives Wiki Panel" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "aktives Tickets Panel" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "Videokonferenzsystem" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "Zusatzdaten Videokonferenz" @@ -1829,67 +1829,67 @@ msgstr "ist privat" msgid "tags colors" msgstr "Tag Farben" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "Module konfigurieren" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "ist archiviert" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "Farbe" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "Ausführungslimit" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "Wert" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "voreingestellte Besitzerrolle" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "Vorgabe Optionen" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "User-Story Status " -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "Punkte" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "Aufgaben Status" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "Ticket Status" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "Ticket Arten" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "Prioritäten" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "Gewichtung" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "Rollen" @@ -2760,26 +2760,26 @@ msgstr "Gewichtung" msgid "Roles" msgstr "Rollen" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Zukünftiger Sprint" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Projektende" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" "Sie haben nicht die Berechtigung, diesen Sprint auf diese Aufgabe zu setzen" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" "Sie haben nicht die Berechtigung, diese User-Story auf diese Aufgabe zu " "setzen" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" "Sie haben nicht die Berechtigung, diesen Status auf diese Aufgabe zu setzen." @@ -3201,49 +3201,49 @@ msgstr "Projekteigentümer " msgid "Stakeholder" msgstr "Stakeholder" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" "Sie haben nicht die Berechtigung, diesen Sprint auf diese User-Story zu " "setzen." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" "Sie haben nicht die Berechtigung, diesen Status auf diese User-Story zu " "setzen." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "Erstelle die User-Story #{ref} - {subject}" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "Rolle" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "Backlog Befehl " -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "Sprintreihenfolge" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "Endtermin" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "ist Kundenanforderung" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "ist Teamanforderung" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "erzeugt von Ticket" @@ -3312,58 +3312,58 @@ msgstr "Doppelte E-Mail" msgid "Not valid email" msgstr "Ungültige E-Mail" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Ungültiger Benutzername oder E-Mail" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "E-Mail erfolgreich gesendet." -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Token ist ungültig" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Aktueller Passwort Parameter wird benötigt" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Neuer Passwort Parameter benötigt" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Ungültige Passwortlänge, mindestens 6 Zeichen erforderlich" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Ungültiges aktuelles Passwort" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Unvollständige Argumente" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Ungültiges Bildformat" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Ungültig. Sind Sie sicher, dass das Token korrekt ist und Sie es nicht " "bereits verwendet haben?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Ungültig. Sind Sie sicher, dass das Token korrekt ist?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "Superuser Status" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -3371,25 +3371,25 @@ msgstr "" "Dieser Benutzer soll alle Berechtigungen erhalten, ohne dass diese zuvor " "zugewiesen werden müssen. " -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "Benutzername" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "" "Benötigt. 30 Zeichen oder weniger.. Buchstaben, Zahlen und /./-/_ Zeichen" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Geben Sie einen gültigen Benuzternamen ein." -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "aktiv" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3397,43 +3397,43 @@ msgstr "" "Kennzeichnet den Benutzer als aktiv. Deaktiviere die Option anstelle einen " "Benutzer zu löschen." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "Über mich" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "Foto" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "Beitrittsdatum" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "Vorgegebene Sprache" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "Standard-Theme" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "Vorgegebene Zeitzone" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "Tag-Farben" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "E-Mail Token" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "neue E-Mail Adresse" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "Berechtigungen" @@ -3445,7 +3445,7 @@ msgstr "ungültig" msgid "Invalid username. Try with a different one." msgstr "Ungültiger Benutzername. Versuchen Sie es mit einem anderen." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Benutzername oder Passwort stimmen mit keinem Benutzer überein." diff --git a/taiga/locale/en/LC_MESSAGES/django.po b/taiga/locale/en/LC_MESSAGES/django.po index 51d53df2..f54add46 100644 --- a/taiga/locale/en/LC_MESSAGES/django.po +++ b/taiga/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-03-25 20:09+0100\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Taiga Dev Team \n" @@ -174,16 +174,16 @@ msgid "" "corrupted image." msgstr "" -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "" -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "" @@ -322,12 +322,12 @@ msgstr "" msgid "Precondition error" msgstr "" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "" -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "" @@ -526,7 +526,7 @@ msgid "It contain invalid custom fields." msgstr "" #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -694,12 +694,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "" @@ -715,8 +715,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "" @@ -737,11 +737,11 @@ msgstr "" msgid "application" msgstr "" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "" @@ -752,9 +752,9 @@ msgstr "" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -809,7 +809,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "" @@ -1116,11 +1116,11 @@ msgstr "" msgid "Not valid template description" msgstr "" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "" @@ -1133,24 +1133,24 @@ msgid "Project ID not matches between object and project" msgstr "" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "" @@ -1164,9 +1164,9 @@ msgstr "" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "" @@ -1185,11 +1185,11 @@ msgstr "" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "" @@ -1231,7 +1231,7 @@ msgid "values" msgstr "" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "" @@ -1267,102 +1267,102 @@ msgstr "" msgid "Delete" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "" -#: 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 "" - #: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 #: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +msgid "From:" +msgstr "" + +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "" @@ -1380,33 +1380,33 @@ msgstr "" msgid "sprint" msgstr "" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "" -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "" -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "" -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "" -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "" #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "" @@ -1419,7 +1419,7 @@ msgid "priority" msgstr "" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "" @@ -1428,17 +1428,17 @@ msgid "finished date" msgstr "" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "" @@ -1455,31 +1455,31 @@ msgstr "" msgid "Like" msgstr "" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "" @@ -1508,7 +1508,7 @@ msgstr "" msgid "create at" msgstr "" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "" @@ -1564,27 +1564,27 @@ msgstr "" msgid "total story points" msgstr "" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "" @@ -1608,67 +1608,67 @@ msgstr "" msgid "tags colors" msgstr "" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "" @@ -2253,23 +2253,23 @@ msgstr "" msgid "Roles" msgstr "" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" @@ -2629,45 +2629,45 @@ msgstr "" msgid "Stakeholder" msgstr "" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "" @@ -2736,121 +2736,121 @@ msgstr "" msgid "Not valid email" msgstr "" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "" -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "" -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "" @@ -2862,7 +2862,7 @@ msgstr "" msgid "Invalid username. Try with a different one." msgstr "" -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "" diff --git a/taiga/locale/es/LC_MESSAGES/django.po b/taiga/locale/es/LC_MESSAGES/django.po index 56a107ca..c04a0dd3 100644 --- a/taiga/locale/es/LC_MESSAGES/django.po +++ b/taiga/locale/es/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 21:24+0000\n" "Last-Translator: Jesus Marin \n" "Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -196,16 +196,16 @@ msgid "" "corrupted image." msgstr "Adjunta una imagen válida. El fichero no es una imagen o está dañada." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "La página no es 'last' o no es un número." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Página no válida (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Definición de permiso inválida." @@ -347,12 +347,12 @@ msgstr "Error de integridad por argumentos incorrectos o inválidos" msgid "Precondition error" msgstr "Error por incumplimiento de precondición" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Error en los típos de parámetros de filtrado" -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' debe ser un valor entero." @@ -576,7 +576,7 @@ msgid "It contain invalid custom fields." msgstr "Contiene attributos personalizados inválidos." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -832,12 +832,12 @@ msgstr "Se requiere autenticación" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "nombre" @@ -853,8 +853,8 @@ msgstr "web" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "descripción" @@ -875,11 +875,11 @@ msgstr "usuario" msgid "application" msgstr "aplicación" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "nombre completo" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "dirección de email" @@ -890,9 +890,9 @@ msgstr "comentario" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -962,7 +962,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "El payload no es un json válido" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "El proyecto no existe" @@ -1310,11 +1310,11 @@ msgstr "Nombre de plantilla invalido" msgid "Not valid template description" msgstr "Descripción de plantilla invalida" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Al menos uno de los usuario debe ser un administrador." -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "No tienes suficientes permisos para ver esto." @@ -1327,24 +1327,24 @@ msgid "Project ID not matches between object and project" msgstr "El ID de proyecto no coincide entre el adjunto y un proyecto" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "Dueño" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "Proyecto" @@ -1358,9 +1358,9 @@ msgstr "id de objeto" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "fecha modificada" @@ -1379,11 +1379,11 @@ msgstr "está desactualizado" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "orden" @@ -1425,7 +1425,7 @@ msgid "values" msgstr "valores" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "historia de usuario" @@ -1461,102 +1461,102 @@ msgstr "Crear" msgid "Delete" msgstr "Borrar" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "pntos del rol %(role)s" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "de" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "a" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Nuevo adjunto añadido" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Adjunto actualizado" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "obsoleto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "no obsoleto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Adjunto borrado" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "añadido" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "borrado" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "No asignado" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-borrado-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "a:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "de:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Añadido" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Cambiado" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Borrado" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "añadido:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "borrado:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "De:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "A:" @@ -1574,33 +1574,33 @@ msgstr "nota de bloqueo" msgid "sprint" msgstr "sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "No tienes permisos para asignar un sprint a esta petición." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "No tienes permisos para asignar un estado a esta petición." -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "No tienes permisos para establecer la gravedad de esta petición." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "No tienes permiso para establecer la prioridad de esta petición." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "No tienes permiso para establecer el tipo de esta petición." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "estado" @@ -1613,7 +1613,7 @@ msgid "priority" msgstr "prioridad" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "sprint" @@ -1622,17 +1622,17 @@ msgid "finished date" msgstr "fecha de finalización" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "asunto" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "asignado a" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "referencia externa" @@ -1649,31 +1649,31 @@ msgstr "Likes" msgid "Like" msgstr "Like" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "fecha estimada de comienzo" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "fecha estimada de finalización" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "está cerrada" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibilidad" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "" "La fecha de inicio estimada debe ser previa a la fecha de finalización " @@ -1704,7 +1704,7 @@ msgstr "email" msgid "create at" msgstr "creado el" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1760,27 +1760,27 @@ msgstr "total de sprints" msgid "total story points" msgstr "puntos de historia totales" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "panel de backlog activado" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "panel de kanban activado" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "panel de wiki activo" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "panel de peticiones activo" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "sistema de videoconferencia" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "datos extra de videoconferencia" @@ -1804,67 +1804,67 @@ msgstr "privado" msgid "tags colors" msgstr "colores de etiquetas" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "configuración de modulos" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "archivado" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "color" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "limite del trabajo en progreso" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "valor" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "rol por defecto para el propietario" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "opciones por defecto" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "estatuas de historias" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "puntos" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "estatus de tareas" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "estados de petición" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "tipos de petición" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "prioridades" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "gravedades" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "roles" @@ -2687,23 +2687,23 @@ msgstr "Gravedades" msgid "Roles" msgstr "Roles" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Sprint futuro" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Final de proyecto" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "No tienes permisos para asignar este sprint a esta tarea." -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "No tienes permisos para asignar esta historia a esta tarea." -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "No tienes permisos para asignar este estado a esta tarea." @@ -3115,47 +3115,47 @@ msgstr "Product Owner" msgid "Stakeholder" msgstr "Stakeholder" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" "No tienes permisos para asignar este sprint a esta historia de usuario." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" "No tienes permisos para asignar este estado a esta historia de usuario." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "Generada la historia de usuario #{ref} - {subject}" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rol" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "orden en el backlog" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "orden en el sprint" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "fecha de finalización" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "requerido por el cliente" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "requerido por el equipo" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "generada desde una petición" @@ -3224,57 +3224,57 @@ msgstr "Email duplicado" msgid "Not valid email" msgstr "Email no válido" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Nombre de usuario o email no válidos" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "¡Correo enviado con éxito!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "token inválido" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "La contraseña actual es obligatoria." -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "La nueva contraseña es obligatoria" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "La longitud de la contraseña debe de ser de al menos 6 caracteres" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Contraseña actual inválida" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Argumentos incompletos" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Formato de imagen no válido" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Invalido, ¿estás seguro de que el token es correcto y no se ha usado antes?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Inválido, ¿estás seguro de que el token es correcto?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "es superusuario" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -3282,24 +3282,24 @@ msgstr "" "Otorga todos los permisos a este usuario sin necesidad de hacerlo " "explicitamente." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "nombre de usuario" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Obligatorio. 30 caracteres o menos. Letras, números y /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Introduce un nombre de usuario válido" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "activo" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3307,43 +3307,43 @@ msgstr "" "Denota a los usuarios activos. Desmárcalo para dar de baja/borrar a un " "usuario." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografía" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "foto" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "fecha de registro" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "idioma por defecto" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "tema por defecto" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "zona horaria por defecto" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "añade color a las etiquetas" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "token de email" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nueva dirección de email" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "permisos" @@ -3355,7 +3355,7 @@ msgstr "no válido" msgid "Invalid username. Try with a different one." msgstr "Nombre de usuario inválido. Prueba con otro." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Nombre de usuario o contraseña inválidos." diff --git a/taiga/locale/fi/LC_MESSAGES/django.po b/taiga/locale/fi/LC_MESSAGES/django.po index 28672246..ebc557e3 100644 --- a/taiga/locale/fi/LC_MESSAGES/django.po +++ b/taiga/locale/fi/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Finnish (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -184,16 +184,16 @@ msgstr "" "Anna kelvollinen kuva. Annettu ei ollut tunnistettava kuva tai se oli " "vioittunut." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Sivu ei ole 'viimeinen', ekä sitä pystytä muuntamaan numeroksi." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Virheellinen sivu (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Virheellinen oikeuksien määrittely." @@ -332,12 +332,12 @@ msgstr "Integrity Error for wrong or invalid arguments" msgid "Precondition error" msgstr "Precondition error" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Error in filter params types." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' must be an integer value." @@ -562,7 +562,7 @@ msgid "It contain invalid custom fields." msgstr "Sisältää vieheellisiä omia kenttiä." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -815,12 +815,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "nimi" @@ -836,8 +836,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "kuvaus" @@ -858,11 +858,11 @@ msgstr "" msgid "application" msgstr "" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "koko nimi" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "sähköpostiosoite" @@ -873,9 +873,9 @@ msgstr "kommentti" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -947,7 +947,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "The payload is not a valid json" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Projektia ei löydy" @@ -1272,11 +1272,11 @@ msgstr "Virheellinen mallipohjan nimi" msgid "Not valid template description" msgstr "Virheellinen mallipohjan kuvaus" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Vähintään yhden käyttäjän pitää olla aktiivinen ylläpitäjä" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Sinulla ei ole oikeuksia nähdä tätä." @@ -1289,24 +1289,24 @@ msgid "Project ID not matches between object and project" msgstr "Projekti ID ei vastaa kohdetta ja projektia" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "omistaja" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "projekti" @@ -1320,9 +1320,9 @@ msgstr "objekti ID" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "muokkauspvm" @@ -1341,11 +1341,11 @@ msgstr "on poistettu" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "order" @@ -1387,7 +1387,7 @@ msgid "values" msgstr "arvot" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "käyttäjätarina" @@ -1423,102 +1423,102 @@ msgstr "Luo" msgid "Delete" msgstr "Poista" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s roolipistettä" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "keneltä" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "kenelle" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Liitä tiedosto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Päivitä tiedosto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "poistettu" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "ei poistettu" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Poista liite" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "lisätty" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "poistettu" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Tekijä puuttuu" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-poistettu-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "kenelle:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "keneltä:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Lisätty" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Muutettu" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Poistettu" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "lisätty:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "poistettu:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "Keneltä:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "Kenelle:" @@ -1536,33 +1536,33 @@ msgstr "suljettu muistiinpano" msgid "sprint" msgstr "" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "Sinulla ei ole oikeuksia laittaa kierrosta tälle pyynnölle." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "Sinulla ei ole oikeutta asettaa statusta tälle pyyntö." -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "Sinulla ei ole oikeutta asettaa vakavuutta tälle pyynnölle." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "Sinulla ei ole oikeutta asettaa kiireellisyyttä tälle pyynnölle." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Sinulla ei ole oikeutta asettaa tyyppiä tälle pyyntö." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "viittaus" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "tila" @@ -1575,7 +1575,7 @@ msgid "priority" msgstr "kiireellisyys" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "virstapylväs" @@ -1584,17 +1584,17 @@ msgid "finished date" msgstr "loppupvm" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "aihe" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "tekijä" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "ulkoinen viittaus" @@ -1611,31 +1611,31 @@ msgstr "" msgid "Like" msgstr "" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "hukka-aika" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "arvioitu alkupvm" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "arvioitu loppupvm" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "on suljettu" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibility" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "Alkuajan pitää olla ennen loppuaikaa." @@ -1664,7 +1664,7 @@ msgstr "sähköposti" msgid "create at" msgstr "luo täällä" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "tunniste" @@ -1720,27 +1720,27 @@ msgstr "virstapyväitä yhteensä" msgid "total story points" msgstr "käyttäjätarinan yhteispisteet" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "aktiivinen odottavien paneeli" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "aktiivinen kanban-paneeli" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "aktiivinen wiki-paneeli" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "aktiivinen pyyntöpaneeli" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "videokokous järjestelmä" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "" @@ -1764,67 +1764,67 @@ msgstr "on yksityinen" msgid "tags colors" msgstr "avainsanojen värit" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "moduulien asetukset" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "on arkistoitu" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "väri" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "työn alla olevien max" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "arvo" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "oletus omistajan rooli" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "oletus optiot" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "kt tilat" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "pisteet" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "tehtävän tilat" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "pyyntöjen tilat" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "pyyntötyypit" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "kiireellisyydet" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "vakavuudet" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "roolit" @@ -2655,23 +2655,23 @@ msgstr "Vakavuudet" msgid "Roles" msgstr "Roolit" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Tuleva kierros" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Projektin loppu" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" @@ -3080,45 +3080,45 @@ msgstr "Tuoteomistaja" msgid "Stakeholder" msgstr "Sidosryhmä" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rooli" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "odottavien listan järjestys" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "kierros järjestys" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "loppupvm" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "on asiakkaan vaatimus" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "on tiimin vaatimus" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "luotu pyynnöstä" @@ -3187,127 +3187,127 @@ msgstr "Sähköposti on jo olemassa" msgid "Not valid email" msgstr "Virheellinen sähköposti" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Tuntematon käyttäjänimi tai sähköposti" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Sähköposti lähetetty." -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Tunniste on virheellinen" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Nykyinen salasanaparametri tarvitaan" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Uusi salasanaparametri tarvitaan" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Salasanan pitää olla vähintään 6 merkkiä pitkä" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Virheellinen nykyinen salasana" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Puutteelliset argumentit" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Väärä kuvaformaatti" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Virheellinen. Oletko varma, että tunniste on oikea ja et ole jo käyttänyt " "sitä?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Virheellinen, oletko varma että tunniste on oikea?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "pääkäyttäjän status" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "" "Kertoo että käyttäjä saa tehdä kaiken ilman erikseen annettuja oiekuksia." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "käyttäjänimi" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "" "Vaaditaan. Korkeintaan 30merkkiä. Kirjaimet, numerot ja merkit /./-/_ " "sallittuja" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Anna olemassa oleva käyttäjänimi." -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "aktiivinen" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "" "Käyttäjä on aktiivinen. Poista aktiivisuus käyttäjän poistamisen sijaan." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografia" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "kuva" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "liittymispvm" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "oletuskieli" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "oletus aikavyöhyke" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "väritä avainsanat" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "sähköpostitunniste" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "uusi sähköpostiosoite" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "oikeudet" @@ -3319,7 +3319,7 @@ msgstr "virheellinen" msgid "Invalid username. Try with a different one." msgstr "Tuntematon käyttäjänimi, yritä uudelleen." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Käyttäjätunnus tai salasana eivät ole oikein." diff --git a/taiga/locale/fr/LC_MESSAGES/django.po b/taiga/locale/fr/LC_MESSAGES/django.po index fabaa4d3..43a5dc7f 100644 --- a/taiga/locale/fr/LC_MESSAGES/django.po +++ b/taiga/locale/fr/LC_MESSAGES/django.po @@ -11,15 +11,16 @@ # Matthieu Durocher , 2015 # naekos , 2015 # Nlko , 2015 +# Regis TEDONE , 2015 # Stéphane Mor , 2015 # William Godin , 2015 msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" -"PO-Revision-Date: 2015-11-02 16:16+0000\n" -"Last-Translator: Taiga Dev Team \n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" +"PO-Revision-Date: 2015-11-17 20:48+0000\n" +"Last-Translator: Regis TEDONE \n" "Language-Team: French (http://www.transifex.com/taiga-agile-llc/taiga-back/" "language/fr/)\n" "MIME-Version: 1.0\n" @@ -203,18 +204,18 @@ msgstr "" "Envoyez une image valide. Le fichier que vous avez envoyé n'était pas une " "image ou était une image corrompue." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "" "La page n'est pas la \"dernière\", et ne peut pas non plus être convertie en " "entier." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Page invalide (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Définition de permission invalide." @@ -355,12 +356,12 @@ msgstr "Erreur d'intégrité ou arguments invalides" msgid "Precondition error" msgstr "Erreur de précondition" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Erreur dans les types de paramètres de filtres" -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' doit être une valeur entière." @@ -592,7 +593,7 @@ msgid "It contain invalid custom fields." msgstr "Contient des champs personnalisés non valides." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -804,12 +805,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "nom" @@ -825,8 +826,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "description" @@ -845,13 +846,13 @@ msgstr "utilisateur" #: taiga/external_apps/models.py:59 msgid "application" -msgstr "" +msgstr "application" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "Nom complet" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "Adresse email" @@ -862,9 +863,9 @@ msgstr "Commentaire" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -934,7 +935,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "Le payload n'est pas un json valide" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Le projet n'existe pas" @@ -1244,11 +1245,11 @@ msgstr "Nom de modèle non valide" msgid "Not valid template description" msgstr "Description du modèle non valide" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Au moins un utilisateur doit être un administrateur actif" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Vous n'avez pas les permissions pour consulter cet élément" @@ -1261,24 +1262,24 @@ msgid "Project ID not matches between object and project" msgstr "L'identifiant du projet de correspond pas entre l'objet et le projet" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "propriétaire" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "projet" @@ -1292,9 +1293,9 @@ msgstr "identifiant de l'objet" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "état modifié" @@ -1313,11 +1314,11 @@ msgstr "est obsolète" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "ordre" @@ -1359,7 +1360,7 @@ msgid "values" msgstr "valeurs" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "histoire utilisateur" @@ -1395,102 +1396,102 @@ msgstr "Créer" msgid "Delete" msgstr "Supprimer" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s points de rôle" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "de" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "à" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Ajouter une pièce jointe" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Pièces jointes mises à jour" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "obsolète" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "non obsolète" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Pièce jointe supprimée" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "ajouté" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "supprimé" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Non assigné" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-supprimé-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "à :" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "de :" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Ajouté" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Modifié" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Supprimé" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "ajouté :" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "supprimé :" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "De :" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "A :" @@ -1508,33 +1509,33 @@ msgstr "note bloquée" msgid "sprint" msgstr "sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "Vous n'avez pas la permission d'affecter ce sprint à ce problème." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "Vous n'avez pas la permission d'affecter ce statut à ce problème." -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "Vous n'avez pas la permission d'affecter cette sévérité à ce problème." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "Vous n'avez pas la permission d'affecter cette priorité à ce problème." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Vous n'avez pas la permission d'affecter ce type à ce problème." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "réf" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "état" @@ -1547,7 +1548,7 @@ msgid "priority" msgstr "priorité" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "jalon" @@ -1556,17 +1557,17 @@ msgid "finished date" msgstr "date de fin" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "sujet" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "assigné à" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "référence externe" @@ -1583,31 +1584,31 @@ msgstr "Aime" msgid "Like" msgstr "Aimer" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "date de démarrage estimée" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "date de fin estimée" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "est fermé" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibilité" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "La date de démarrage doit être antérieure à la de fin prévisionnelle" @@ -1636,7 +1637,7 @@ msgstr "email" msgid "create at" msgstr "Créé le" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "jeton" @@ -1692,27 +1693,27 @@ msgstr "total des jalons" msgid "total story points" msgstr "total des points d'histoire" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "panneau backlog actif" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "panneau kanban actif" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "panneau wiki actif" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "panneau problèmes actif" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "plateforme de vidéoconférence" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "" @@ -1736,67 +1737,67 @@ msgstr "est privé" msgid "tags colors" msgstr "couleurs des tags" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "Configurations des modules" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "est archivé" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "couleur" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "limite de travail en cours" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "valeur" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "rôle par défaut du propriétaire" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "options par défaut" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "statuts des us" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "points" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "états des tâches" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "statuts des problèmes" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "types de problèmes" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "priorités" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "sévérités" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "rôles" @@ -2400,23 +2401,23 @@ msgstr "Sévérités" msgid "Roles" msgstr "Rôles" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Sprint futurs" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Fin du projet" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" @@ -2813,45 +2814,45 @@ msgstr "Product Owner" msgid "Stakeholder" msgstr "Participant" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rôle" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "order du backlog" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "ordre du sprint" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "date de fin" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "est un requis client" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "est un requis de l'équipe" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "généré depuis un problème" @@ -2920,58 +2921,58 @@ msgstr "Email dupliquée" msgid "Not valid email" msgstr "Email non valide" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Nom d'utilisateur ou email non valide" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Mail envoyé avec succès!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Jeton invalide" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Paramètre 'mot de passe actuel' requis" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Paramètre 'nouveau mot de passe' requis" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Le mot de passe doit être d'au moins 6 caractères" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Mot de passe actuel incorrect" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "arguments manquants" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "format de l'image non valide" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Invalide, êtes-vous sûre que le jeton est correct et qu'il n'a pas déjà été " "utilisé ?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Invalide, êtes-vous sûre que le jeton est correct ?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "statut superutilisateur" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -2979,25 +2980,25 @@ msgstr "" "Indique que l'utilisateur a toutes les permissions sans avoir à lui les " "donner explicitement" -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "nom d'utilisateur" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "" "Obligatoire. 30 caractères maximum. Lettres, nombres et les caractères /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Entrez un nom d'utilisateur valide" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "actif" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3005,43 +3006,43 @@ msgstr "" "Indique qu'un utilisateur est considéré ou non comme actif. Désélectionnez " "cette option au lieu de supprimer le compte utilisateur." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biographie" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "photo" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "date d'inscription" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "langage par défaut" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "thème par défaut" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "Fuseau horaire par défaut" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "changer la couleur des tags" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "jeton email" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nouvelle adresse email" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "permissions" @@ -3053,7 +3054,7 @@ msgstr "invalide" msgid "Invalid username. Try with a different one." msgstr "Nom d'utilisateur invalide. Essayez avec un autre nom." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Aucun utilisateur avec ce nom ou ce mot de passe." diff --git a/taiga/locale/it/LC_MESSAGES/django.po b/taiga/locale/it/LC_MESSAGES/django.po index c6df2414..be121f5c 100644 --- a/taiga/locale/it/LC_MESSAGES/django.po +++ b/taiga/locale/it/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-10 14:10+0000\n" "Last-Translator: Andrea Raimondi \n" "Language-Team: Italian (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -192,16 +192,16 @@ msgstr "" "Carica un'immagina valida. Il file caricato potrebbe non essere un'immagine " "o l'immagine potrebbe essere corrotta. " -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "La pagina non è 'last', né può essere convertita come int." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Pagina (%(page_number)s) invalida: %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Definizione di permesso non valida." @@ -343,12 +343,12 @@ msgstr "Errore di integrità causato da un argomento invalido o sbagliato" msgid "Precondition error" msgstr "Errore di precondizione" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Errore nel filtro del tipo di parametri." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'Progetto' deve essere un valore intero." @@ -586,7 +586,7 @@ msgid "It contain invalid custom fields." msgstr "Contiene campi personalizzati invalidi." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -901,12 +901,12 @@ msgstr "E' richiesta l'autenticazione" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "nome" @@ -922,8 +922,8 @@ msgstr "web" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "descrizione" @@ -944,11 +944,11 @@ msgstr "utente" msgid "application" msgstr "applicazione" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "Nome completo" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "Inserisci un indirizzo e-mail valido." @@ -959,9 +959,9 @@ msgstr "Commento" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -1037,7 +1037,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "Il carico non è un json valido" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Il progetto non esiste" @@ -1405,11 +1405,11 @@ msgstr "Il nome del template non è valido" msgid "Not valid template description" msgstr "La descrizione del template non è valida" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Almeno uno degli utenti deve essere attivo come amministratore" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Non hai il permesso di vedere questo elemento." @@ -1422,24 +1422,24 @@ msgid "Project ID not matches between object and project" msgstr "L'ID di progetto non corrisponde tra oggetto e progetto" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "proprietario" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "progetto" @@ -1453,9 +1453,9 @@ msgstr "ID dell'oggetto" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "data modificata" @@ -1474,11 +1474,11 @@ msgstr "non approvato" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "ordine" @@ -1520,7 +1520,7 @@ msgid "values" msgstr "valori" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "storia utente" @@ -1556,102 +1556,102 @@ msgstr "Creato" msgid "Delete" msgstr "Eliminato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s punti del ruolo" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "da" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "a" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Aggiunto un nuovo allegato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Allegato aggiornato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "non approvato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "accettato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Allegato eliminato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "aggiunto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "rimosso" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Non assegnato" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-eliminato-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "a:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "da:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Aggiunto" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Modificato" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Eliminato" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "aggiunto:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "rimosso:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "Da:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "A:" @@ -1669,33 +1669,33 @@ msgstr "nota bloccata" msgid "sprint" msgstr "sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "Non hai i permessi per aggiungere questo sprint a questo problema" -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "Non hai i permessi per aggiungere questo stato a questo problema" -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "Non hai i permessi per aggiungere questa criticità a questo problema" -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "Non hai i permessi per aggiungere questa priorità a questo problema." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Non hai i permessi per aggiungere questa tipologia a questo problema" #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "referenza" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "stato" @@ -1708,7 +1708,7 @@ msgid "priority" msgstr "priorità" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "tappa" @@ -1717,17 +1717,17 @@ msgid "finished date" msgstr "data di conclusione" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "soggeto" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "assegnato a" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "referenza esterna" @@ -1744,31 +1744,31 @@ msgstr "Piaciuto" msgid "Like" msgstr "Like" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "lumaca" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "data stimata di inizio" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "data stimata di fine" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "è concluso" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibilità" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "" "La data stimata di inizio deve essere precedente alla data stimata di fine." @@ -1798,7 +1798,7 @@ msgstr "email" msgid "create at" msgstr "creato a " -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1854,27 +1854,27 @@ msgstr "tappe totali" msgid "total story points" msgstr "punti totali della storia" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "pannello di backlog attivo" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "pannello kanban attivo" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "pannello wiki attivo" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "pannello dei problemi attivo" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "sistema di videoconferenza" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "ulteriori dati di videoconferenza " @@ -1898,67 +1898,67 @@ msgstr "è privato" msgid "tags colors" msgstr "colori dei tag" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "configurazione dei moduli" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "è archivitato" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "colore" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "limite dei lavori in corso" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "valore" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "ruolo proprietario predefinito" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "opzioni predefinite " -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "stati della storia utente" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "punti" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "stati del compito" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "stati del probema" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "tipologie del problema" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "priorità" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "criticità " -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "ruoli" @@ -2929,24 +2929,24 @@ msgstr "Criticità" msgid "Roles" msgstr "Ruoli" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Sprint futuri" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Termine di progetto" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "Non hai i permessi per aggiungere questo sprint a questo compito." -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" "Non hai i permessi per aggiungere questa storia utente a questo compito." -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "Non hai i permessi per aggiungere questo stato a questo compito." @@ -3376,46 +3376,46 @@ msgstr "Product Owner" msgid "Stakeholder" msgstr "Stakeholder" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" "Non hai i permessi per aggiungere questo sprint a questa storia utente." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "Non hai i permessi per aggiungere questo stato a questa storia utente." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "Stiamo generando la storia utente #{ref} - {subject}" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "ruolo" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "ordine del backlog" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "ordine dello sprint" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "data di termine" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "é un requisito del cliente " -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "é una richiesta del team" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "generato da un problema" @@ -3484,58 +3484,58 @@ msgstr "E-mail duplicata" msgid "Not valid email" msgstr "E-mail non valida" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Username o e-mail non validi" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Mail inviata con successo!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Token non valido" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "E' necessario il parametro della password corrente" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "E' necessario il parametro della nuovo password" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Lunghezza della password non valida, sono necessari almeno 6 caratteri" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Password corrente non valida" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Argomento non valido" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Formato dell'immagine non valido" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Non valido. Sei sicuro che il token sia corretto e che tu non l'abbia già " "usato in precedenza?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Non valido. Sicuro che il token sia corretto?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "Stato del super-utente" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -3543,26 +3543,26 @@ msgstr "" "Definisce che questo utente ha tutti i permessi senza assegnarglieli " "esplicitamente." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "nome utente" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "" "Richiede 30 caratteri o meno. Deve comprendere: lettere, numeri e caratteri " "come /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Inserisci un nome utente valido." -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "attivo" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3570,43 +3570,43 @@ msgstr "" "Definisce se questo utente debba essere trattato come attivo. Deseleziona " "questo invece di eliminare gli account." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografia" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "fotografia" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "data di inizio partecipazione" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "lingua predefinita" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "tema predefinito" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "timezone predefinita" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "colora i tag" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "token e-mail" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nuovo indirizzo e-mail" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "permessi" @@ -3618,7 +3618,7 @@ msgstr "non valido" msgid "Invalid username. Try with a different one." msgstr "Nome utente non valido. Provane uno diverso." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Il nome utente o la password non corrispondono all'utente." diff --git a/taiga/locale/nl/LC_MESSAGES/django.po b/taiga/locale/nl/LC_MESSAGES/django.po index 9b922f7a..a9f6772b 100644 --- a/taiga/locale/nl/LC_MESSAGES/django.po +++ b/taiga/locale/nl/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 13:41+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -193,16 +193,16 @@ msgstr "" "Upload een geldige afbeelding. Het bestand dat je hebt geuploadet was ofwel " "een afbeelding ofwel een corrupte afbeelding." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Pagina is niet 'last', noch kan het omgezet worden naar een int." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Ongeldige pagina (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Ongeldige definitie van permissie." @@ -342,12 +342,12 @@ msgstr "Integriteitsfout voor verkeerde of ongeldige argumenten" msgid "Precondition error" msgstr "Preconditie fout" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Fout in filter params types." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' moet een integer waarde zijn." @@ -575,7 +575,7 @@ msgid "It contain invalid custom fields." msgstr "Het bevat ongeldige eigen velden:" #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -765,12 +765,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "naam" @@ -786,8 +786,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "omschrijving" @@ -808,11 +808,11 @@ msgstr "" msgid "application" msgstr "" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "volledige naam" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "e-mail adres" @@ -823,9 +823,9 @@ msgstr "commentaar" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -896,7 +896,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "De payload is geen geldige json" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Het project bestaat niet" @@ -1206,11 +1206,11 @@ msgstr "Ongeldige template naam" msgid "Not valid template description" msgstr "Ongeldige template omschrijving" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 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:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Je hebt geen toestamming om dat te bekijken." @@ -1223,24 +1223,24 @@ 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:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "eigenaar" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "project" @@ -1254,9 +1254,9 @@ msgstr "object id" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "gemodifieerde datum" @@ -1275,11 +1275,11 @@ msgstr "is verouderd" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "volgorde" @@ -1321,7 +1321,7 @@ msgid "values" msgstr "waarden" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "user story" @@ -1357,102 +1357,102 @@ msgstr "Creëer" msgid "Delete" msgstr "Verwijder" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "naar" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Nieuwe bijlage toegevoegd" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Bijlage bijgewerkt" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "verouderd" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "niet verouderd" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Bijlage verwijderd" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "toegevoegd" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-verwijderd-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "naar:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "van:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Toegevoegd" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Veranderd" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Verwijderd" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "toegevoegd:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "Naar:" @@ -1470,35 +1470,35 @@ msgstr "geblokkeerde notitie" msgid "sprint" msgstr "" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 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:164 +#: taiga/projects/issues/api.py:166 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:168 +#: taiga/projects/issues/api.py:170 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:172 +#: taiga/projects/issues/api.py:174 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:176 +#: taiga/projects/issues/api.py:178 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 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "status" @@ -1511,7 +1511,7 @@ msgid "priority" msgstr "prioriteit" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "milestone" @@ -1520,17 +1520,17 @@ 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 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "onderwerp" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "toegewezen aan" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "externe referentie" @@ -1547,31 +1547,31 @@ msgstr "Personen die dit leuk vinden" msgid "Like" msgstr "Vind ik leuk" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "geschatte start datum" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "geschatte datum van afwerking" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "is gesloten" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "beschikbaarheid" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "The geschatte start moet vroeger zijn dan het geschatte einde." @@ -1600,7 +1600,7 @@ msgstr "e-mail" msgid "create at" msgstr "aangemaakt op" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1656,27 +1656,27 @@ msgstr "totaal van de milestones" msgid "total story points" msgstr "totaal story points" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "actief backlog paneel" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "actief kanban paneel" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "actief wiki paneel" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "actief issues paneel" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "videoconference systeem" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "" @@ -1700,67 +1700,67 @@ msgstr "is privé" msgid "tags colors" msgstr "tag kleuren" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "module config" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "is gearchiveerd" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "kleur" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "work in progress limiet" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "waarde" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "standaard rol eigenaar" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "standaard instellingen" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "us statussen" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "punten" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "taak statussen" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "issue statussen" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "issue types" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "prioriteiten" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "ernstniveaus" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "rollen" @@ -2375,23 +2375,23 @@ msgstr "Ernstniveaus" msgid "Roles" msgstr "Rollen" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Toekomstige sprint" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Project einde" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "" @@ -2775,45 +2775,45 @@ msgstr "Product Owner" msgid "Stakeholder" msgstr "Stakeholder" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rol" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "backlog volgorde" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "sprint volgorde" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "afwerkdatum" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "is requirement van de klant" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "is requirement van het team" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "gegenereerd van issue" @@ -2882,56 +2882,56 @@ msgstr "Gedupliceerde e-mail" msgid "Not valid email" msgstr "Ongeldige e-mail" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Ongeldige gebruikersnaam of e-mail" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Mail met succes verzonden!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Token is ongeldig" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Huidig wachtwoord parameter vereist" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Nieuw wachtwoord parameter vereist" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Ongeldige lengte van wachtwoord, minstens 6 tekens vereist" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Ongeldig huidig wachtwoord" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Onvolledige argumenten" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Ongeldig afbeelding formaat" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 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:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Ongeldig, weet je zeker dat het token correct is?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "superuser status" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -2939,24 +2939,24 @@ msgstr "" "Beduidt dat deze gebruik alle toestemmingen heeft zonder deze expliciet toe " "te wijzen." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "gebruikersnaam" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Vereist. 30 of minder karakters. Letters, nummers en /./-/_ karakters" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Geef een geldige gebruikersnaam in" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "actief" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -2964,43 +2964,43 @@ msgstr "" "Beduidt of deze gebruiker als actief moet behandeld worden. Deselecteer dit " "i.p.v. accounts te verwijderen." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografie" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "foto" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "toetrededatum" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "standaard taal" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "standaard tijdzone" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "kleur tags" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "e-mail token" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nieuw e-mail adres" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "toestemmingen" @@ -3012,7 +3012,7 @@ msgstr "ongeldig" msgid "Invalid username. Try with a different one." msgstr "Ongeldige gebruikersnaam. Probeer met een andere." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Gebruikersnaam of wachtwoord stemt niet overeen met gebruiker." diff --git a/taiga/locale/pl/LC_MESSAGES/django.po b/taiga/locale/pl/LC_MESSAGES/django.po index d81c422a..52b696ff 100644 --- a/taiga/locale/pl/LC_MESSAGES/django.po +++ b/taiga/locale/pl/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Polish (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -187,16 +187,16 @@ msgstr "" "Prześlij właściwy obraz. Plik który próbujesz przesłać nie jest obrazem lub " "jest uszkodzony." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Strona nie jest ostatnią i nie może zostać zmieniona na int." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Niewłaściwa strona (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Nieprawidłowa definicja uprawnień." @@ -337,12 +337,12 @@ msgstr "Błąd integralności dla błędnych lub nieprawidłowych argumentów" msgid "Precondition error" msgstr "Błąd warunków wstępnych" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Błąd w parametrach typów filtrów." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' musi być wartością typu int." @@ -576,7 +576,7 @@ msgid "It contain invalid custom fields." msgstr "Zawiera niewłaściwe pola niestandardowe." #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -833,12 +833,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "nazwa" @@ -854,8 +854,8 @@ msgstr "web" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "opis" @@ -876,11 +876,11 @@ msgstr "użytkownik" msgid "application" msgstr "aplikacja" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "Imię i Nazwisko" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "adres e-mail" @@ -891,9 +891,9 @@ msgstr "komentarz" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -964,7 +964,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "Źródło nie jest prawidłowym plikiem json" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Projekt nie istnieje" @@ -1314,11 +1314,11 @@ msgstr "Nieprawidłowa nazwa szablonu" msgid "Not valid template description" msgstr "Nieprawidłowy opis szablonu" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Przynajmniej jeden użytkownik musi być aktywnym Administratorem" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Nie masz uprawnień by to zobaczyć." @@ -1331,24 +1331,24 @@ msgid "Project ID not matches between object and project" msgstr "ID nie pasuje pomiędzy obiektem a projektem" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "właściciel" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "projekt" @@ -1362,9 +1362,9 @@ msgstr "id obiektu" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "data modyfikacji" @@ -1383,11 +1383,11 @@ msgstr "jest przestarzałe" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "kolejność" @@ -1429,7 +1429,7 @@ msgid "values" msgstr "wartości" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "historyjka użytkownika" @@ -1465,102 +1465,102 @@ msgstr "Utwórz" msgid "Delete" msgstr "Usuń" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s punkty roli" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "od" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "do" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Dodano nowy załącznik" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Zaktualizowany załącznik" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "przestarzałe" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "nie przestarzałe" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Usuń załącznik" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "dodane" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "usuniete" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Nieprzypisane" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-usunięte-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "do:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "od:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Dodane" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Zmienione" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Usunięte" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "dodane:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "usunięte:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "Od:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "Do:" @@ -1578,33 +1578,33 @@ msgstr "zaglokowana notatka" msgid "sprint" msgstr "sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "Nie masz uprawnień do połączenia tego zgłoszenia ze sprintem." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "Nie masz uprawnień do ustawienia statusu dla tego zgłoszenia." -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "Nie masz uprawnień do ustawienia ważności dla tego zgłoszenia." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "Nie masz uprawnień do ustawienia priorytetu dla tego zgłoszenia." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Nie masz uprawnień do ustawienia typu dla tego zgłoszenia." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "status" @@ -1617,7 +1617,7 @@ msgid "priority" msgstr "priorytet" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "kamień milowy" @@ -1626,17 +1626,17 @@ msgid "finished date" msgstr "data zakończenia" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "temat" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "przypisane do" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "źródło zgłoszenia" @@ -1653,31 +1653,31 @@ msgstr "" msgid "Like" msgstr "" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "szacowana data rozpoczecia" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "szacowana data zakończenia" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "jest zamknięte" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "dostępność" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "Szacowana data rozpoczęcia musi być wcześniejsza niż data zakończenia." @@ -1706,7 +1706,7 @@ msgstr "e-mail" msgid "create at" msgstr "utwórz na" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1762,27 +1762,27 @@ msgstr "wszystkich kamieni milowych" msgid "total story points" msgstr "wszystkich punktów " -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "aktywny panel backlog" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "aktywny panel Kanban" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "aktywny panel Wiki" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "aktywny panel zgłoszeń " -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "system wideokonferencji" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "dodatkowe dane dla wideokonferencji" @@ -1806,67 +1806,67 @@ msgstr "jest prywatna" msgid "tags colors" msgstr "kolory tagów" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "konfiguracja modułów" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "zarchiwizowane" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "kolor" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "limit postępu prac" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "wartość" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "domyśla rola właściciela" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "domyślne opcje" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "statusy HU" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "pinkty" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "statusy zadań" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "statusy zgłoszeń" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "typy zgłoszeń" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "priorytety" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "ważność" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "role" @@ -2712,24 +2712,24 @@ msgstr "Ważność" msgid "Roles" msgstr "Role" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Przyszły sprint" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Zakończenie projektu" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "Nie masz uprawnień do ustawiania sprintu dla tego zadania." -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" "Nie masz uprawnień do ustawiania historyjki użytkownika dla tego zadania" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "Nie masz uprawnień do ustawiania statusu dla tego zadania" @@ -3140,47 +3140,47 @@ msgstr "Właściciel produktu" msgid "Stakeholder" msgstr "Interesariusz" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" "Nie masz uprawnień do ustawiania sprintu dla tej historyjki użytkownika." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" "Nie masz uprawnień do ustawiania statusu do tej historyjki użytkownika." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "rola" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "Kolejność backlogu" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "kolejność sprintu" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "data zakończenia" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "wymaganie klienta" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "wymaganie zespołu" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "wygenerowane ze zgłoszenia" @@ -3249,60 +3249,60 @@ msgstr "Zduplikowany adres e-mail" msgid "Not valid email" msgstr "Niepoprawny adres e-mail" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Nieprawidłowa nazwa użytkownika lub adrs e-mail" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "E-mail wysłany poprawnie!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Nieprawidłowy token." -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Należy podać bieżące hasło" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Należy podać nowe hasło" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "" "Nieprawidłowa długość hasła - wymagane jest co najmniej 6 znaków" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Podałeś nieprawidłowe bieżące hasło" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Pola niekompletne" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Niepoprawny format obrazka" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Niepoprawne, jesteś pewien, że token jest poprawny i nie używałeś go " "wcześniej? " -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Niepoprawne, jesteś pewien, że token jest poprawny?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "status SUPERUSER" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -3310,24 +3310,24 @@ msgstr "" "Oznacza, że ten użytkownik posiada wszystkie uprawnienia bez konieczności " "ich przydzielania." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "nazwa użytkownika" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Wymagane. 30 znaków. Liter, cyfr i znaków /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Wprowadź poprawną nazwę użytkownika" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "aktywny" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3335,43 +3335,43 @@ msgstr "" "Oznacza, że ten użytkownik ma być traktowany jako aktywny. Możesz to " "odznaczyć zamiast usuwać konto." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografia" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "zdjęcie" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "data dołączenia" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "domyślny język Taiga" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "domyślny szablon Taiga" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "domyśla strefa czasowa" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "kolory tagów" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "tokem e-mail" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "nowy adres e-mail" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "uprawnienia" @@ -3383,7 +3383,7 @@ msgstr "Niepoprawne" msgid "Invalid username. Try with a different one." msgstr "Niepoprawna nazwa użytkownika. Spróbuj podać inną." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Nazwa użytkownika lub hasło są nieprawidłowe" diff --git a/taiga/locale/pt_BR/LC_MESSAGES/django.po b/taiga/locale/pt_BR/LC_MESSAGES/django.po index 7743f261..21b3b2b5 100644 --- a/taiga/locale/pt_BR/LC_MESSAGES/django.po +++ b/taiga/locale/pt_BR/LC_MESSAGES/django.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/taiga-agile-llc/" @@ -193,16 +193,16 @@ msgstr "" "Envie uma imagem válida. O arquivo que você mandou ou não era uma imagem ou " "está corrompido." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Página não é \"última\", nem pode ser convertída para um inteiro." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Página inválida (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Definição de permissão inválida." @@ -343,12 +343,12 @@ msgstr "Erro de Integridade para argumentos inválidos ou errados" msgid "Precondition error" msgstr "Erro de pré-condição" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Erro nos tipos de parâmetros do filtro." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'projeto' deve ser um valor inteiro." @@ -583,7 +583,7 @@ msgid "It contain invalid custom fields." msgstr "Contém campos personalizados inválidos" #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -839,12 +839,12 @@ msgstr "Autenticação necessária" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "Nome" @@ -860,8 +860,8 @@ msgstr "web" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "descrição" @@ -882,11 +882,11 @@ msgstr "usuário" msgid "application" msgstr "aplicação" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "nome completo" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "endereço de e-mail" @@ -897,9 +897,9 @@ msgstr "comentário" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -970,7 +970,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "A carga não é um json válido" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "O projeto não existe" @@ -1319,11 +1319,11 @@ msgstr "Nome de template inválido" msgid "Not valid template description" msgstr "Descrição de template inválida" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "Pelo menos one dos usuários deve ser um administrador ativo" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "Você não tem permissão para ver isso" @@ -1336,24 +1336,24 @@ msgid "Project ID not matches between object and project" msgstr "ID do projeto não combina entre objeto e projeto" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "dono" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "projeto" @@ -1367,9 +1367,9 @@ msgstr "identidade de objeto" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "data modificação" @@ -1388,11 +1388,11 @@ msgstr "está obsoleto" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "ordem" @@ -1434,7 +1434,7 @@ msgid "values" msgstr "valores" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "user story" @@ -1470,102 +1470,102 @@ msgstr "Criar" msgid "Delete" msgstr "Apagar" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s pontos de função" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "de" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "para" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Adicionar novos anexos" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Atualizar anexo" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "obsoleto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "não-obsoleto" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Anexo apagado" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "adicionado" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "removido" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Não-atribuído" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-apagado-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "para:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "de:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Adicionado" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Alterado" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Apagado" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "acrescentado:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "removido:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "De:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "Para:" @@ -1583,33 +1583,33 @@ msgstr "nota bloqueada" msgid "sprint" msgstr "sprint" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "Você não tem permissão para colocar esse sprint para esse caso." -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "Você não tem permissão para colocar esse status para esse caso." -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "Você não tem permissão para colocar essa severidade para esse caso." -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "Você não tem permissão para colocar essa prioridade para esse caso." -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "Você não tem permissão para colocar esse tipo para esse caso." #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "status" @@ -1622,7 +1622,7 @@ msgid "priority" msgstr "prioridade" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "marco de progresso" @@ -1631,17 +1631,17 @@ msgid "finished date" msgstr "data de término" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "assunto" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "assinado a" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "referência externa" @@ -1658,31 +1658,31 @@ msgstr "Curtidas" msgid "Like" msgstr "Curtir" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "slug" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "data de início estimada" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "data de encerramento estimada" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "está fechado" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibilidade" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "A estimativa de inicio deve ser anterior a estimativa de encerramento" @@ -1711,7 +1711,7 @@ msgstr "email" msgid "create at" msgstr "criado em" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "token" @@ -1767,27 +1767,27 @@ msgstr "total de marcos de progresso" msgid "total story points" msgstr "pontos totais de US" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "painel de backlog ativo" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "painel de kanban ativo" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "painel de wiki ativo" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "painel de casos ativo" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "sistema de vídeo conferência" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "informação extra de vídeo conferência" @@ -1811,67 +1811,67 @@ msgstr "é privado" msgid "tags colors" msgstr "cores de tags" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "configurações de módulos" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "está arquivado" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "cor" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "trabalho no limite de progresso" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "valor" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "função padrão para dono " -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "opções padrão" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "status de US" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "pontos" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "status de tarefa" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "status de casos" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "tipos de caso" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "prioridades" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "severidades" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "funções" @@ -2695,23 +2695,23 @@ msgstr "Severidades" msgid "Roles" msgstr "Funções" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Sprint futuro" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Fim do projeto" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "Você não tem permissão para colocar esse sprint para essa tarefa." -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "Você não tem permissão para colocar essa user story para essa tarefa." -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "Você não tem permissão para colocar esse status para essa tarefa." @@ -3122,45 +3122,45 @@ msgstr "Product Owner" msgid "Stakeholder" msgstr "Stakeholder" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "Você não tem permissão para colocar esse sprint para essa user story." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "Você não tem permissão para colocar esse status para essa user story." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "função" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "ordem do backlog" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "ordem do sprint" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "data de término" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "É requerimento do cliente" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "É requerimento do time" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "Gerado do caso" @@ -3229,58 +3229,58 @@ msgstr "E-mail duplicado" msgid "Not valid email" msgstr "Não é um e-mail válido" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Usuário ou e-mail inválido" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "E-mail enviado com sucesso" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Token é inválido" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Parâmetro de senha atual necessário" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Parâmetro de nova senha necessário" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Comprimento de senha inválido, pelo menos 6 caracteres necessários" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Senha atual inválida" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Argumentos incompletos" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Formato de imagem inválida" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" "Inválido, você está certo que o token está correto e não foi usado " "anteriormente?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Inválido, tem certeza que o token está correto?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "status de superuser" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -3288,24 +3288,24 @@ msgstr "" "Designa que esse usuário tem todas as permissões sem explicitamente assiná-" "las" -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "usuário" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Requerido. 30 caracteres ou menos. Letras, números e caracteres /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Digite um usuário válido" -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "ativo" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -3313,43 +3313,43 @@ msgstr "" "Designa quando esse usuário deve ser tratado como ativo. desmarque isso em " "vez de deletar contas." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "biografia" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "foto" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "data ingressado" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "lingua padrão" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "tema padrão" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "fuso horário padrão" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "tags coloridas" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "token de e-mail" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "novo endereço de email" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "permissões" @@ -3361,7 +3361,7 @@ msgstr "inválido" msgid "Invalid username. Try with a different one." msgstr "Usuário inválido. Tente com um diferente." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Usuário ou senha não correspondem ao usuário" diff --git a/taiga/locale/ru/LC_MESSAGES/django.po b/taiga/locale/ru/LC_MESSAGES/django.po index 4c9cf68f..451c5c66 100644 --- a/taiga/locale/ru/LC_MESSAGES/django.po +++ b/taiga/locale/ru/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-07 12:59+0000\n" "Last-Translator: Dmitriy Volkov \n" "Language-Team: Russian (http://www.transifex.com/taiga-agile-llc/taiga-back/" @@ -194,16 +194,16 @@ msgstr "" "Загрузите корректное изображение. Файл, который вы загрузили - либо не " "изображение, либо не корректное изображение." -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "Страница не является 'последней' и не может быть приведена к int." -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "Неправильная страница (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "Неправильное определение разрешения" @@ -343,12 +343,12 @@ msgstr "Ошибка целостности из-за неправильных msgid "Precondition error" msgstr "Ошибка предусловия" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "Ошибка в типах фильтров для параметров." -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "'project' должно быть целым значением." @@ -583,7 +583,7 @@ msgid "It contain invalid custom fields." msgstr "Содержит неверные специальные поля" #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -837,12 +837,12 @@ msgstr "Необходима аутентификация" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "имя" @@ -858,8 +858,8 @@ msgstr "веб" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "описание" @@ -880,11 +880,11 @@ msgstr "пользователь" msgid "application" msgstr "приложение" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "полное имя" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "адрес email" @@ -895,9 +895,9 @@ msgstr "комментарий" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -968,7 +968,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "Нагрузочный файл не является правильным json-файлом" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "Проект не существует" @@ -1318,12 +1318,12 @@ msgstr "Неверное название шаблона" msgid "Not valid template description" msgstr "Неверное описание шаблона" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "" "По крайней мере один пользователь должен быть активным администратором." -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "У вас нет разрешения на просмотр." @@ -1336,24 +1336,24 @@ msgid "Project ID not matches between object and project" msgstr "Идентификатор проекта не подходит к этому объекту" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "владелец" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "проект" @@ -1367,9 +1367,9 @@ msgstr "идентификатор объекта" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "изменённая дата" @@ -1388,11 +1388,11 @@ msgstr "устаревшее" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "порядок" @@ -1434,7 +1434,7 @@ msgid "values" msgstr "значения" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "пользовательская история" @@ -1470,102 +1470,102 @@ msgstr "Создать" msgid "Delete" msgstr "Удалить" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "очки для роли %(role)s" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "от" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "кому" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "Добавлено новое вложение" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "Вложение обновлено" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "устаревшее" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "не устаревшее" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "Удалённое вложение" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "добавлено" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "удалено" -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "Не назначено" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-удалено-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "кому:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "от:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "Добавлено" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "Изменено" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "Удалено" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "добавлено:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "удалено:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "От:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "Кому:" @@ -1583,37 +1583,37 @@ msgstr "Заметка о блокировке" msgid "sprint" msgstr "спринт" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "" "У вас нет прав для того чтобы установить такой спринт для этого запроса" -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "" "У вас нет прав для того чтобы установить такой статус для этого запроса" -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "" "У вас нет прав для того чтобы установить такую важность для этого запроса" -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "" "У вас нет прав для того чтобы установить такой приоритет для этого запроса" -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "У вас нет прав для того чтобы установить такой тип для этого запроса" #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "Ссылка" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "cтатус" @@ -1626,7 +1626,7 @@ msgid "priority" msgstr "приоритет" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "веха" @@ -1635,17 +1635,17 @@ msgid "finished date" msgstr "дата завершения" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "тема" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "назначено" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "внешняя ссылка" @@ -1662,31 +1662,31 @@ msgstr "Лайки" msgid "Like" msgstr "Лайк" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "ссылочное имя" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "предполагаемая дата начала" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "предполагаемая дата завершения" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "закрыто" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "доступность" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "" "Предполагаемая дата начала должна предшествовать предполагаемой дате " @@ -1717,7 +1717,7 @@ msgstr "электронная почта" msgid "create at" msgstr "создано" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "идентификатор" @@ -1773,27 +1773,27 @@ msgstr "общее количество вех" msgid "total story points" msgstr "очки истории" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "активная панель списка задач" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "активная панель kanban" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "активная wiki-панель" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "панель активных запросов" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "система видеоконференций" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "дополнительные данные системы видеоконференций" @@ -1817,67 +1817,67 @@ msgstr "личное" msgid "tags colors" msgstr "цвета тэгов" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "конфигурация модулей" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "архивировано" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "цвет" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "ограничение на активную работу" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "значение" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "роль владельца по умолчанию" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "параметры по умолчанию" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "статусы ПИ" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "очки" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "статусы задач" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "статусы запросов" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "типы запросов" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "приоритеты" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "степени важности" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "роли" @@ -2709,24 +2709,24 @@ msgstr "Степени важности" msgid "Roles" msgstr "Роли" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "Будущий спринт" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "Окончание проекта" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "У вас нет прав, чтобы назначить этот спринт для этой задачи." -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "" "У вас нет прав, чтобы назначить эту историю от пользователя этой задаче." -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "У вас нет прав, чтобы установить этот статус для этой задачи." @@ -3140,47 +3140,47 @@ msgstr "Владелец продукта" msgid "Stakeholder" msgstr "Заинтересованная сторона" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "" "У вас нет прав чтобы установить спринт для этой пользовательской истории." -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "" "У вас нет прав чтобы установить статус для этой пользовательской истории." -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "Генерируется пользовательская история #{ref} - {subject}" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "роль" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "порядок списка задач" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "порядок спринтов" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "дата окончания" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "является требованием клиента" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "является требованием команды" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "создано из запроса" @@ -3249,121 +3249,121 @@ msgstr "Этот email уже используется" msgid "Not valid email" msgstr "Невалидный email" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "Неверное имя пользователя или e-mail" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "Письмо успешно отправлено!" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "Неверный токен" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "Поле \"текущий пароль\" является обязательным" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "Поле \"новый пароль\" является обязательным" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "Неверная длина пароля, требуется как минимум 6 символов" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "Неверно указан текущий пароль" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "Список аргументов неполон" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "Неправильный формат изображения" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "Неверно, вы уверены что токен правильный и не использовался ранее?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "Неверно, вы уверены что токен правильный?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "статус суперпользователя" -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "Выбранный пользователь имеет все разрешения, ему не чего назначит." -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "имя пользователя" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "Обязательно. 30 символов или меньше. Буквы, числа и символы /./-/_" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "Введите корректное имя пользователя." -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "активный" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "Выбранный пользователь активен. Отменить выбор для удаления аккаунта." -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "биография" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "фотография" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "когда присоединился" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "язык по умолчанию" -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "тема по умолчанию" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "временная зона по умолчанию" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "установить цвета для тэгов" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "email токен" -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "новый email адрес" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "разрешения" @@ -3375,7 +3375,7 @@ msgstr "невалидный" msgid "Invalid username. Try with a different one." msgstr "Неверное имя пользователя. Попробуйте другое." -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "Имя пользователя или пароль не соответствуют пользователю." diff --git a/taiga/locale/zh-Hant/LC_MESSAGES/django.po b/taiga/locale/zh-Hant/LC_MESSAGES/django.po index 939e0e36..e871dced 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-11-11 16:03+0100\n" +"POT-Creation-Date: 2016-01-05 11:11+0100\n" "PO-Revision-Date: 2015-11-02 08:25+0000\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Chinese Traditional (http://www.transifex.com/taiga-agile-llc/" @@ -180,16 +180,16 @@ msgid "" "corrupted image." msgstr "上傳有效圖片,你所上傳的檔案非圖檔或已損壞" -#: taiga/base/api/pagination.py:115 +#: taiga/base/api/pagination.py:212 msgid "Page is not 'last', nor can it be converted to an int." msgstr "頁數不是最後,或者它無法轉成整數 " -#: taiga/base/api/pagination.py:119 +#: taiga/base/api/pagination.py:216 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "無效頁面I (%(page_number)s): %(message)s" -#: taiga/base/api/permissions.py:61 +#: taiga/base/api/permissions.py:63 msgid "Invalid permission definition." msgstr "無效的權限定義 " @@ -328,12 +328,12 @@ msgstr "因錯誤或無效參數,一致性出錯" msgid "Precondition error" msgstr "前提出錯" -#: taiga/base/filters.py:80 +#: taiga/base/filters.py:78 msgid "Error in filter params types." msgstr "過濾參數類型出錯" -#: taiga/base/filters.py:134 taiga/base/filters.py:223 -#: taiga/base/filters.py:272 +#: taiga/base/filters.py:132 taiga/base/filters.py:221 +#: taiga/base/filters.py:270 msgid "'project' must be an integer value." msgstr "專案須為整數值" @@ -567,7 +567,7 @@ msgid "It contain invalid custom fields." msgstr "包括無效慣例欄位" #: taiga/export_import/serializers.py:527 -#: taiga/projects/milestones/serializers.py:64 taiga/projects/serializers.py:70 +#: taiga/projects/milestones/serializers.py:56 taiga/projects/serializers.py:70 #: taiga/projects/serializers.py:96 taiga/projects/serializers.py:127 #: taiga/projects/serializers.py:170 msgid "Name duplicated for the project" @@ -820,12 +820,12 @@ msgstr "" #: taiga/external_apps/models.py:33 #: taiga/projects/custom_attributes/models.py:34 -#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:134 -#: taiga/projects/models.py:394 taiga/projects/models.py:433 -#: taiga/projects/models.py:458 taiga/projects/models.py:495 -#: taiga/projects/models.py:518 taiga/projects/models.py:541 -#: taiga/projects/models.py:576 taiga/projects/models.py:599 -#: taiga/users/models.py:198 taiga/webhooks/models.py:27 +#: taiga/projects/milestones/models.py:36 taiga/projects/models.py:134 +#: taiga/projects/models.py:351 taiga/projects/models.py:390 +#: taiga/projects/models.py:415 taiga/projects/models.py:452 +#: taiga/projects/models.py:475 taiga/projects/models.py:498 +#: taiga/projects/models.py:533 taiga/projects/models.py:556 +#: taiga/users/models.py:262 taiga/webhooks/models.py:27 msgid "name" msgstr "姓名" @@ -841,8 +841,8 @@ msgstr "" #: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/history/templatetags/functions.py:23 #: taiga/projects/issues/models.py:61 taiga/projects/models.py:138 -#: taiga/projects/models.py:603 taiga/projects/tasks/models.py:60 -#: taiga/projects/userstories/models.py:90 +#: taiga/projects/models.py:560 taiga/projects/tasks/models.py:60 +#: taiga/projects/userstories/models.py:91 msgid "description" msgstr "描述" @@ -863,11 +863,11 @@ msgstr "" msgid "application" msgstr "" -#: taiga/feedback/models.py:23 taiga/users/models.py:113 +#: taiga/feedback/models.py:23 taiga/users/models.py:116 msgid "full name" msgstr "全名" -#: taiga/feedback/models.py:25 taiga/users/models.py:108 +#: taiga/feedback/models.py:25 taiga/users/models.py:111 msgid "email address" msgstr "電子郵件" @@ -878,9 +878,9 @@ msgstr "評論" #: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:61 #: taiga/projects/custom_attributes/models.py:44 #: taiga/projects/issues/models.py:53 taiga/projects/likes/models.py:52 -#: taiga/projects/milestones/models.py:45 taiga/projects/models.py:140 -#: taiga/projects/models.py:605 taiga/projects/notifications/models.py:86 -#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82 +#: taiga/projects/milestones/models.py:47 taiga/projects/models.py:140 +#: taiga/projects/models.py:562 taiga/projects/notifications/models.py:86 +#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:83 #: taiga/projects/votes/models.py:52 taiga/projects/wiki/models.py:39 #: taiga/userstorage/models.py:27 msgid "created date" @@ -948,7 +948,7 @@ msgstr "" msgid "The payload is not a valid json" msgstr "載荷為無效json" -#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:140 +#: taiga/hooks/api.py:61 taiga/projects/issues/api.py:141 #: taiga/projects/tasks/api.py:84 taiga/projects/userstories/api.py:109 msgid "The project doesn't exist" msgstr "專案不存在" @@ -1294,11 +1294,11 @@ msgstr "非有效樣板名稱 " msgid "Not valid template description" msgstr "無效樣板描述" -#: taiga/projects/api.py:481 taiga/projects/serializers.py:264 +#: taiga/projects/api.py:458 taiga/projects/serializers.py:264 msgid "At least one of the user must be an active admin" msgstr "至少需有一位使用者擔任管理員" -#: taiga/projects/api.py:511 +#: taiga/projects/api.py:488 msgid "You don't have permisions to see that." msgstr "您無觀看權限" @@ -1311,24 +1311,24 @@ msgid "Project ID not matches between object and project" msgstr "專案ID不符合物件與專案" #: taiga/projects/attachments/models.py:52 taiga/projects/issues/models.py:38 -#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:145 +#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:145 #: taiga/projects/notifications/models.py:59 taiga/projects/tasks/models.py:37 -#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:35 +#: taiga/projects/userstories/models.py:65 taiga/projects/wiki/models.py:35 #: taiga/userstorage/models.py:25 msgid "owner" msgstr "所有者" #: taiga/projects/attachments/models.py:54 #: taiga/projects/custom_attributes/models.py:41 -#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41 -#: taiga/projects/models.py:382 taiga/projects/models.py:408 -#: taiga/projects/models.py:439 taiga/projects/models.py:468 -#: taiga/projects/models.py:501 taiga/projects/models.py:524 -#: taiga/projects/models.py:551 taiga/projects/models.py:582 +#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:43 +#: taiga/projects/models.py:339 taiga/projects/models.py:365 +#: taiga/projects/models.py:396 taiga/projects/models.py:425 +#: taiga/projects/models.py:458 taiga/projects/models.py:481 +#: taiga/projects/models.py:508 taiga/projects/models.py:539 #: taiga/projects/notifications/models.py:71 #: taiga/projects/notifications/models.py:88 taiga/projects/tasks/models.py:41 -#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:29 -#: taiga/projects/wiki/models.py:67 taiga/users/models.py:211 +#: taiga/projects/userstories/models.py:63 taiga/projects/wiki/models.py:29 +#: taiga/projects/wiki/models.py:67 taiga/users/models.py:275 msgid "project" msgstr "專案" @@ -1342,9 +1342,9 @@ msgstr "物件ID" #: taiga/projects/attachments/models.py:64 #: taiga/projects/custom_attributes/models.py:46 -#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48 -#: taiga/projects/models.py:143 taiga/projects/models.py:608 -#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85 +#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:50 +#: taiga/projects/models.py:143 taiga/projects/models.py:565 +#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:86 #: taiga/projects/wiki/models.py:42 taiga/userstorage/models.py:29 msgid "modified date" msgstr "修改日期" @@ -1363,11 +1363,11 @@ msgstr "棄用" #: taiga/projects/attachments/models.py:75 #: taiga/projects/custom_attributes/models.py:39 -#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:398 -#: taiga/projects/models.py:435 taiga/projects/models.py:462 -#: taiga/projects/models.py:497 taiga/projects/models.py:520 -#: taiga/projects/models.py:545 taiga/projects/models.py:578 -#: taiga/projects/wiki/models.py:72 taiga/users/models.py:206 +#: taiga/projects/milestones/models.py:56 taiga/projects/models.py:355 +#: taiga/projects/models.py:392 taiga/projects/models.py:419 +#: taiga/projects/models.py:454 taiga/projects/models.py:477 +#: taiga/projects/models.py:502 taiga/projects/models.py:535 +#: taiga/projects/wiki/models.py:72 taiga/users/models.py:270 msgid "order" msgstr "次序" @@ -1409,7 +1409,7 @@ msgid "values" msgstr "價值" #: taiga/projects/custom_attributes/models.py:97 -#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34 +#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:35 msgid "user story" msgstr "使用者故事" @@ -1445,102 +1445,102 @@ msgstr "創建" msgid "Delete" msgstr "刪除 " -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:23 #, python-format msgid "%(role)s role points" msgstr "%(role)s 角色點數" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:131 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:157 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:194 msgid "from" msgstr "來自" -#: 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 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:32 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:142 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:163 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:180 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:200 msgid "to" msgstr "給" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:44 msgid "Added new attachment" msgstr "新增附件" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:62 msgid "Updated attachment" msgstr "更新附件" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:68 msgid "deprecated" msgstr "棄用" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:70 msgid "not deprecated" msgstr "不棄用" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:86 msgid "Deleted attachment" msgstr "刪除附件" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:105 msgid "added" msgstr "新增" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:110 msgid "removed" msgstr "移除 " -#: 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:138 taiga/projects/services/stats.py:139 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:135 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:146 +#: taiga/projects/services/stats.py:55 taiga/projects/services/stats.py:56 msgid "Unassigned" msgstr "無指定" -#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86 +#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:212 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:87 msgid "-deleted-" msgstr "-刪除-" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "to:" msgstr "給:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:21 msgid "from:" msgstr "from:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:27 msgid "Added" msgstr "新增的" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:34 msgid "Changed" msgstr "改變的" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:41 msgid "Deleted" msgstr "刪除的:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:55 msgid "added:" msgstr "新增的:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:58 msgid "removed:" msgstr "移除的:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 msgid "From:" msgstr "來自:" -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63 -#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:64 +#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:81 msgid "To:" msgstr "給:" @@ -1558,33 +1558,33 @@ msgstr "封鎖筆記" msgid "sprint" msgstr "衝刺任務" -#: taiga/projects/issues/api.py:160 +#: taiga/projects/issues/api.py:162 msgid "You don't have permissions to set this sprint to this issue." msgstr "您無權限設定此問題的衝刺任務" -#: taiga/projects/issues/api.py:164 +#: taiga/projects/issues/api.py:166 msgid "You don't have permissions to set this status to this issue." msgstr "您無權限設定此問題的狀態" -#: taiga/projects/issues/api.py:168 +#: taiga/projects/issues/api.py:170 msgid "You don't have permissions to set this severity to this issue." msgstr "您無權限設定此問題的嚴重性" -#: taiga/projects/issues/api.py:172 +#: taiga/projects/issues/api.py:174 msgid "You don't have permissions to set this priority to this issue." msgstr "您無權限設定此問題的優先性" -#: taiga/projects/issues/api.py:176 +#: taiga/projects/issues/api.py:178 msgid "You don't have permissions to set this type to this issue." msgstr "您無權限設定此問題的類型" #: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35 -#: taiga/projects/userstories/models.py:57 +#: taiga/projects/userstories/models.py:58 msgid "ref" msgstr "ref" #: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39 -#: taiga/projects/userstories/models.py:67 +#: taiga/projects/userstories/models.py:68 msgid "status" msgstr "狀態" @@ -1597,7 +1597,7 @@ msgid "priority" msgstr "優先性" #: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44 -#: taiga/projects/userstories/models.py:60 +#: taiga/projects/userstories/models.py:61 msgid "milestone" msgstr "里程碑" @@ -1606,17 +1606,17 @@ msgid "finished date" msgstr "完成日期" #: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53 -#: taiga/projects/userstories/models.py:89 +#: taiga/projects/userstories/models.py:90 msgid "subject" msgstr "主旨" #: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63 -#: taiga/projects/userstories/models.py:93 +#: taiga/projects/userstories/models.py:94 msgid "assigned to" msgstr "指派給" #: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67 -#: taiga/projects/userstories/models.py:103 +#: taiga/projects/userstories/models.py:104 msgid "external reference" msgstr "外部參考" @@ -1633,31 +1633,31 @@ msgstr "" msgid "Like" msgstr "" -#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:136 -#: taiga/projects/models.py:396 taiga/projects/models.py:460 -#: taiga/projects/models.py:543 taiga/projects/models.py:601 -#: taiga/projects/wiki/models.py:31 taiga/users/models.py:200 +#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:136 +#: taiga/projects/models.py:353 taiga/projects/models.py:417 +#: taiga/projects/models.py:500 taiga/projects/models.py:558 +#: taiga/projects/wiki/models.py:31 taiga/users/models.py:264 msgid "slug" msgstr "代稱" -#: taiga/projects/milestones/models.py:42 +#: taiga/projects/milestones/models.py:44 msgid "estimated start date" msgstr "预計開始日期" -#: taiga/projects/milestones/models.py:43 +#: taiga/projects/milestones/models.py:45 msgid "estimated finish date" msgstr "預計完成日期" -#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:400 -#: taiga/projects/models.py:464 taiga/projects/models.py:547 +#: taiga/projects/milestones/models.py:52 taiga/projects/models.py:357 +#: taiga/projects/models.py:421 taiga/projects/models.py:504 msgid "is closed" msgstr "被關閉" -#: taiga/projects/milestones/models.py:52 +#: taiga/projects/milestones/models.py:54 msgid "disponibility" msgstr "disponibility" -#: taiga/projects/milestones/models.py:75 +#: taiga/projects/milestones/models.py:79 msgid "The estimated start must be previous to the estimated finish." msgstr "預估開始必須在預估結束之前" @@ -1686,7 +1686,7 @@ msgstr "電子郵件" msgid "create at" msgstr "創建於" -#: taiga/projects/models.py:70 taiga/users/models.py:130 +#: taiga/projects/models.py:70 taiga/users/models.py:133 msgid "token" msgstr "代號" @@ -1742,27 +1742,27 @@ msgstr "全部里程碑" msgid "total story points" msgstr "全部故事點數" -#: taiga/projects/models.py:154 taiga/projects/models.py:614 +#: taiga/projects/models.py:154 taiga/projects/models.py:571 msgid "active backlog panel" msgstr "活躍的待辦任務優先表面板" -#: taiga/projects/models.py:156 taiga/projects/models.py:616 +#: taiga/projects/models.py:156 taiga/projects/models.py:573 msgid "active kanban panel" msgstr "活躍的看板式面板" -#: taiga/projects/models.py:158 taiga/projects/models.py:618 +#: taiga/projects/models.py:158 taiga/projects/models.py:575 msgid "active wiki panel" msgstr "活躍的維基面板" -#: taiga/projects/models.py:160 taiga/projects/models.py:620 +#: taiga/projects/models.py:160 taiga/projects/models.py:577 msgid "active issues panel" msgstr "活躍的問題面板" -#: taiga/projects/models.py:163 taiga/projects/models.py:623 +#: taiga/projects/models.py:163 taiga/projects/models.py:580 msgid "videoconference system" msgstr "視訊會議系統" -#: taiga/projects/models.py:165 taiga/projects/models.py:625 +#: taiga/projects/models.py:165 taiga/projects/models.py:582 msgid "videoconference extra data" msgstr "視訊會議額外資料" @@ -1786,67 +1786,67 @@ msgstr "私密" msgid "tags colors" msgstr "標籤顏色" -#: taiga/projects/models.py:383 +#: taiga/projects/models.py:340 msgid "modules config" msgstr "模組設定" -#: taiga/projects/models.py:402 +#: taiga/projects/models.py:359 msgid "is archived" msgstr "已歸檔" -#: taiga/projects/models.py:404 taiga/projects/models.py:466 -#: taiga/projects/models.py:499 taiga/projects/models.py:522 -#: taiga/projects/models.py:549 taiga/projects/models.py:580 -#: taiga/users/models.py:115 +#: taiga/projects/models.py:361 taiga/projects/models.py:423 +#: taiga/projects/models.py:456 taiga/projects/models.py:479 +#: taiga/projects/models.py:506 taiga/projects/models.py:537 +#: taiga/users/models.py:118 msgid "color" msgstr "顏色" -#: taiga/projects/models.py:406 +#: taiga/projects/models.py:363 msgid "work in progress limit" msgstr "工作進度限制" -#: taiga/projects/models.py:437 taiga/userstorage/models.py:31 +#: taiga/projects/models.py:394 taiga/userstorage/models.py:31 msgid "value" msgstr "價值" -#: taiga/projects/models.py:611 +#: taiga/projects/models.py:568 msgid "default owner's role" msgstr "預設所有者角色" -#: taiga/projects/models.py:627 +#: taiga/projects/models.py:584 msgid "default options" msgstr "預設選項" -#: taiga/projects/models.py:628 +#: taiga/projects/models.py:585 msgid "us statuses" msgstr "我們狀況" -#: taiga/projects/models.py:629 taiga/projects/userstories/models.py:40 -#: taiga/projects/userstories/models.py:72 +#: taiga/projects/models.py:586 taiga/projects/userstories/models.py:41 +#: taiga/projects/userstories/models.py:73 msgid "points" msgstr "點數" -#: taiga/projects/models.py:630 +#: taiga/projects/models.py:587 msgid "task statuses" msgstr "任務狀況" -#: taiga/projects/models.py:631 +#: taiga/projects/models.py:588 msgid "issue statuses" msgstr "問題狀況" -#: taiga/projects/models.py:632 +#: taiga/projects/models.py:589 msgid "issue types" msgstr "問題類型" -#: taiga/projects/models.py:633 +#: taiga/projects/models.py:590 msgid "priorities" msgstr "優先性" -#: taiga/projects/models.py:634 +#: taiga/projects/models.py:591 msgid "severities" msgstr "嚴重性" -#: taiga/projects/models.py:635 +#: taiga/projects/models.py:592 msgid "roles" msgstr "角色" @@ -2681,23 +2681,23 @@ msgstr "嚴重性" msgid "Roles" msgstr "角色" -#: taiga/projects/services/stats.py:85 +#: taiga/projects/services/stats.py:197 msgid "Future sprint" msgstr "未來之衝刺" -#: taiga/projects/services/stats.py:102 +#: taiga/projects/services/stats.py:215 msgid "Project End" msgstr "專案結束" -#: taiga/projects/tasks/api.py:104 taiga/projects/tasks/api.py:113 +#: taiga/projects/tasks/api.py:111 taiga/projects/tasks/api.py:120 msgid "You don't have permissions to set this sprint to this task." msgstr "無權限更動此任務下的衝刺任務" -#: taiga/projects/tasks/api.py:107 +#: taiga/projects/tasks/api.py:114 msgid "You don't have permissions to set this user story to this task." msgstr "無權限更動此務下的使用者故事" -#: taiga/projects/tasks/api.py:110 +#: taiga/projects/tasks/api.py:117 msgid "You don't have permissions to set this status to this task." msgstr "無權限更動此任務下的狀態" @@ -3099,45 +3099,45 @@ msgstr "產品所有人" msgid "Stakeholder" msgstr "利害關係人" -#: taiga/projects/userstories/api.py:156 +#: taiga/projects/userstories/api.py:161 msgid "You don't have permissions to set this sprint to this user story." msgstr "無權限更動使用者故事的衝刺任務" -#: taiga/projects/userstories/api.py:160 +#: taiga/projects/userstories/api.py:165 msgid "You don't have permissions to set this status to this user story." msgstr "無權限更動此使用者故事的狀態" -#: taiga/projects/userstories/api.py:254 +#: taiga/projects/userstories/api.py:259 #, python-brace-format msgid "Generating the user story #{ref} - {subject}" msgstr "" -#: taiga/projects/userstories/models.py:37 +#: taiga/projects/userstories/models.py:38 msgid "role" msgstr "角色" -#: taiga/projects/userstories/models.py:75 +#: taiga/projects/userstories/models.py:76 msgid "backlog order" msgstr "待辦任務先後次序" -#: taiga/projects/userstories/models.py:77 -#: taiga/projects/userstories/models.py:79 +#: taiga/projects/userstories/models.py:78 +#: taiga/projects/userstories/models.py:80 msgid "sprint order" msgstr "衝刺次序" -#: taiga/projects/userstories/models.py:87 +#: taiga/projects/userstories/models.py:88 msgid "finish date" msgstr "完成日期" -#: taiga/projects/userstories/models.py:95 +#: taiga/projects/userstories/models.py:96 msgid "is client requirement" msgstr "客戶要求" -#: taiga/projects/userstories/models.py:97 +#: taiga/projects/userstories/models.py:98 msgid "is team requirement" msgstr "團隊要求" -#: taiga/projects/userstories/models.py:102 +#: taiga/projects/userstories/models.py:103 msgid "generated from issue" msgstr "産生自問題 " @@ -3206,121 +3206,121 @@ msgstr "複製電子郵件" msgid "Not valid email" msgstr "非有效電子郵性" -#: taiga/users/api.py:146 taiga/users/api.py:153 +#: taiga/users/api.py:146 msgid "Invalid username or email" msgstr "無效使用者或郵件" -#: taiga/users/api.py:161 +#: taiga/users/api.py:155 msgid "Mail sended successful!" msgstr "成功送出郵件" -#: taiga/users/api.py:173 taiga/users/api.py:178 +#: taiga/users/api.py:167 taiga/users/api.py:172 msgid "Token is invalid" msgstr "代號無效" -#: taiga/users/api.py:199 +#: taiga/users/api.py:193 msgid "Current password parameter needed" msgstr "需要目前密碼之參數" -#: taiga/users/api.py:202 +#: taiga/users/api.py:196 msgid "New password parameter needed" msgstr "需要新密碼參數" -#: taiga/users/api.py:205 +#: taiga/users/api.py:199 msgid "Invalid password length at least 6 charaters needed" msgstr "無效密碼長度,至少需6個字元" -#: taiga/users/api.py:208 +#: taiga/users/api.py:202 msgid "Invalid current password" msgstr "無效密碼" -#: taiga/users/api.py:224 +#: taiga/users/api.py:218 msgid "Incomplete arguments" msgstr "不完整參數" -#: taiga/users/api.py:229 +#: taiga/users/api.py:223 msgid "Invalid image format" msgstr "無效的圖片檔案" -#: taiga/users/api.py:256 taiga/users/api.py:262 +#: taiga/users/api.py:250 taiga/users/api.py:256 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "無效,請確認代號正確,之前是否曾使用過?" -#: taiga/users/api.py:289 taiga/users/api.py:297 taiga/users/api.py:300 +#: taiga/users/api.py:283 taiga/users/api.py:291 taiga/users/api.py:294 msgid "Invalid, are you sure the token is correct?" msgstr "無效,請確認代號是否正確?" -#: taiga/users/models.py:71 +#: taiga/users/models.py:74 msgid "superuser status" msgstr "超級使用者狀態 " -#: taiga/users/models.py:72 +#: taiga/users/models.py:75 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "無經明確分派,即賦予該使用者所有權限," -#: taiga/users/models.py:102 +#: taiga/users/models.py:105 msgid "username" msgstr "使用者名稱" -#: taiga/users/models.py:103 +#: taiga/users/models.py:106 msgid "" "Required. 30 characters or fewer. Letters, numbers and /./-/_ characters" msgstr "必填。最多30字元(可為數字,字母,符號....)" -#: taiga/users/models.py:106 +#: taiga/users/models.py:109 msgid "Enter a valid username." msgstr "輸入有效的使用者名稱 " -#: taiga/users/models.py:109 +#: taiga/users/models.py:112 msgid "active" msgstr "活躍" -#: taiga/users/models.py:110 +#: taiga/users/models.py:113 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "賦予該使用者活躍角色,以不選擇取代刪除帳戶功能。" -#: taiga/users/models.py:116 +#: taiga/users/models.py:119 msgid "biography" msgstr "自傳" -#: taiga/users/models.py:119 +#: taiga/users/models.py:122 msgid "photo" msgstr "照片" -#: taiga/users/models.py:120 +#: taiga/users/models.py:123 msgid "date joined" msgstr "加入日期" -#: taiga/users/models.py:122 +#: taiga/users/models.py:125 msgid "default language" msgstr "預設語言 " -#: taiga/users/models.py:124 +#: taiga/users/models.py:127 msgid "default theme" msgstr "預設主題" -#: taiga/users/models.py:126 +#: taiga/users/models.py:129 msgid "default timezone" msgstr "預設時區" -#: taiga/users/models.py:128 +#: taiga/users/models.py:131 msgid "colorize tags" msgstr "顏色標籤" -#: taiga/users/models.py:133 +#: taiga/users/models.py:136 msgid "email token" msgstr "電子郵件符號 " -#: taiga/users/models.py:135 +#: taiga/users/models.py:138 msgid "new email address" msgstr "新電子郵件地址" -#: taiga/users/models.py:203 +#: taiga/users/models.py:267 msgid "permissions" msgstr "許可" @@ -3332,7 +3332,7 @@ msgstr "無效" msgid "Invalid username. Try with a different one." msgstr "無效使用者名稱,請重試其它名稱 " -#: taiga/users/services.py:53 taiga/users/services.py:57 +#: taiga/users/services.py:51 taiga/users/services.py:69 msgid "Username or password does not matches user." msgstr "用戶名稱與密碼不符"