Merge branch 'master' into stable

remotes/origin/issue/4795/notification_even_they_are_disabled 2.1.0
Alejandro Alonso 2016-04-29 10:45:42 +02:00
commit e647fc8d19
48 changed files with 4287 additions and 2292 deletions

View File

@ -27,6 +27,7 @@ answer newbie questions, and generally made taiga that much better:
- Bruno Clermont <bruno@robotinfra.com> - Bruno Clermont <bruno@robotinfra.com>
- Chris Wilson <chris.wilson@aridhia.com> - Chris Wilson <chris.wilson@aridhia.com>
- David Burke <david@burkesoftware.com> - David Burke <david@burkesoftware.com>
- Everardo Medina <everblut@gmail.com>
- Hector Colina <hcolina@gmail.com> - Hector Colina <hcolina@gmail.com>
- Joe Letts - Joe Letts
- Julien Palard - Julien Palard

View File

@ -1,6 +1,30 @@
# Changelog # # Changelog #
## 2.1.0 Ursus Americanus (2016-05-03)
### Features
- Add sprint name and slug on search results for user stories ((thanks to [@everblut](https://github.com/everblut)))
- [API] projects resource: Random order if `discover_mode=true` and `is_featured=true`.
- Webhooks: Improve webhook data:
- add permalinks
- owner, assigned_to, status, type, priority, severity, user_story, milestone, project are objects
- add role to 'points' object
- add the owner to every notification ('by' field)
- add the date of the notification ('date' field)
- show human diffs in 'changes'
- remove unnecessary data
- CSV Reports:
- Change field name: 'milestone' to 'sprint'
- Add new fields: 'sprint_estimated_start' and 'sprint_estimated_end'
- Importer:
- Remove project after load a dump file fails
- Add more info the the logger if load a dump file fails
### Misc
- Lots of small and not so small bugfixes.
## 2.0.0 Pulsatilla Patens (2016-04-04) ## 2.0.0 Pulsatilla Patens (2016-04-04)
### Features ### Features

View File

@ -96,3 +96,11 @@ DATABASES = {
# If is True /front/sitemap.xml show a valid sitemap of taiga-front client # If is True /front/sitemap.xml show a valid sitemap of taiga-front client
#FRONT_SITEMAP_ENABLED = False #FRONT_SITEMAP_ENABLED = False
#FRONT_SITEMAP_CACHE_TIMEOUT = 24*60*60 # In second #FRONT_SITEMAP_CACHE_TIMEOUT = 24*60*60 # In second
# CELERY
#from .celery import *
#CELERY_ENABLED = True
#
# To use celery in memory
#CELERY_ENABLED = True
#CELERY_ALWAYS_EAGER = True

View File

@ -17,10 +17,8 @@
from .development import * from .development import *
SKIP_SOUTH_TESTS = True
SOUTH_TESTS_MIGRATE = False
CELERY_ALWAYS_EAGER = True
CELERY_ENABLED = False CELERY_ENABLED = False
CELERY_ALWAYS_EAGER = True
MEDIA_ROOT = "/tmp" MEDIA_ROOT = "/tmp"

View File

@ -22,8 +22,8 @@ from taiga.base.api.utils import encoders
import json import json
def dumps(data, ensure_ascii=True, encoder_class=encoders.JSONEncoder): def dumps(data, ensure_ascii=True, encoder_class=encoders.JSONEncoder, indent=None):
return json.dumps(data, cls=encoder_class, indent=None, ensure_ascii=ensure_ascii) return json.dumps(data, cls=encoder_class, ensure_ascii=ensure_ascii, indent=indent)
def loads(data): def loads(data):

View File

@ -36,14 +36,14 @@ from taiga.projects.models import Project, Membership
from taiga.projects.issues.models import Issue from taiga.projects.issues.models import Issue
from taiga.projects.tasks.models import Task from taiga.projects.tasks.models import Task
from taiga.projects.serializers import ProjectSerializer from taiga.projects.serializers import ProjectSerializer
from taiga.users import services as users_service from taiga.users import services as users_services
from . import exceptions as err
from . import mixins from . import mixins
from . import serializers
from . import service
from . import permissions from . import permissions
from . import serializers
from . import services
from . import tasks from . import tasks
from . import dump_service
from . import throttling from . import throttling
from .renderers import ExportRenderer from .renderers import ExportRenderer
@ -72,7 +72,7 @@ class ProjectExporterViewSet(mixins.ImportThrottlingPolicyMixin, GenericViewSet)
path = "exports/{}/{}-{}.json".format(project.pk, project.slug, uuid.uuid4().hex) path = "exports/{}/{}-{}.json".format(project.pk, project.slug, uuid.uuid4().hex)
storage_path = default_storage.path(path) storage_path = default_storage.path(path)
with default_storage.open(storage_path, mode="w") as outfile: with default_storage.open(storage_path, mode="w") as outfile:
service.render_project(project, outfile) services.render_project(project, outfile)
response_data = { response_data = {
"url": default_storage.url(path) "url": default_storage.url(path)
@ -96,7 +96,7 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
total_memberships = len([m for m in data.get("memberships", []) total_memberships = len([m for m in data.get("memberships", [])
if m.get("email", None) != data["owner"]]) if m.get("email", None) != data["owner"]])
total_memberships = total_memberships + 1 # 1 is the owner total_memberships = total_memberships + 1 # 1 is the owner
(enough_slots, error_message) = users_service.has_available_slot_for_import_new_project( (enough_slots, error_message) = users_services.has_available_slot_for_import_new_project(
self.request.user, self.request.user,
is_private, is_private,
total_memberships total_memberships
@ -105,22 +105,22 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message) raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message)
# Create Project # Create Project
project_serialized = service.store_project(data) project_serialized = services.store.store_project(data)
if not project_serialized: if not project_serialized:
raise exc.BadRequest(service.get_errors()) raise exc.BadRequest(services.store.get_errors())
# Create roles # Create roles
roles_serialized = None roles_serialized = None
if "roles" in data: if "roles" in data:
roles_serialized = service.store_roles(project_serialized.object, data) roles_serialized = services.store.store_roles(project_serialized.object, data)
if not roles_serialized: if not roles_serialized:
raise exc.BadRequest(_("We needed at least one role")) raise exc.BadRequest(_("We needed at least one role"))
# Create memberships # Create memberships
if "memberships" in data: if "memberships" in data:
service.store_memberships(project_serialized.object, data) services.store.store_memberships(project_serialized.object, data)
try: try:
owner_membership = project_serialized.object.memberships.get(user=project_serialized.object.owner) owner_membership = project_serialized.object.memberships.get(user=project_serialized.object.owner)
@ -137,57 +137,57 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
# Create project values choicess # Create project values choicess
if "points" in data: if "points" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"points", serializers.PointsExportSerializer) "points", serializers.PointsExportSerializer)
if "issue_types" in data: if "issue_types" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"issue_types", "issue_types",
serializers.IssueTypeExportSerializer) serializers.IssueTypeExportSerializer)
if "issue_statuses" in data: if "issue_statuses" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"issue_statuses", "issue_statuses",
serializers.IssueStatusExportSerializer,) serializers.IssueStatusExportSerializer,)
if "us_statuses" in data: if "us_statuses" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"us_statuses", "us_statuses",
serializers.UserStoryStatusExportSerializer,) serializers.UserStoryStatusExportSerializer,)
if "task_statuses" in data: if "task_statuses" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"task_statuses", "task_statuses",
serializers.TaskStatusExportSerializer) serializers.TaskStatusExportSerializer)
if "priorities" in data: if "priorities" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"priorities", "priorities",
serializers.PriorityExportSerializer) serializers.PriorityExportSerializer)
if "severities" in data: if "severities" in data:
service.store_choices(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"severities", "severities",
serializers.SeverityExportSerializer) serializers.SeverityExportSerializer)
if ("points" in data or "issues_types" in data or if ("points" in data or "issues_types" in data or
"issues_statuses" in data or "us_statuses" in data or "issues_statuses" in data or "us_statuses" in data or
"task_statuses" in data or "priorities" in data or "task_statuses" in data or "priorities" in data or
"severities" in data): "severities" in data):
service.store_default_choices(project_serialized.object, data) services.store.store_default_project_attributes_values(project_serialized.object, data)
# Created custom attributes # Created custom attributes
if "userstorycustomattributes" in data: if "userstorycustomattributes" in data:
service.store_custom_attributes(project_serialized.object, data, services.store.store_custom_attributes(project_serialized.object, data,
"userstorycustomattributes", "userstorycustomattributes",
serializers.UserStoryCustomAttributeExportSerializer) serializers.UserStoryCustomAttributeExportSerializer)
if "taskcustomattributes" in data: if "taskcustomattributes" in data:
service.store_custom_attributes(project_serialized.object, data, services.store.store_custom_attributes(project_serialized.object, data,
"taskcustomattributes", "taskcustomattributes",
serializers.TaskCustomAttributeExportSerializer) serializers.TaskCustomAttributeExportSerializer)
if "issuecustomattributes" in data: if "issuecustomattributes" in data:
service.store_custom_attributes(project_serialized.object, data, services.store.store_custom_attributes(project_serialized.object, data,
"issuecustomattributes", "issuecustomattributes",
serializers.IssueCustomAttributeExportSerializer) serializers.IssueCustomAttributeExportSerializer)
# Is there any error? # Is there any error?
errors = service.get_errors() errors = services.store.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
@ -199,21 +199,33 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
@detail_route(methods=['post']) @detail_route(methods=['post'])
@method_decorator(atomic) @method_decorator(atomic)
def issue(self, request, *args, **kwargs): def milestone(self, request, *args, **kwargs):
project = self.get_object_or_none() project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project) self.check_permissions(request, 'import_item', project)
signals.pre_save.disconnect(sender=Issue, milestone = services.store.store_milestone(project, request.DATA.copy())
dispatch_uid="set_finished_date_when_edit_issue")
issue = service.store_issue(project, request.DATA.copy()) errors = services.store.get_errors()
errors = service.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
headers = self.get_success_headers(issue.data) headers = self.get_success_headers(milestone.data)
return response.Created(issue.data, headers=headers) return response.Created(milestone.data, headers=headers)
@detail_route(methods=['post'])
@method_decorator(atomic)
def us(self, request, *args, **kwargs):
project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project)
us = services.store.store_user_story(project, request.DATA.copy())
errors = services.store.get_errors()
if errors:
raise exc.BadRequest(errors)
headers = self.get_success_headers(us.data)
return response.Created(us.data, headers=headers)
@detail_route(methods=['post']) @detail_route(methods=['post'])
@method_decorator(atomic) @method_decorator(atomic)
@ -224,9 +236,9 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
signals.pre_save.disconnect(sender=Task, signals.pre_save.disconnect(sender=Task,
dispatch_uid="set_finished_date_when_edit_task") dispatch_uid="set_finished_date_when_edit_task")
task = service.store_task(project, request.DATA.copy()) task = services.store.store_task(project, request.DATA.copy())
errors = service.get_errors() errors = services.store.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
@ -235,33 +247,21 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
@detail_route(methods=['post']) @detail_route(methods=['post'])
@method_decorator(atomic) @method_decorator(atomic)
def us(self, request, *args, **kwargs): def issue(self, request, *args, **kwargs):
project = self.get_object_or_none() project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project) self.check_permissions(request, 'import_item', project)
us = service.store_user_story(project, request.DATA.copy()) signals.pre_save.disconnect(sender=Issue,
dispatch_uid="set_finished_date_when_edit_issue")
errors = service.get_errors() issue = services.store.store_issue(project, request.DATA.copy())
errors = services.store.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
headers = self.get_success_headers(us.data) headers = self.get_success_headers(issue.data)
return response.Created(us.data, headers=headers) return response.Created(issue.data, headers=headers)
@detail_route(methods=['post'])
@method_decorator(atomic)
def milestone(self, request, *args, **kwargs):
project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project)
milestone = service.store_milestone(project, request.DATA.copy())
errors = service.get_errors()
if errors:
raise exc.BadRequest(errors)
headers = self.get_success_headers(milestone.data)
return response.Created(milestone.data, headers=headers)
@detail_route(methods=['post']) @detail_route(methods=['post'])
@method_decorator(atomic) @method_decorator(atomic)
@ -269,9 +269,9 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
project = self.get_object_or_none() project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project) self.check_permissions(request, 'import_item', project)
wiki_page = service.store_wiki_page(project, request.DATA.copy()) wiki_page = services.store.store_wiki_page(project, request.DATA.copy())
errors = service.get_errors() errors = services.store.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
@ -284,9 +284,9 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
project = self.get_object_or_none() project = self.get_object_or_none()
self.check_permissions(request, 'import_item', project) self.check_permissions(request, 'import_item', project)
wiki_link = service.store_wiki_link(project, request.DATA.copy()) wiki_link = services.store.store_wiki_link(project, request.DATA.copy())
errors = service.get_errors() errors = services.store.get_errors()
if errors: if errors:
raise exc.BadRequest(errors) raise exc.BadRequest(errors)
@ -327,7 +327,7 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
total_memberships = len([m for m in dump.get("memberships", []) total_memberships = len([m for m in dump.get("memberships", [])
if m.get("email", None) != dump["owner"]]) if m.get("email", None) != dump["owner"]])
total_memberships = total_memberships + 1 # 1 is the owner total_memberships = total_memberships + 1 # 1 is the owner
(enough_slots, error_message) = users_service.has_available_slot_for_import_new_project( (enough_slots, error_message) = users_services.has_available_slot_for_import_new_project(
user, user,
is_private, is_private,
total_memberships total_memberships
@ -335,11 +335,23 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
if not enough_slots: if not enough_slots:
raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message) raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message)
# Async mode
if settings.CELERY_ENABLED: if settings.CELERY_ENABLED:
task = tasks.load_project_dump.delay(user, dump) task = tasks.load_project_dump.delay(user, dump)
return response.Accepted({"import_id": task.id}) return response.Accepted({"import_id": task.id})
project = dump_service.dict_to_project(dump, request.user) # Sync mode
response_data = ProjectSerializer(project).data try:
return response.Created(response_data) project = services.store_project_from_dict(dump, request.user)
except err.TaigaImportError as e:
# On Error
## remove project
if e.project:
e.project.delete_related_content()
e.project.delete()
return response.BadRequest({"error": e.message, "details": e.errors})
else:
# On Success
response_data = ProjectSerializer(project).data
return response.Created(response_data)

View File

@ -1,202 +0,0 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from taiga.projects.models import Membership, Project
from taiga.users import services as users_service
from . import serializers
from . import service
class TaigaImportError(Exception):
def __init__(self, message):
self.message = message
def store_milestones(project, data):
results = []
for milestone_data in data.get("milestones", []):
milestone = service.store_milestone(project, milestone_data)
results.append(milestone)
return results
def store_tasks(project, data):
results = []
for task in data.get("tasks", []):
task = service.store_task(project, task)
results.append(task)
return results
def store_wiki_pages(project, data):
results = []
for wiki_page in data.get("wiki_pages", []):
results.append(service.store_wiki_page(project, wiki_page))
return results
def store_wiki_links(project, data):
results = []
for wiki_link in data.get("wiki_links", []):
results.append(service.store_wiki_link(project, wiki_link))
return results
def store_user_stories(project, data):
results = []
for userstory in data.get("user_stories", []):
us = service.store_user_story(project, userstory)
results.append(us)
return results
def store_timeline_entries(project, data):
results = []
for timeline in data.get("timeline", []):
tl = service.store_timeline_entry(project, timeline)
results.append(tl)
return results
def store_issues(project, data):
issues = []
for issue in data.get("issues", []):
issues.append(service.store_issue(project, issue))
return issues
def store_tags_colors(project, data):
project.tags_colors = data.get("tags_colors", [])
project.save()
return None
def dict_to_project(data, owner=None):
if owner:
data["owner"] = owner.email
# Validate if the owner can have this project
is_private = data.get("is_private", False)
total_memberships = len([m for m in data.get("memberships", [])
if m.get("email", None) != data["owner"]])
total_memberships = total_memberships + 1 # 1 is the owner
(enough_slots, error_message) = users_service.has_available_slot_for_import_new_project(
owner,
is_private,
total_memberships
)
if not enough_slots:
raise TaigaImportError(error_message)
project_serialized = service.store_project(data)
if not project_serialized:
raise TaigaImportError(_("error importing project data"))
proj = project_serialized.object
service.store_choices(proj, data, "points", serializers.PointsExportSerializer)
service.store_choices(proj, data, "issue_types", serializers.IssueTypeExportSerializer)
service.store_choices(proj, data, "issue_statuses", serializers.IssueStatusExportSerializer)
service.store_choices(proj, data, "us_statuses", serializers.UserStoryStatusExportSerializer)
service.store_choices(proj, data, "task_statuses", serializers.TaskStatusExportSerializer)
service.store_choices(proj, data, "priorities", serializers.PriorityExportSerializer)
service.store_choices(proj, data, "severities", serializers.SeverityExportSerializer)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing lists of project attributes"))
service.store_default_choices(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing default project attributes values"))
service.store_custom_attributes(proj, data, "userstorycustomattributes",
serializers.UserStoryCustomAttributeExportSerializer)
service.store_custom_attributes(proj, data, "taskcustomattributes",
serializers.TaskCustomAttributeExportSerializer)
service.store_custom_attributes(proj, data, "issuecustomattributes",
serializers.IssueCustomAttributeExportSerializer)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing custom attributes"))
service.store_roles(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing roles"))
service.store_memberships(proj, data)
if proj.memberships.filter(user=proj.owner).count() == 0:
if proj.roles.all().count() > 0:
Membership.objects.create(
project=proj,
email=proj.owner.email,
user=proj.owner,
role=proj.roles.all().first(),
is_admin=True
)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing memberships"))
store_milestones(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing sprints"))
store_wiki_pages(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing wiki pages"))
store_wiki_links(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing wiki links"))
store_issues(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing issues"))
store_user_stories(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing user stories"))
store_tasks(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing tasks"))
store_tags_colors(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing tags"))
store_timeline_entries(proj, data)
if service.get_errors(clear=False):
raise TaigaImportError(_("error importing timelines"))
proj.refresh_totals()
return proj

View File

@ -0,0 +1,23 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
class TaigaImportError(Exception):
def __init__(self, message, project, errors=[]):
self.message = message
self.project = project
self.errors = errors

View File

@ -18,25 +18,45 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from taiga.projects.models import Project from taiga.projects.models import Project
from taiga.export_import.renderers import ExportRenderer from taiga.export_import.services import render_project
from taiga.export_import.service import render_project
import os
import resource
class Command(BaseCommand): class Command(BaseCommand):
args = '<project_slug project_slug ...>' help = "Export projects to json"
help = 'Export a project to json'
renderer_context = {"indent": 4} def add_arguments(self, parser):
renderer = ExportRenderer() parser.add_argument("project_slugs",
nargs="+",
help="<project_slug project_slug ...>")
parser.add_argument("-d", "--dst_dir",
action="store",
dest="dst_dir",
default="./",
metavar="DIR",
help="Directory to save the json files. ('./' by default)")
def handle(self, *args, **options): def handle(self, *args, **options):
for project_slug in args: dst_dir = options["dst_dir"]
if not os.path.exists(dst_dir):
raise CommandError("Directory {} does not exist.".format(dst_dir))
if not os.path.isdir(dst_dir):
raise CommandError("'{}' must be a directory, not a file.".format(dst_dir))
project_slugs = options["project_slugs"]
for project_slug in project_slugs:
try: try:
project = Project.objects.get(slug=project_slug) project = Project.objects.get(slug=project_slug)
except Project.DoesNotExist: except Project.DoesNotExist:
raise CommandError('Project "%s" does not exist' % project_slug) raise CommandError("Project '{}' does not exist".format(project_slug))
with open('%s.json'%(project_slug), 'w') as outfile: dst_file = os.path.join(dst_dir, "{}.json".format(project_slug))
render_project(project, outfile) with open(src_file, "w") as f:
render_project(project, f)
print("-> Generate dump of project '{}' in '{}'".format(project.name, src_file))

View File

@ -21,10 +21,10 @@ from django.db.models import signals
from optparse import make_option from optparse import make_option
from taiga.base.utils import json from taiga.base.utils import json
from taiga.projects.models import Project from taiga.export_import.import services
from taiga.export_import.exceptions as err
from taiga.export_import.renderers import ExportRenderer from taiga.export_import.renderers import ExportRenderer
from taiga.export_import.dump_service import dict_to_project, TaigaImportError from taiga.projects.models import Project
from taiga.export_import.service import get_errors
from taiga.users.models import User from taiga.users.models import User
@ -61,8 +61,12 @@ class Command(BaseCommand):
signals.post_delete.receivers = receivers_back signals.post_delete.receivers = receivers_back
user = User.objects.get(email=args[1]) user = User.objects.get(email=args[1])
dict_to_project(data, user) services.store_project_from_dict(data, user)
except TaigaImportError as e: except err.TaigaImportError as e:
if e.project:
e.project.delete_related_content()
e.project.delete()
print("ERROR:", end=" ") print("ERROR:", end=" ")
print(e.message) print(e.message)
print(get_errors()) print(services.store.get_errors())

View File

@ -0,0 +1,26 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
# This makes all code that import services works and
# is not the baddest practice ;)
from .render import render_project
from . import render
from .store import store_project_from_dict
from . import store

View File

@ -0,0 +1,124 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
# This makes all code that import services works and
# is not the baddest practice ;)
import base64
import gc
import os
from django.core.files.storage import default_storage
from taiga.base.utils import json
from taiga.timeline.service import get_project_timeline
from taiga.base.api.fields import get_component
from .. import serializers
def render_project(project, outfile, chunk_size = 8190):
serializer = serializers.ProjectExportSerializer(project)
outfile.write('{\n')
first_field = True
for field_name in serializer.fields.keys():
# Avoid writing "," in the last element
if not first_field:
outfile.write(",\n")
else:
first_field = False
field = serializer.fields.get(field_name)
field.initialize(parent=serializer, field_name=field_name)
# These four "special" fields hava attachments so we use them in a special way
if field_name in ["wiki_pages", "user_stories", "tasks", "issues"]:
value = get_component(project, field_name)
outfile.write('"{}": [\n'.format(field_name))
attachments_field = field.fields.pop("attachments", None)
if attachments_field:
attachments_field.initialize(parent=field, field_name="attachments")
first_item = True
for item in value.iterator():
# Avoid writing "," in the last element
if not first_item:
outfile.write(",\n")
else:
first_item = False
dumped_value = json.dumps(field.to_native(item))
writing_value = dumped_value[:-1]+ ',\n "attachments": [\n'
outfile.write(writing_value)
first_attachment = True
for attachment in item.attachments.iterator():
# Avoid writing "," in the last element
if not first_attachment:
outfile.write(",\n")
else:
first_attachment = False
# Write all the data expect the serialized file
attachment_serializer = serializers.AttachmentExportSerializer(instance=attachment)
attached_file_serializer = attachment_serializer.fields.pop("attached_file")
dumped_value = json.dumps(attachment_serializer.data)
dumped_value = dumped_value[:-1] + ',\n "attached_file":{\n "data":"'
outfile.write(dumped_value)
# We write the attached_files by chunks so the memory used is not increased
attachment_file = attachment.attached_file
if default_storage.exists(attachment_file.name):
with default_storage.open(attachment_file.name) as f:
while True:
bin_data = f.read(chunk_size)
if not bin_data:
break
b64_data = base64.b64encode(bin_data).decode('utf-8')
outfile.write(b64_data)
outfile.write('", \n "name":"{}"}}\n}}'.format(
os.path.basename(attachment_file.name)))
outfile.write(']}')
outfile.flush()
gc.collect()
outfile.write(']')
else:
value = field.field_to_native(project, field_name)
outfile.write('"{}": {}'.format(field_name, json.dumps(value)))
# Generate the timeline
outfile.write(',\n"timeline": [\n')
first_timeline = True
for timeline_item in get_project_timeline(project).iterator():
# Avoid writing "," in the last element
if not first_timeline:
outfile.write(",\n")
else:
first_timeline = False
dumped_value = json.dumps(serializers.TimelineExportSerializer(timeline_item).data)
outfile.write(dumped_value)
outfile.write(']}\n')

View File

@ -15,30 +15,35 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64 # This makes all code that import services works and
import gc # is not the baddest practice ;)
import resource
import os import os
import os.path as path
import uuid import uuid
from unidecode import unidecode from unidecode import unidecode
from django.template.defaultfilters import slugify
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.files.storage import default_storage from django.template.defaultfilters import slugify
from django.utils.translation import ugettext as _
from taiga.base.utils import json
from taiga.projects.history.services import make_key_from_model_object, take_snapshot from taiga.projects.history.services import make_key_from_model_object, take_snapshot
from taiga.timeline.service import build_project_namespace, get_project_timeline from taiga.projects.models import Membership
from taiga.projects.references import sequences as seq from taiga.projects.references import sequences as seq
from taiga.projects.references import models as refs from taiga.projects.references import models as refs
from taiga.projects.userstories.models import RolePoints from taiga.projects.userstories.models import RolePoints
from taiga.projects.services import find_invited_user from taiga.projects.services import find_invited_user
from taiga.base.api.fields import get_component from taiga.timeline.service import build_project_namespace
from taiga.users import services as users_service
from . import serializers from .. import exceptions as err
from .. import serializers
########################################################################
## Manage errors
########################################################################
_errors_log = {} _errors_log = {}
@ -57,97 +62,16 @@ def add_errors(section, errors):
_errors_log[section] = [errors] _errors_log[section] = [errors]
def render_project(project, outfile, chunk_size = 8190): def reset_errors():
serializer = serializers.ProjectExportSerializer(project) _errors_log.clear()
outfile.write('{\n')
first_field = True
for field_name in serializer.fields.keys():
# Avoid writing "," in the last element
if not first_field:
outfile.write(",\n")
else:
first_field = False
field = serializer.fields.get(field_name)
field.initialize(parent=serializer, field_name=field_name)
# These four "special" fields hava attachments so we use them in a special way
if field_name in ["wiki_pages", "user_stories", "tasks", "issues"]:
value = get_component(project, field_name)
outfile.write('"{}": [\n'.format(field_name))
attachments_field = field.fields.pop("attachments", None)
if attachments_field:
attachments_field.initialize(parent=field, field_name="attachments")
first_item = True
for item in value.iterator():
# Avoid writing "," in the last element
if not first_item:
outfile.write(",\n")
else:
first_item = False
dumped_value = json.dumps(field.to_native(item)) ########################################################################
writing_value = dumped_value[:-1]+ ',\n "attachments": [\n' ## Store functions
outfile.write(writing_value) ########################################################################
first_attachment = True
for attachment in item.attachments.iterator():
# Avoid writing "," in the last element
if not first_attachment:
outfile.write(",\n")
else:
first_attachment = False
# Write all the data expect the serialized file
attachment_serializer = serializers.AttachmentExportSerializer(instance=attachment)
attached_file_serializer = attachment_serializer.fields.pop("attached_file")
dumped_value = json.dumps(attachment_serializer.data)
dumped_value = dumped_value[:-1] + ',\n "attached_file":{\n "data":"'
outfile.write(dumped_value)
# We write the attached_files by chunks so the memory used is not increased
attachment_file = attachment.attached_file
if default_storage.exists(attachment_file.name):
with default_storage.open(attachment_file.name) as f:
while True:
bin_data = f.read(chunk_size)
if not bin_data:
break
b64_data = base64.b64encode(bin_data).decode('utf-8')
outfile.write(b64_data)
outfile.write('", \n "name":"{}"}}\n}}'.format(
os.path.basename(attachment_file.name)))
outfile.write(']}')
outfile.flush()
gc.collect()
outfile.write(']')
else:
value = field.field_to_native(project, field_name)
outfile.write('"{}": {}'.format(field_name, json.dumps(value)))
# Generate the timeline
outfile.write(',\n"timeline": [\n')
first_timeline = True
for timeline_item in get_project_timeline(project).iterator():
# Avoid writing "," in the last element
if not first_timeline:
outfile.write(",\n")
else:
first_timeline = False
dumped_value = json.dumps(serializers.TimelineExportSerializer(timeline_item).data)
outfile.write(dumped_value)
outfile.write(']}\n')
## PROJECT
def store_project(data): def store_project(data):
project_data = {} project_data = {}
@ -175,43 +99,19 @@ def store_project(data):
return None return None
def _store_choice(project, data, field, serializer): ## MISC
serialized = serializer(data=data)
if serialized.is_valid(): def _use_id_instead_name_as_key_in_custom_attributes_values(custom_attributes, values):
serialized.object.project = project ret = {}
serialized.object._importing = True for attr in custom_attributes:
serialized.save() value = values.get(attr["name"], None)
return serialized.object if value is not None:
add_errors(field, serialized.errors) ret[str(attr["id"])] = value
return None
return ret
def store_choices(project, data, field, serializer): def _store_custom_attributes_values(obj, data_values, obj_field, serializer_class):
result = []
for choice_data in data.get(field, []):
result.append(_store_choice(project, choice_data, field, serializer))
return result
def _store_custom_attribute(project, data, field, serializer):
serialized = serializer(data=data)
if serialized.is_valid():
serialized.object.project = project
serialized.object._importing = True
serialized.save()
return serialized.object
add_errors(field, serialized.errors)
return None
def store_custom_attributes(project, data, field, serializer):
result = []
for custom_attribute_data in data.get(field, []):
result.append(_store_custom_attribute(project, custom_attribute_data, field, serializer))
return result
def store_custom_attributes_values(obj, data_values, obj_field, serializer_class):
data = { data = {
obj_field: obj.id, obj_field: obj.id,
"attributes_values": data_values, "attributes_values": data_values,
@ -231,17 +131,39 @@ def store_custom_attributes_values(obj, data_values, obj_field, serializer_class
return None return None
def _use_id_instead_name_as_key_in_custom_attributes_values(custom_attributes, values): def _store_attachment(project, obj, attachment):
ret = {} serialized = serializers.AttachmentExportSerializer(data=attachment)
for attr in custom_attributes: if serialized.is_valid():
value = values.get(attr["name"], None) serialized.object.content_type = ContentType.objects.get_for_model(obj.__class__)
if value is not None: serialized.object.object_id = obj.id
ret[str(attr["id"])] = value serialized.object.project = project
if serialized.object.owner is None:
return ret serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object.size = serialized.object.attached_file.size
serialized.object.name = os.path.basename(serialized.object.attached_file.name)
serialized.save()
return serialized
add_errors("attachments", serialized.errors)
return serialized
def store_role(project, role): def _store_history(project, obj, history):
serialized = serializers.HistoryExportSerializer(data=history, context={"project": project})
if serialized.is_valid():
serialized.object.key = make_key_from_model_object(obj)
if serialized.object.diff is None:
serialized.object.diff = []
serialized.object._importing = True
serialized.save()
return serialized
add_errors("history", serialized.errors)
return serialized
## ROLES
def _store_role(project, role):
serialized = serializers.RoleExportSerializer(data=role) serialized = serializers.RoleExportSerializer(data=role)
if serialized.is_valid(): if serialized.is_valid():
serialized.object.project = project serialized.object.project = project
@ -255,14 +177,60 @@ def store_role(project, role):
def store_roles(project, data): def store_roles(project, data):
results = [] results = []
for role in data.get("roles", []): for role in data.get("roles", []):
serialized = store_role(project, role) serialized = _store_role(project, role)
if serialized: if serialized:
results.append(serialized) results.append(serialized)
return results return results
def store_default_choices(project, data): ## MEMGERSHIPS
def _store_membership(project, membership):
serialized = serializers.MembershipExportSerializer(data=membership, context={"project": project})
if serialized.is_valid():
serialized.object.project = project
serialized.object._importing = True
serialized.object.token = str(uuid.uuid1())
serialized.object.user = find_invited_user(serialized.object.email,
default=serialized.object.user)
serialized.save()
return serialized
add_errors("memberships", serialized.errors)
return None
def store_memberships(project, data):
results = []
for membership in data.get("memberships", []):
results.append(_store_membership(project, membership))
return results
## PROJECT ATTRIBUTES
def _store_project_attribute_value(project, data, field, serializer):
serialized = serializer(data=data)
if serialized.is_valid():
serialized.object.project = project
serialized.object._importing = True
serialized.save()
return serialized.object
add_errors(field, serialized.errors)
return None
def store_project_attributes_values(project, data, field, serializer):
result = []
for choice_data in data.get(field, []):
result.append(_store_project_attribute_value(project, choice_data, field, serializer))
return result
## DEFAULT PROJECT ATTRIBUTES VALUES
def store_default_project_attributes_values(project, data):
def helper(project, field, related, data): def helper(project, field, related, data):
if field in data: if field in data:
value = related.all().get(name=data[field]) value = related.all().get(name=data[field])
@ -281,75 +249,27 @@ def store_default_choices(project, data):
project.save() project.save()
def store_membership(project, membership): ## CUSTOM ATTRIBUTES
serialized = serializers.MembershipExportSerializer(data=membership, context={"project": project})
def _store_custom_attribute(project, data, field, serializer):
serialized = serializer(data=data)
if serialized.is_valid(): if serialized.is_valid():
serialized.object.project = project serialized.object.project = project
serialized.object._importing = True serialized.object._importing = True
serialized.object.token = str(uuid.uuid1())
serialized.object.user = find_invited_user(serialized.object.email,
default=serialized.object.user)
serialized.save() serialized.save()
return serialized return serialized.object
add_errors(field, serialized.errors)
add_errors("memberships", serialized.errors)
return None return None
def store_memberships(project, data): def store_custom_attributes(project, data, field, serializer):
results = [] result = []
for membership in data.get("memberships", []): for custom_attribute_data in data.get(field, []):
results.append(store_membership(project, membership)) result.append(_store_custom_attribute(project, custom_attribute_data, field, serializer))
return results return result
def store_task(project, data): ## MILESTONE
if "status" not in data and project.default_task_status:
data["status"] = project.default_task_status.name
serialized = serializers.TaskExportSerializer(data=data, context={"project": project})
if serialized.is_valid():
serialized.object.project = project
if serialized.object.owner is None:
serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object._not_notify = True
serialized.save()
serialized.save_watchers()
if serialized.object.ref:
sequence_name = refs.make_sequence_name(project)
if not seq.exists(sequence_name):
seq.create(sequence_name)
seq.set_max(sequence_name, serialized.object.ref)
else:
serialized.object.ref, _ = refs.make_reference(serialized.object, project)
serialized.object.save()
for task_attachment in data.get("attachments", []):
store_attachment(project, serialized.object, task_attachment)
history_entries = data.get("history", [])
for history in history_entries:
store_history(project, serialized.object, history)
if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner)
custom_attributes_values = data.get("custom_attributes_values", None)
if custom_attributes_values:
custom_attributes = serialized.object.project.taskcustomattributes.all().values('id', 'name')
custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values(
custom_attributes, custom_attributes_values)
store_custom_attributes_values(serialized.object, custom_attributes_values,
"task", serializers.TaskCustomAttributesValuesExportSerializer)
return serialized
add_errors("tasks", serialized.errors)
return None
def store_milestone(project, milestone): def store_milestone(project, milestone):
serialized = serializers.MilestoneExportSerializer(data=milestone, project=project) serialized = serializers.MilestoneExportSerializer(data=milestone, project=project)
@ -368,90 +288,17 @@ def store_milestone(project, milestone):
return None return None
def store_attachment(project, obj, attachment): def store_milestones(project, data):
serialized = serializers.AttachmentExportSerializer(data=attachment) results = []
if serialized.is_valid(): for milestone_data in data.get("milestones", []):
serialized.object.content_type = ContentType.objects.get_for_model(obj.__class__) milestone = store_milestone(project, milestone_data)
serialized.object.object_id = obj.id results.append(milestone)
serialized.object.project = project return results
if serialized.object.owner is None:
serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object.size = serialized.object.attached_file.size
serialized.object.name = path.basename(serialized.object.attached_file.name)
serialized.save()
return serialized
add_errors("attachments", serialized.errors)
return serialized
def store_timeline_entry(project, timeline): ## USER STORIES
serialized = serializers.TimelineExportSerializer(data=timeline, context={"project": project})
if serialized.is_valid():
serialized.object.project = project
serialized.object.namespace = build_project_namespace(project)
serialized.object.object_id = project.id
serialized.object._importing = True
serialized.save()
return serialized
add_errors("timeline", serialized.errors)
return serialized
def _store_role_point(project, us, role_point):
def store_history(project, obj, history):
serialized = serializers.HistoryExportSerializer(data=history, context={"project": project})
if serialized.is_valid():
serialized.object.key = make_key_from_model_object(obj)
if serialized.object.diff is None:
serialized.object.diff = []
serialized.object._importing = True
serialized.save()
return serialized
add_errors("history", serialized.errors)
return serialized
def store_wiki_page(project, wiki_page):
wiki_page["slug"] = slugify(unidecode(wiki_page.get("slug", "")))
serialized = serializers.WikiPageExportSerializer(data=wiki_page)
if serialized.is_valid():
serialized.object.project = project
if serialized.object.owner is None:
serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object._not_notify = True
serialized.save()
serialized.save_watchers()
for attachment in wiki_page.get("attachments", []):
store_attachment(project, serialized.object, attachment)
history_entries = wiki_page.get("history", [])
for history in history_entries:
store_history(project, serialized.object, history)
if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner)
return serialized
add_errors("wiki_pages", serialized.errors)
return None
def store_wiki_link(project, wiki_link):
serialized = serializers.WikiLinkExportSerializer(data=wiki_link)
if serialized.is_valid():
serialized.object.project = project
serialized.object._importing = True
serialized.save()
return serialized
add_errors("wiki_links", serialized.errors)
return None
def store_role_point(project, us, role_point):
serialized = serializers.RolePointsExportSerializer(data=role_point, context={"project": project}) serialized = serializers.RolePointsExportSerializer(data=role_point, context={"project": project})
if serialized.is_valid(): if serialized.is_valid():
try: try:
@ -468,7 +315,6 @@ def store_role_point(project, us, role_point):
add_errors("role_points", serialized.errors) add_errors("role_points", serialized.errors)
return None return None
def store_user_story(project, data): def store_user_story(project, data):
if "status" not in data and project.default_us_status: if "status" not in data and project.default_us_status:
data["status"] = project.default_us_status.name data["status"] = project.default_us_status.name
@ -497,14 +343,14 @@ def store_user_story(project, data):
serialized.object.save() serialized.object.save()
for us_attachment in data.get("attachments", []): for us_attachment in data.get("attachments", []):
store_attachment(project, serialized.object, us_attachment) _store_attachment(project, serialized.object, us_attachment)
for role_point in data.get("role_points", []): for role_point in data.get("role_points", []):
store_role_point(project, serialized.object, role_point) _store_role_point(project, serialized.object, role_point)
history_entries = data.get("history", []) history_entries = data.get("history", [])
for history in history_entries: for history in history_entries:
store_history(project, serialized.object, history) _store_history(project, serialized.object, history)
if not history_entries: if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner) take_snapshot(serialized.object, user=serialized.object.owner)
@ -514,7 +360,7 @@ def store_user_story(project, data):
custom_attributes = serialized.object.project.userstorycustomattributes.all().values('id', 'name') custom_attributes = serialized.object.project.userstorycustomattributes.all().values('id', 'name')
custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values( custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values(
custom_attributes, custom_attributes_values) custom_attributes, custom_attributes_values)
store_custom_attributes_values(serialized.object, custom_attributes_values, _store_custom_attributes_values(serialized.object, custom_attributes_values,
"user_story", serializers.UserStoryCustomAttributesValuesExportSerializer) "user_story", serializers.UserStoryCustomAttributesValuesExportSerializer)
return serialized return serialized
@ -523,6 +369,74 @@ def store_user_story(project, data):
return None return None
def store_user_stories(project, data):
results = []
for userstory in data.get("user_stories", []):
us = store_user_story(project, userstory)
results.append(us)
return results
## TASKS
def store_task(project, data):
if "status" not in data and project.default_task_status:
data["status"] = project.default_task_status.name
serialized = serializers.TaskExportSerializer(data=data, context={"project": project})
if serialized.is_valid():
serialized.object.project = project
if serialized.object.owner is None:
serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object._not_notify = True
serialized.save()
serialized.save_watchers()
if serialized.object.ref:
sequence_name = refs.make_sequence_name(project)
if not seq.exists(sequence_name):
seq.create(sequence_name)
seq.set_max(sequence_name, serialized.object.ref)
else:
serialized.object.ref, _ = refs.make_reference(serialized.object, project)
serialized.object.save()
for task_attachment in data.get("attachments", []):
_store_attachment(project, serialized.object, task_attachment)
history_entries = data.get("history", [])
for history in history_entries:
_store_history(project, serialized.object, history)
if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner)
custom_attributes_values = data.get("custom_attributes_values", None)
if custom_attributes_values:
custom_attributes = serialized.object.project.taskcustomattributes.all().values('id', 'name')
custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values(
custom_attributes, custom_attributes_values)
_store_custom_attributes_values(serialized.object, custom_attributes_values,
"task", serializers.TaskCustomAttributesValuesExportSerializer)
return serialized
add_errors("tasks", serialized.errors)
return None
def store_tasks(project, data):
results = []
for task in data.get("tasks", []):
task = store_task(project, task)
results.append(task)
return results
## ISSUES
def store_issue(project, data): def store_issue(project, data):
serialized = serializers.IssueExportSerializer(data=data, context={"project": project}) serialized = serializers.IssueExportSerializer(data=data, context={"project": project})
@ -558,11 +472,11 @@ def store_issue(project, data):
serialized.object.save() serialized.object.save()
for attachment in data.get("attachments", []): for attachment in data.get("attachments", []):
store_attachment(project, serialized.object, attachment) _store_attachment(project, serialized.object, attachment)
history_entries = data.get("history", []) history_entries = data.get("history", [])
for history in history_entries: for history in history_entries:
store_history(project, serialized.object, history) _store_history(project, serialized.object, history)
if not history_entries: if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner) take_snapshot(serialized.object, user=serialized.object.owner)
@ -572,10 +486,248 @@ def store_issue(project, data):
custom_attributes = serialized.object.project.issuecustomattributes.all().values('id', 'name') custom_attributes = serialized.object.project.issuecustomattributes.all().values('id', 'name')
custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values( custom_attributes_values = _use_id_instead_name_as_key_in_custom_attributes_values(
custom_attributes, custom_attributes_values) custom_attributes, custom_attributes_values)
store_custom_attributes_values(serialized.object, custom_attributes_values, _store_custom_attributes_values(serialized.object, custom_attributes_values,
"issue", serializers.IssueCustomAttributesValuesExportSerializer) "issue", serializers.IssueCustomAttributesValuesExportSerializer)
return serialized return serialized
add_errors("issues", serialized.errors) add_errors("issues", serialized.errors)
return None return None
def store_issues(project, data):
issues = []
for issue in data.get("issues", []):
issues.append(store_issue(project, issue))
return issues
## WIKI PAGES
def store_wiki_page(project, wiki_page):
wiki_page["slug"] = slugify(unidecode(wiki_page.get("slug", "")))
serialized = serializers.WikiPageExportSerializer(data=wiki_page)
if serialized.is_valid():
serialized.object.project = project
if serialized.object.owner is None:
serialized.object.owner = serialized.object.project.owner
serialized.object._importing = True
serialized.object._not_notify = True
serialized.save()
serialized.save_watchers()
for attachment in wiki_page.get("attachments", []):
_store_attachment(project, serialized.object, attachment)
history_entries = wiki_page.get("history", [])
for history in history_entries:
_store_history(project, serialized.object, history)
if not history_entries:
take_snapshot(serialized.object, user=serialized.object.owner)
return serialized
add_errors("wiki_pages", serialized.errors)
return None
def store_wiki_pages(project, data):
results = []
for wiki_page in data.get("wiki_pages", []):
results.append(store_wiki_page(project, wiki_page))
return results
## WIKI LINKS
def store_wiki_link(project, wiki_link):
serialized = serializers.WikiLinkExportSerializer(data=wiki_link)
if serialized.is_valid():
serialized.object.project = project
serialized.object._importing = True
serialized.save()
return serialized
add_errors("wiki_links", serialized.errors)
return None
def store_wiki_links(project, data):
results = []
for wiki_link in data.get("wiki_links", []):
results.append(store_wiki_link(project, wiki_link))
return results
## TAGS COLORS
def store_tags_colors(project, data):
project.tags_colors = data.get("tags_colors", [])
project.save()
return None
## TIMELINE
def _store_timeline_entry(project, timeline):
serialized = serializers.TimelineExportSerializer(data=timeline, context={"project": project})
if serialized.is_valid():
serialized.object.project = project
serialized.object.namespace = build_project_namespace(project)
serialized.object.object_id = project.id
serialized.object._importing = True
serialized.save()
return serialized
add_errors("timeline", serialized.errors)
return serialized
def store_timeline_entries(project, data):
results = []
for timeline in data.get("timeline", []):
tl = _store_timeline_entry(project, timeline)
results.append(tl)
return results
#############################################
## Store project dict
#############################################
def _validate_if_owner_have_enought_space_to_this_project(owner, data):
# Validate if the owner can have this project
data["owner"] = owner.email
is_private = data.get("is_private", False)
total_memberships = len([m for m in data.get("memberships", [])
if m.get("email", None) != data["owner"]])
total_memberships = total_memberships + 1 # 1 is the owner
(enough_slots, error_message) = users_service.has_available_slot_for_import_new_project(
owner,
is_private,
total_memberships
)
if not enough_slots:
raise err.TaigaImportError(error_message, None)
def _create_project_object(data):
# Create the project
project_serialized = store_project(data)
if not project_serialized:
raise err.TaigaImportError(_("error importing project data"), None)
return project_serialized.object if project_serialized else None
def _create_membership_for_project_owner(project):
if project.memberships.filter(user=project.owner).count() == 0:
if project.roles.all().count() > 0:
Membership.objects.create(
project=project,
email=project.owner.email,
user=project.owner,
role=project.roles.all().first(),
is_admin=True
)
def _populate_project_object(project, data):
def check_if_there_is_some_error(message=_("error importing project data"), project=None):
errors = get_errors(clear=False)
if errors:
raise err.TaigaImportError(message, project, errors=errors)
# Create roles
store_roles(project, data)
check_if_there_is_some_error(_("error importing roles"), None)
# Create memberships
store_memberships(project, data)
_create_membership_for_project_owner(project)
check_if_there_is_some_error(_("error importing memberships"), project)
# Create project attributes values
store_project_attributes_values(project, data, "us_statuses", serializers.UserStoryStatusExportSerializer)
store_project_attributes_values(project, data, "points", serializers.PointsExportSerializer)
store_project_attributes_values(project, data, "task_statuses", serializers.TaskStatusExportSerializer)
store_project_attributes_values(project, data, "issue_types", serializers.IssueTypeExportSerializer)
store_project_attributes_values(project, data, "issue_statuses", serializers.IssueStatusExportSerializer)
store_project_attributes_values(project, data, "priorities", serializers.PriorityExportSerializer)
store_project_attributes_values(project, data, "severities", serializers.SeverityExportSerializer)
check_if_there_is_some_error(_("error importing lists of project attributes"), project)
# Create default values for project attributes
store_default_project_attributes_values(project, data)
check_if_there_is_some_error(_("error importing default project attributes values"), project)
# Create custom attributes
store_custom_attributes(project, data, "userstorycustomattributes",
serializers.UserStoryCustomAttributeExportSerializer)
store_custom_attributes(project, data, "taskcustomattributes",
serializers.TaskCustomAttributeExportSerializer)
store_custom_attributes(project, data, "issuecustomattributes",
serializers.IssueCustomAttributeExportSerializer)
check_if_there_is_some_error(_("error importing custom attributes"), project)
# Create milestones
store_milestones(project, data)
check_if_there_is_some_error(_("error importing sprints"), project)
# Create user stories
store_user_stories(project, data)
check_if_there_is_some_error(_("error importing user stories"), project)
# Createer tasks
store_tasks(project, data)
check_if_there_is_some_error(_("error importing tasks"), project)
# Create issues
store_issues(project, data)
check_if_there_is_some_error(_("error importing issues"), project)
# Create wiki pages
store_wiki_pages(project, data)
check_if_there_is_some_error(_("error importing wiki pages"), project)
# Create wiki links
store_wiki_links(project, data)
check_if_there_is_some_error(_("error importing wiki links"), project)
# Create tags
store_tags_colors(project, data)
check_if_there_is_some_error(_("error importing tags"), project)
# Create timeline
store_timeline_entries(project, data)
check_if_there_is_some_error(_("error importing timelines"), project)
# Regenerate stats
project.refresh_totals()
def store_project_from_dict(data, owner=None):
reset_errors()
# Validate
if owner:
_validate_if_owner_have_enought_space_to_this_project(owner, data)
# Create project
project = _create_project_object(data)
# Populate project
try:
_populate_project_object(project, data)
except err.TaigaImportError:
# reraise known inport errors
raise
except:
# reise unknown errors as import error
raise err.TaigaImportError(_("unexpected error importing project"), project)
return project

View File

@ -27,10 +27,11 @@ from django.conf import settings
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.mails import mail_builder from taiga.base.mails import mail_builder
from taiga.base.utils import json
from taiga.celery import app from taiga.celery import app
from .service import render_project from . import exceptions as err
from .dump_service import dict_to_project from . import services
from .renderers import ExportRenderer from .renderers import ExportRenderer
logger = logging.getLogger('taiga.export_import') logger = logging.getLogger('taiga.export_import')
@ -46,7 +47,7 @@ def dump_project(self, user, project):
try: try:
url = default_storage.url(path) url = default_storage.url(path)
with default_storage.open(storage_path, mode="w") as outfile: with default_storage.open(storage_path, mode="w") as outfile:
render_project(project, outfile) services.render_project(project, outfile)
except Exception: except Exception:
# Error # Error
@ -77,28 +78,57 @@ def delete_project_dump(project_id, project_slug, task_id):
default_storage.delete("exports/{}/{}-{}.json".format(project_id, project_slug, task_id)) default_storage.delete("exports/{}/{}-{}.json".format(project_id, project_slug, task_id))
ADMIN_ERROR_LOAD_PROJECT_DUMP_MESSAGE = _("""
Error loading dump by {user_full_name} <{user_email}>:"
REASON:
-------
{reason}
DETAILS:
--------
{details}
TRACE ERROR:
------------""")
@app.task @app.task
def load_project_dump(user, dump): def load_project_dump(user, dump):
try: try:
project = dict_to_project(dump, user) project = services.store_project_from_dict(dump, user)
except Exception: except err.TaigaImportError as e:
# Error # On Error
## remove project
if e.project:
e.project.delete_related_content()
e.project.delete()
## send email to the user
error_subject = _("Error loading project dump")
error_message = e.message or _("Error loading your project dump file")
ctx = { ctx = {
"user": user, "user": user,
"error_subject": _("Error loading project dump"), "error_subject": error_message,
"error_message": _("Error loading project dump"), "error_message": error_subject,
} }
email = mail_builder.import_error(user, ctx) email = mail_builder.import_error(user, ctx)
email.send() email.send()
logger.error('Error loading dump by %s <%s>',
user,
user.email,
exc_info=sys.exc_info())
# TODO: [Rollback] Remove project because it can be corrupted ## logged the error to sysadmins
text = ADMIN_ERROR_LOAD_PROJECT_DUMP_MESSAGE.format(
user_full_name=user,
user_email=user.email,
reason=e.message or _(" -- no detail info --"),
details=json.dumps(e.errors, indent=4)
)
logger.error(text, exc_info=sys.exc_info())
else: else:
# Success # On Success
ctx = {"user": user, "project": project} ctx = {"user": user, "project": project}
email = mail_builder.load_dump(user, ctx) email = mail_builder.load_dump(user, ctx)
email.send() email.send()

View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/ca/)\n" "language/ca/)\n"
@ -480,59 +480,59 @@ msgstr "Es necessita arxiu dump."
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Format d'arxiu dump invàlid" msgstr "Format d'arxiu dump invàlid"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "" msgstr ""
@ -555,11 +555,11 @@ msgstr "Conté camps personalitzats invàlids."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "" msgstr ""
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "" msgstr ""
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "" msgstr ""
@ -718,11 +718,12 @@ msgstr ""
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "Nom" msgstr "Nom"
@ -738,7 +739,7 @@ msgstr ""
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "Descripció" msgstr "Descripció"
@ -776,7 +777,7 @@ msgstr "Comentari"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -810,7 +811,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Informació extra" msgstr "Informació extra"
@ -1197,17 +1198,17 @@ msgstr ""
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "Amo" msgstr "Amo"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1226,7 +1227,7 @@ msgstr "Id d'objecte"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1246,10 +1247,10 @@ msgstr "està obsolet "
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "Ordre" msgstr "Ordre"
@ -1528,9 +1529,10 @@ msgid "Likes"
msgstr "Fans" msgstr "Fans"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1542,8 +1544,8 @@ msgstr "Data estimada d'inici"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "Data estimada de finalització" msgstr "Data estimada de finalització"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "està tancat" msgstr "està tancat"
@ -1640,27 +1642,27 @@ msgstr "total de fites"
msgid "total story points" msgid "total story points"
msgstr "total de punts d'història" msgstr "total de punts d'història"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "activa panell de backlog" msgstr "activa panell de backlog"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "activa panell de kanban" msgstr "activa panell de kanban"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "activa panell de wiki" msgstr "activa panell de wiki"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "activa panell d'incidències" msgstr "activa panell d'incidències"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "sistema de videoconferència" msgstr "sistema de videoconferència"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "" msgstr ""
@ -1676,7 +1678,7 @@ msgstr "permisos d'anònims"
msgid "user permissions" msgid "user permissions"
msgstr "permisos d'usuaris" msgstr "permisos d'usuaris"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "es privat" msgstr "es privat"
@ -1737,67 +1739,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "configuració de mòdules" msgstr "configuració de mòdules"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "està arxivat" msgstr "està arxivat"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "color" msgstr "color"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "limit de treball en progrés" msgstr "limit de treball en progrés"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "valor" msgstr "valor"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "rol d'amo per defecte" msgstr "rol d'amo per defecte"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "opcions per defecte" msgstr "opcions per defecte"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "status d'històries d'usuari" msgstr "status d'històries d'usuari"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "punts" msgstr "punts"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "status de tasques" msgstr "status de tasques"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "status d'incidències" msgstr "status d'incidències"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "tipus d'incidències" msgstr "tipus d'incidències"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "prioritats" msgstr "prioritats"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "severitats" msgstr "severitats"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "rols" msgstr "rols"
@ -3145,19 +3147,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Informació personal" msgstr "Informació personal"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Permissos" msgstr "Permissos"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Dates importants" msgstr "Dates importants"

View File

@ -17,8 +17,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: German (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: German (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/de/)\n" "language/de/)\n"
@ -535,59 +535,59 @@ msgstr "Exportdatei erforderlich"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Ungültiges Exportdatei Format" msgstr "Ungültiges Exportdatei Format"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "Fehler beim Importieren der Projektdaten" msgstr "Fehler beim Importieren der Projektdaten"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "Fehler beim Importieren der Listen von Projektattributen" msgstr "Fehler beim Importieren der Listen von Projektattributen"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "Fehler beim Importieren der vorgegebenen Projekt Attributwerte " msgstr "Fehler beim Importieren der vorgegebenen Projekt Attributwerte "
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "Fehler beim Importieren der Kundenattribute" msgstr "Fehler beim Importieren der Kundenattribute"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "Fehler beim Importieren der Rollen" msgstr "Fehler beim Importieren der Rollen"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "Fehler beim Importieren der Mitgliedschaften" msgstr "Fehler beim Importieren der Mitgliedschaften"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "Fehler beim Import der Sprints" msgstr "Fehler beim Import der Sprints"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "Fehler beim Importieren von Wiki Seiten" msgstr "Fehler beim Importieren von Wiki Seiten"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "Fehler beim Importieren von Wiki Links" msgstr "Fehler beim Importieren von Wiki Links"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "Fehler beim Importieren der Tickets" msgstr "Fehler beim Importieren der Tickets"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "Fehler beim Importieren der User-Stories" msgstr "Fehler beim Importieren der User-Stories"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "Fehler beim Importieren der Aufgaben" msgstr "Fehler beim Importieren der Aufgaben"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "Fehler beim Importieren der Schlagworte" msgstr "Fehler beim Importieren der Schlagworte"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "Fehler beim Importieren der Chroniken" msgstr "Fehler beim Importieren der Chroniken"
@ -610,11 +610,11 @@ msgstr "Enthält ungültige Benutzerfelder."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Der Name für das Projekt ist doppelt vergeben" msgstr "Der Name für das Projekt ist doppelt vergeben"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Fehler beim Erzeugen der Projekt Export-Datei " msgstr "Fehler beim Erzeugen der Projekt Export-Datei "
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Fehler beim Laden von Projekt Export-Datei" msgstr "Fehler beim Laden von Projekt Export-Datei"
@ -866,11 +866,12 @@ msgstr "Authentifizierung erforderlich"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "Name" msgstr "Name"
@ -886,7 +887,7 @@ msgstr "Web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "Beschreibung" msgstr "Beschreibung"
@ -924,7 +925,7 @@ msgstr "Kommentar"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -957,7 +958,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Zusätzliche Information" msgstr "Zusätzliche Information"
@ -1387,17 +1388,17 @@ msgstr "Nr. unterschreidet sich zwischen dem Objekt und dem Projekt"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "Besitzer" msgstr "Besitzer"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1416,7 +1417,7 @@ msgstr "Objekt Nr."
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1436,10 +1437,10 @@ msgstr "wurde verworfen"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "Reihenfolge" msgstr "Reihenfolge"
@ -1722,9 +1723,10 @@ msgid "Likes"
msgstr "Likes" msgstr "Likes"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "Slug" msgstr "Slug"
@ -1736,8 +1738,8 @@ msgstr "geschätzter Starttermin"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "geschätzter Endtermin" msgstr "geschätzter Endtermin"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "ist geschlossen" msgstr "ist geschlossen"
@ -1834,27 +1836,27 @@ msgstr "Meilensteine Gesamt"
msgid "total story points" msgid "total story points"
msgstr "Story Punkte insgesamt" msgstr "Story Punkte insgesamt"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "aktives Backlog Panel" msgstr "aktives Backlog Panel"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "aktives Kanban Panel" msgstr "aktives Kanban Panel"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "aktives Wiki Panel" msgstr "aktives Wiki Panel"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "aktives Tickets Panel" msgstr "aktives Tickets Panel"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "Videokonferenzsystem" msgstr "Videokonferenzsystem"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "Zusatzdaten Videokonferenz" msgstr "Zusatzdaten Videokonferenz"
@ -1870,7 +1872,7 @@ msgstr "Rechte für anonyme Nutzer"
msgid "user permissions" msgid "user permissions"
msgstr "Rechte für registrierte Nutzer" msgstr "Rechte für registrierte Nutzer"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "ist privat" msgstr "ist privat"
@ -1931,67 +1933,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "Module konfigurieren" msgstr "Module konfigurieren"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "ist archiviert" msgstr "ist archiviert"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "Farbe" msgstr "Farbe"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "Ausführungslimit" msgstr "Ausführungslimit"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "Wert" msgstr "Wert"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "voreingestellte Besitzerrolle" msgstr "voreingestellte Besitzerrolle"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "Vorgabe Optionen" msgstr "Vorgabe Optionen"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "User-Story Status " msgstr "User-Story Status "
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "Punkte" msgstr "Punkte"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "Aufgaben Status" msgstr "Aufgaben Status"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "Ticket Status" msgstr "Ticket Status"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "Ticket Arten" msgstr "Ticket Arten"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "Prioritäten" msgstr "Prioritäten"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "Gewichtung" msgstr "Gewichtung"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "Rollen" msgstr "Rollen"
@ -3668,19 +3670,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Prüfe die API der Historie auf Übereinstimmung" msgstr "Prüfe die API der Historie auf Übereinstimmung"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Personal Information" msgstr "Personal Information"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigungen" msgstr "Berechtigungen"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Wichtige Termine" msgstr "Wichtige Termine"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2015-03-25 20:09+0100\n" "PO-Revision-Date: 2015-03-25 20:09+0100\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Taiga Dev Team <support@taiga.io>\n" "Language-Team: Taiga Dev Team <support@taiga.io>\n"
@ -469,59 +469,59 @@ msgstr ""
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "" msgstr ""
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "" msgstr ""
@ -544,11 +544,11 @@ msgstr ""
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "" msgstr ""
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "" msgstr ""
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "" msgstr ""
@ -707,11 +707,12 @@ msgstr ""
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "" msgstr ""
@ -727,7 +728,7 @@ msgstr ""
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "" msgstr ""
@ -765,7 +766,7 @@ msgstr ""
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -791,7 +792,7 @@ msgid ""
msgstr "" msgstr ""
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "" msgstr ""
@ -1170,17 +1171,17 @@ msgstr ""
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "" msgstr ""
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1199,7 +1200,7 @@ msgstr ""
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1219,10 +1220,10 @@ msgstr ""
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "" msgstr ""
@ -1501,9 +1502,10 @@ msgid "Likes"
msgstr "" msgstr ""
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "" msgstr ""
@ -1515,8 +1517,8 @@ msgstr ""
msgid "estimated finish date" msgid "estimated finish date"
msgstr "" msgstr ""
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "" msgstr ""
@ -1613,27 +1615,27 @@ msgstr ""
msgid "total story points" msgid "total story points"
msgstr "" msgstr ""
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "" msgstr ""
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "" msgstr ""
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "" msgstr ""
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "" msgstr ""
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "" msgstr ""
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "" msgstr ""
@ -1649,7 +1651,7 @@ msgstr ""
msgid "user permissions" msgid "user permissions"
msgstr "" msgstr ""
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "" msgstr ""
@ -1710,67 +1712,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "" msgstr ""
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "" msgstr ""
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "" msgstr ""
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "" msgstr ""
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "" msgstr ""
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "" msgstr ""
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "" msgstr ""
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "" msgstr ""
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "" msgstr ""
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "" msgstr ""
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "" msgstr ""
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "" msgstr ""
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "" msgstr ""
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "" msgstr ""
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "" msgstr ""
@ -3094,19 +3096,39 @@ msgstr ""
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""

View File

@ -16,8 +16,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/es/)\n" "language/es/)\n"
@ -522,59 +522,59 @@ msgstr "Se necesita el fichero con los datos exportados"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Formato de fichero de exportación inválido" msgstr "Formato de fichero de exportación inválido"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "error importando los datos del proyecto" msgstr "error importando los datos del proyecto"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "error importando la listados de valores de attributos del proyecto" msgstr "error importando la listados de valores de attributos del proyecto"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "error importando los valores por defecto de los atributos del proyecto" msgstr "error importando los valores por defecto de los atributos del proyecto"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "error importando los atributos personalizados" msgstr "error importando los atributos personalizados"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "error importando los roles" msgstr "error importando los roles"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "error importando los miembros" msgstr "error importando los miembros"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "error importando los sprints" msgstr "error importando los sprints"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "error importando las páginas del wiki" msgstr "error importando las páginas del wiki"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "error importando los enlaces del wiki" msgstr "error importando los enlaces del wiki"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "error importando las peticiones" msgstr "error importando las peticiones"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "error importando las historias de usuario" msgstr "error importando las historias de usuario"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "error importando las tareas" msgstr "error importando las tareas"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "error importando las etiquetas" msgstr "error importando las etiquetas"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "error importando los timelines" msgstr "error importando los timelines"
@ -597,11 +597,11 @@ msgstr "Contiene attributos personalizados inválidos."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Nombre duplicado para el proyecto" msgstr "Nombre duplicado para el proyecto"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Erro generando el volcado de datos del proyecto" msgstr "Erro generando el volcado de datos del proyecto"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Error cargando el volcado de datos del proyecto" msgstr "Error cargando el volcado de datos del proyecto"
@ -848,11 +848,12 @@ msgstr "Se requiere autenticación"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "nombre" msgstr "nombre"
@ -868,7 +869,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "descripción" msgstr "descripción"
@ -906,7 +907,7 @@ msgstr "comentario"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -939,7 +940,7 @@ msgstr ""
"<p>%(comment)s</p>" "<p>%(comment)s</p>"
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Información extra" msgstr "Información extra"
@ -1369,17 +1370,17 @@ msgstr "El ID de proyecto no coincide entre el adjunto y un proyecto"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "Dueño" msgstr "Dueño"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1398,7 +1399,7 @@ msgstr "id de objeto"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1418,10 +1419,10 @@ msgstr "está desactualizado"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "orden" msgstr "orden"
@ -1700,9 +1701,10 @@ msgid "Likes"
msgstr "Likes" msgstr "Likes"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1714,8 +1716,8 @@ msgstr "fecha estimada de comienzo"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "fecha estimada de finalización" msgstr "fecha estimada de finalización"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "está cerrada" msgstr "está cerrada"
@ -1814,27 +1816,27 @@ msgstr "total de sprints"
msgid "total story points" msgid "total story points"
msgstr "puntos de historia totales" msgstr "puntos de historia totales"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "panel de backlog activado" msgstr "panel de backlog activado"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "panel de kanban activado" msgstr "panel de kanban activado"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "panel de wiki activo" msgstr "panel de wiki activo"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "panel de peticiones activo" msgstr "panel de peticiones activo"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "sistema de videoconferencia" msgstr "sistema de videoconferencia"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "datos extra de videoconferencia" msgstr "datos extra de videoconferencia"
@ -1850,7 +1852,7 @@ msgstr "permisos de anónimo"
msgid "user permissions" msgid "user permissions"
msgstr "permisos de usuario" msgstr "permisos de usuario"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "privado" msgstr "privado"
@ -1911,67 +1913,67 @@ msgstr "actividad el último mes"
msgid "activity last year" msgid "activity last year"
msgstr "actividad el último áño" msgstr "actividad el último áño"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "configuración de modulos" msgstr "configuración de modulos"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "archivado" msgstr "archivado"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "color" msgstr "color"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "limite del trabajo en progreso" msgstr "limite del trabajo en progreso"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "valor" msgstr "valor"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "rol por defecto para el propietario" msgstr "rol por defecto para el propietario"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "opciones por defecto" msgstr "opciones por defecto"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "estatuas de historias" msgstr "estatuas de historias"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "puntos" msgstr "puntos"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "estatus de tareas" msgstr "estatus de tareas"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "estados de petición" msgstr "estados de petición"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "tipos de petición" msgstr "tipos de petición"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "prioridades" msgstr "prioridades"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "gravedades" msgstr "gravedades"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "roles" msgstr "roles"
@ -3608,19 +3610,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Comprueba la API de histórico para obtener el diff exacto" msgstr "Comprueba la API de histórico para obtener el diff exacto"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Información personal" msgstr "Información personal"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Permisos" msgstr "Permisos"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "Restricciones" msgstr "Restricciones"
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "datos importántes" msgstr "datos importántes"

View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Finnish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Finnish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/fi/)\n" "language/fi/)\n"
@ -505,59 +505,59 @@ msgstr "Tarvitaan tiedosto"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Virheellinen tiedostomuoto" msgstr "Virheellinen tiedostomuoto"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "virhe projektidatan tuonnissa" msgstr "virhe projektidatan tuonnissa"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "virhe atribuuttilistan tuonnissa" msgstr "virhe atribuuttilistan tuonnissa"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "virhe oletusarvojen tuonnissa" msgstr "virhe oletusarvojen tuonnissa"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "virhe omien arvojen tuonnissa" msgstr "virhe omien arvojen tuonnissa"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "virhe roolien tuonnissa" msgstr "virhe roolien tuonnissa"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "virhe jäsenyyksien tuonnissa" msgstr "virhe jäsenyyksien tuonnissa"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "virhe kierroksien tuonnissa" msgstr "virhe kierroksien tuonnissa"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "virhe wiki-sivujen tuonnissa" msgstr "virhe wiki-sivujen tuonnissa"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "virhe viki-linkkien tuonnissa" msgstr "virhe viki-linkkien tuonnissa"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "virhe pyyntöjen tuonnissa" msgstr "virhe pyyntöjen tuonnissa"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "virhe käyttäjätarinoiden tuonnissa" msgstr "virhe käyttäjätarinoiden tuonnissa"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "virhe tehtävien tuonnissa" msgstr "virhe tehtävien tuonnissa"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "virhe avainsanojen sisäänlukemisessa" msgstr "virhe avainsanojen sisäänlukemisessa"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "virhe aikajanojen tuonnissa" msgstr "virhe aikajanojen tuonnissa"
@ -580,11 +580,11 @@ msgstr "Sisältää vieheellisiä omia kenttiä."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Nimi on tuplana projektille" msgstr "Nimi on tuplana projektille"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Virhe tiedoston luonnissa" msgstr "Virhe tiedoston luonnissa"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Virhe tiedoston latauksessa" msgstr "Virhe tiedoston latauksessa"
@ -828,11 +828,12 @@ msgstr ""
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "nimi" msgstr "nimi"
@ -848,7 +849,7 @@ msgstr ""
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "kuvaus" msgstr "kuvaus"
@ -886,7 +887,7 @@ msgstr "kommentti"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -921,7 +922,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Lisätiedot" msgstr "Lisätiedot"
@ -1326,17 +1327,17 @@ msgstr "Projekti ID ei vastaa kohdetta ja projektia"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "omistaja" msgstr "omistaja"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1355,7 +1356,7 @@ msgstr "objekti ID"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1375,10 +1376,10 @@ msgstr "on poistettu"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "order" msgstr "order"
@ -1657,9 +1658,10 @@ msgid "Likes"
msgstr "" msgstr ""
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "hukka-aika" msgstr "hukka-aika"
@ -1671,8 +1673,8 @@ msgstr "arvioitu alkupvm"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "arvioitu loppupvm" msgstr "arvioitu loppupvm"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "on suljettu" msgstr "on suljettu"
@ -1769,27 +1771,27 @@ msgstr "virstapyväitä yhteensä"
msgid "total story points" msgid "total story points"
msgstr "käyttäjätarinan yhteispisteet" msgstr "käyttäjätarinan yhteispisteet"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "aktiivinen odottavien paneeli" msgstr "aktiivinen odottavien paneeli"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "aktiivinen kanban-paneeli" msgstr "aktiivinen kanban-paneeli"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "aktiivinen wiki-paneeli" msgstr "aktiivinen wiki-paneeli"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "aktiivinen pyyntöpaneeli" msgstr "aktiivinen pyyntöpaneeli"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "videokokous järjestelmä" msgstr "videokokous järjestelmä"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "" msgstr ""
@ -1805,7 +1807,7 @@ msgstr "vieraan oikeudet"
msgid "user permissions" msgid "user permissions"
msgstr "käyttäjän oikeudet" msgstr "käyttäjän oikeudet"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "on yksityinen" msgstr "on yksityinen"
@ -1866,67 +1868,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "moduulien asetukset" msgstr "moduulien asetukset"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "on arkistoitu" msgstr "on arkistoitu"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "väri" msgstr "väri"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "työn alla olevien max" msgstr "työn alla olevien max"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "arvo" msgstr "arvo"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "oletus omistajan rooli" msgstr "oletus omistajan rooli"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "oletus optiot" msgstr "oletus optiot"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "kt tilat" msgstr "kt tilat"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "pisteet" msgstr "pisteet"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "tehtävän tilat" msgstr "tehtävän tilat"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "pyyntöjen tilat" msgstr "pyyntöjen tilat"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "pyyntötyypit" msgstr "pyyntötyypit"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "kiireellisyydet" msgstr "kiireellisyydet"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "vakavuudet" msgstr "vakavuudet"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "roolit" msgstr "roolit"
@ -3545,19 +3547,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Henkilökohtaiset tiedot" msgstr "Henkilökohtaiset tiedot"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Oikeudet" msgstr "Oikeudet"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Tärkeät päivämäärät" msgstr "Tärkeät päivämäärät"

View File

@ -22,8 +22,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: French (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: French (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/fr/)\n" "language/fr/)\n"
@ -539,60 +539,60 @@ msgstr "Fichier de dump obligatoire"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Format de dump invalide" msgstr "Format de dump invalide"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "Erreur lors de l'importation de données" msgstr "Erreur lors de l'importation de données"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "erreur lors de l'importation des listes des attributs de projet" msgstr "erreur lors de l'importation des listes des attributs de projet"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "" msgstr ""
"erreur lors de l'importation des valeurs par défaut des attributs de projet" "erreur lors de l'importation des valeurs par défaut des attributs de projet"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "Erreur à l'importation des champs personnalisés" msgstr "Erreur à l'importation des champs personnalisés"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "Erreur à l'importation des rôles" msgstr "Erreur à l'importation des rôles"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "Erreur à l'importation des groupes d'utilisateurs" msgstr "Erreur à l'importation des groupes d'utilisateurs"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "Erreur lors de l'importation des sprints." msgstr "Erreur lors de l'importation des sprints."
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "Erreur à l'importation des pages Wiki" msgstr "Erreur à l'importation des pages Wiki"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "Erreur à l'importation des liens Wiki" msgstr "Erreur à l'importation des liens Wiki"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "erreur à l'importation des problèmes" msgstr "erreur à l'importation des problèmes"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "erreur à l'importation des histoires utilisateur" msgstr "erreur à l'importation des histoires utilisateur"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "Erreur lors de l'importation des tâches." msgstr "Erreur lors de l'importation des tâches."
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "erreur lors de l'importation des mots-clés" msgstr "erreur lors de l'importation des mots-clés"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "erreur lors de l'import des timelines" msgstr "erreur lors de l'import des timelines"
@ -615,11 +615,11 @@ msgstr "Contient des champs personnalisés non valides."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Nom dupliqué pour ce projet" msgstr "Nom dupliqué pour ce projet"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Erreur dans la génération du dump du projet" msgstr "Erreur dans la génération du dump du projet"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Erreur au chargement du dump du projet" msgstr "Erreur au chargement du dump du projet"
@ -852,11 +852,12 @@ msgstr "Authentification requise"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "nom" msgstr "nom"
@ -872,7 +873,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "description" msgstr "description"
@ -910,7 +911,7 @@ msgstr "Commentaire"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -943,7 +944,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Informations supplémentaires" msgstr "Informations supplémentaires"
@ -1339,17 +1340,17 @@ msgstr "L'identifiant du projet de correspond pas entre l'objet et le projet"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "propriétaire" msgstr "propriétaire"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1368,7 +1369,7 @@ msgstr "identifiant de l'objet"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1388,10 +1389,10 @@ msgstr "est obsolète"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "ordre" msgstr "ordre"
@ -1670,9 +1671,10 @@ msgid "Likes"
msgstr "Aime" msgstr "Aime"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1684,8 +1686,8 @@ msgstr "date de démarrage estimée"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "date de fin estimée" msgstr "date de fin estimée"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "est fermé" msgstr "est fermé"
@ -1782,27 +1784,27 @@ msgstr "total des jalons"
msgid "total story points" msgid "total story points"
msgstr "total des points d'histoire" msgstr "total des points d'histoire"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "panneau backlog actif" msgstr "panneau backlog actif"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "panneau kanban actif" msgstr "panneau kanban actif"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "panneau wiki actif" msgstr "panneau wiki actif"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "panneau problèmes actif" msgstr "panneau problèmes actif"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "plateforme de vidéoconférence" msgstr "plateforme de vidéoconférence"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "données complémentaires pour la salle de vidéoconférence" msgstr "données complémentaires pour la salle de vidéoconférence"
@ -1818,7 +1820,7 @@ msgstr "Permissions anonymes"
msgid "user permissions" msgid "user permissions"
msgstr "Permission de l'utilisateur" msgstr "Permission de l'utilisateur"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "est privé" msgstr "est privé"
@ -1879,67 +1881,67 @@ msgstr "activité du mois écoulé"
msgid "activity last year" msgid "activity last year"
msgstr "activité de l'année écoulée" msgstr "activité de l'année écoulée"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "Configurations des modules" msgstr "Configurations des modules"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "est archivé" msgstr "est archivé"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "couleur" msgstr "couleur"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "limite de travail en cours" msgstr "limite de travail en cours"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "valeur" msgstr "valeur"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "rôle par défaut du propriétaire" msgstr "rôle par défaut du propriétaire"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "options par défaut" msgstr "options par défaut"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "statuts des us" msgstr "statuts des us"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "points" msgstr "points"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "états des tâches" msgstr "états des tâches"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "statuts des problèmes" msgstr "statuts des problèmes"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "types de problèmes" msgstr "types de problèmes"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "priorités" msgstr "priorités"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "sévérités" msgstr "sévérités"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "rôles" msgstr "rôles"
@ -3332,19 +3334,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Informations personnelles" msgstr "Informations personnelles"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Permissions" msgstr "Permissions"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Dates importantes" msgstr "Dates importantes"

View File

@ -3,6 +3,7 @@
# This file is distributed under the same license as the taiga-back package. # This file is distributed under the same license as the taiga-back package.
# #
# Translators: # Translators:
# Alberto Gloder <alberto.gloder@gmail.com>, 2016
# Andrea Raimondi <raimondi.and@gmail.com>, 2015 # Andrea Raimondi <raimondi.and@gmail.com>, 2015
# David Barragán <bameda@gmail.com>, 2015 # David Barragán <bameda@gmail.com>, 2015
# F B <fabio.baleani@gmail.com>, 2016 # F B <fabio.baleani@gmail.com>, 2016
@ -14,8 +15,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Italian (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Italian (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/it/)\n" "language/it/)\n"
@ -27,30 +28,30 @@ msgstr ""
#: taiga/auth/api.py:100 #: taiga/auth/api.py:100
msgid "Public register is disabled." msgid "Public register is disabled."
msgstr "Registro pubblico disabilitato" msgstr "La registrazione pubblica è disabilitata."
#: taiga/auth/api.py:133 #: taiga/auth/api.py:133
msgid "invalid register type" msgid "invalid register type"
msgstr "Tipo di registro invalido" msgstr "Tipo di registrazione non valida"
#: taiga/auth/api.py:146 #: taiga/auth/api.py:146
msgid "invalid login type" msgid "invalid login type"
msgstr "Tipo di login invalido" msgstr "Tipo di login non valido"
#: taiga/auth/serializers.py:35 taiga/users/serializers.py:64 #: taiga/auth/serializers.py:35 taiga/users/serializers.py:64
msgid "invalid username" msgid "invalid username"
msgstr "Username non valido" msgstr "Nome utente non valido"
#: taiga/auth/serializers.py:40 taiga/users/serializers.py:70 #: taiga/auth/serializers.py:40 taiga/users/serializers.py:70
msgid "" msgid ""
"Required. 255 characters or fewer. Letters, numbers and /./-/_ characters'" "Required. 255 characters or fewer. Letters, numbers and /./-/_ characters'"
msgstr "" msgstr ""
"Sono richiesti 255 caratteri, o meno, contenenti: lettere, numeri e " "Obbligatorio. Al massimo 255 caratteri, Contenenti: lettere, numeri e "
"caratteri /./-/_ " "caratteri /./-/_ "
#: taiga/auth/services.py:75 #: taiga/auth/services.py:75
msgid "Username is already in use." msgid "Username is already in use."
msgstr "Il nome utente appena scelto è già utilizzato." msgstr "Il nome utente scelto è già utilizzato."
#: taiga/auth/services.py:78 #: taiga/auth/services.py:78
msgid "Email is already in use." msgid "Email is already in use."
@ -58,7 +59,7 @@ msgstr "L'email inserita è già utilizzata."
#: taiga/auth/services.py:94 #: taiga/auth/services.py:94
msgid "Token not matches any valid invitation." msgid "Token not matches any valid invitation."
msgstr "Il token non corrisponde a nessun invito valido" msgstr "Il token non corrisponde a nessun invito valido."
#: taiga/auth/services.py:122 #: taiga/auth/services.py:122
msgid "User is already registered." msgid "User is already registered."
@ -70,7 +71,7 @@ msgstr "Questo utente fa già parte del progetto."
#: taiga/auth/services.py:172 #: taiga/auth/services.py:172
msgid "Error on creating new user." msgid "Error on creating new user."
msgstr "Errore nella creazione dell'utente." msgstr "Errore nella creazione della nuova utenza."
#: taiga/auth/tokens.py:48 taiga/auth/tokens.py:55 #: taiga/auth/tokens.py:48 taiga/auth/tokens.py:55
#: taiga/external_apps/services.py:35 taiga/projects/api.py:376 #: taiga/external_apps/services.py:35 taiga/projects/api.py:376
@ -89,19 +90,20 @@ msgstr "Valore non valido."
#: taiga/base/api/fields.py:477 #: taiga/base/api/fields.py:477
#, python-format #, python-format
msgid "'%s' value must be either True or False." msgid "'%s' value must be either True or False."
msgstr "il valore di '%s' deve essere o vero o falso." msgstr "il valore di '%s' deve essere o Vero o Falso."
#: taiga/base/api/fields.py:541 #: taiga/base/api/fields.py:541
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Uno slug valido è composto da lettere, numeri, caratteri di sottolineatura o " "Uno 'slug' valido è composto da lettere, numeri, caratteri di sottolineatura "
"trattini" "o trattini."
#: taiga/base/api/fields.py:556 #: taiga/base/api/fields.py:556
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "Seleziona un valore valido. %(value)s non è una scelta disponibile." msgstr ""
"Seleziona una scelta valida. %(value)s non è fra le scelte disponibili."
#: taiga/base/api/fields.py:619 #: taiga/base/api/fields.py:619
msgid "Enter a valid email address." msgid "Enter a valid email address."
@ -120,21 +122,21 @@ msgstr "L'orario non ha un formato valido. Usa uno dei formati disponibili: %s"
#: taiga/base/api/fields.py:795 #: taiga/base/api/fields.py:795
#, python-format #, python-format
msgid "Time has wrong format. Use one of these formats instead: %s" msgid "Time has wrong format. Use one of these formats instead: %s"
msgstr "Formato temporale errato. Usare uno dei seguenti formati: %s" msgstr "Formato temporale errato. Usa uno dei seguenti formati: %s"
#: taiga/base/api/fields.py:852 #: taiga/base/api/fields.py:852
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Inserire il numero completo." msgstr "Inserisci il numero completo."
#: taiga/base/api/fields.py:853 taiga/base/api/fields.py:906 #: taiga/base/api/fields.py:853 taiga/base/api/fields.py:906
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Assicurati che il valore sia minore o uguale a %(limit_value)s." msgstr "Assicurati che questo valore sia minore o uguale di %(limit_value)s."
#: taiga/base/api/fields.py:854 taiga/base/api/fields.py:907 #: taiga/base/api/fields.py:854 taiga/base/api/fields.py:907
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Assicurati che il valore sia maggiore o uguale a %(limit_value)s." msgstr "Assicurati che questo valore sia maggiore o uguale di %(limit_value)s."
#: taiga/base/api/fields.py:884 #: taiga/base/api/fields.py:884
#, python-format #, python-format
@ -143,7 +145,7 @@ msgstr "il valore \"%s\" deve essere un valore \"float\"."
#: taiga/base/api/fields.py:905 #: taiga/base/api/fields.py:905
msgid "Enter a number." msgid "Enter a number."
msgstr "Inserisci un numero" msgstr "Inserisci un numero."
#: taiga/base/api/fields.py:908 #: taiga/base/api/fields.py:908
#, python-format #, python-format
@ -163,7 +165,7 @@ msgstr "Assicurati che non ci siano più di %s cifre prima del punto decimale."
#: taiga/base/api/fields.py:977 #: taiga/base/api/fields.py:977
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "" msgstr ""
"Non è stato caricato nessun file. Controlla il tipo di codifica nella scheda." "Non è stato caricato alcun file. Controlla il tipo di codifica nella scheda."
#: taiga/base/api/fields.py:978 #: taiga/base/api/fields.py:978
msgid "No file was submitted." msgid "No file was submitted."
@ -178,7 +180,7 @@ msgstr "Il file caricato è vuoto."
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr "" msgstr ""
"Assicurati che il nome del file abbiamo al massimo %(max)d caratteri (ne ha " "Assicurati che il nome del file abbia al massimo %(max)d caratteri (ne ha "
"%(length)d)." "%(length)d)."
#: taiga/base/api/fields.py:981 #: taiga/base/api/fields.py:981
@ -529,60 +531,60 @@ msgstr "E' richiesto un file di dump"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Formato di dump invalido" msgstr "Formato di dump invalido"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "Errore nell'importazione del progetto dati" msgstr "Errore nell'importazione del progetto dati"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "Errore nell'importazione della lista degli attributi di progetto" msgstr "Errore nell'importazione della lista degli attributi di progetto"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "" msgstr ""
"Errore nell'importazione dei valori predefiniti degli attributi del progetto." "Errore nell'importazione dei valori predefiniti degli attributi del progetto."
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "Errore nell'importazione degli attributi personalizzati" msgstr "Errore nell'importazione degli attributi personalizzati"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "Errore nell'importazione i ruoli" msgstr "Errore nell'importazione i ruoli"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "Errore nell'importazione delle iscrizioni" msgstr "Errore nell'importazione delle iscrizioni"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "errore nell'importazione degli sprints" msgstr "errore nell'importazione degli sprints"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "Errore nell'importazione delle pagine wiki" msgstr "Errore nell'importazione delle pagine wiki"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "Errore nell'importazione dei link di wiki" msgstr "Errore nell'importazione dei link di wiki"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "errore nell'importazione dei problemi" msgstr "errore nell'importazione dei problemi"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "Errore nell'importazione delle user story" msgstr "Errore nell'importazione delle user story"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "Errore nell'importazione dei compiti " msgstr "Errore nell'importazione dei compiti "
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "Errore nell'importazione dei tags" msgstr "Errore nell'importazione dei tags"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "Errore nell'importazione delle timelines" msgstr "Errore nell'importazione delle timelines"
@ -605,11 +607,11 @@ msgstr "Contiene campi personalizzati invalidi."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Il nome del progetto è duplicato" msgstr "Il nome del progetto è duplicato"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Errore nella creazione del dump di progetto" msgstr "Errore nella creazione del dump di progetto"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Errore nel caricamento del dump di progetto" msgstr "Errore nel caricamento del dump di progetto"
@ -915,11 +917,12 @@ msgstr "E' richiesta l'autenticazione"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "nome" msgstr "nome"
@ -935,7 +938,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "descrizione" msgstr "descrizione"
@ -973,7 +976,7 @@ msgstr "Commento"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -1006,7 +1009,7 @@ msgstr ""
"<p>%(comment)s</p>" "<p>%(comment)s</p>"
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Informazioni aggiuntive" msgstr "Informazioni aggiuntive"
@ -1460,17 +1463,17 @@ msgstr "L'ID di progetto non corrisponde tra oggetto e progetto"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "proprietario" msgstr "proprietario"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1489,7 +1492,7 @@ msgstr "ID dell'oggetto"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1509,10 +1512,10 @@ msgstr "non approvato"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "ordine" msgstr "ordine"
@ -1791,9 +1794,10 @@ msgid "Likes"
msgstr "Piaciuto" msgstr "Piaciuto"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "lumaca" msgstr "lumaca"
@ -1805,8 +1809,8 @@ msgstr "data stimata di inizio"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "data stimata di fine" msgstr "data stimata di fine"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "è concluso" msgstr "è concluso"
@ -1904,27 +1908,27 @@ msgstr "tappe totali"
msgid "total story points" msgid "total story points"
msgstr "punti totali della storia" msgstr "punti totali della storia"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "pannello di backlog attivo" msgstr "pannello di backlog attivo"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "pannello kanban attivo" msgstr "pannello kanban attivo"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "pannello wiki attivo" msgstr "pannello wiki attivo"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "pannello dei problemi attivo" msgstr "pannello dei problemi attivo"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "sistema di videoconferenza" msgstr "sistema di videoconferenza"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "ulteriori dati di videoconferenza " msgstr "ulteriori dati di videoconferenza "
@ -1940,7 +1944,7 @@ msgstr "permessi anonimi"
msgid "user permissions" msgid "user permissions"
msgstr "permessi dell'utente" msgstr "permessi dell'utente"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "è privato" msgstr "è privato"
@ -2001,67 +2005,67 @@ msgstr "attività nel mese"
msgid "activity last year" msgid "activity last year"
msgstr "attività nell'anno" msgstr "attività nell'anno"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "configurazione dei moduli" msgstr "configurazione dei moduli"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "è archivitato" msgstr "è archivitato"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "colore" msgstr "colore"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "limite dei lavori in corso" msgstr "limite dei lavori in corso"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "valore" msgstr "valore"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "ruolo proprietario predefinito" msgstr "ruolo proprietario predefinito"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "opzioni predefinite " msgstr "opzioni predefinite "
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "stati della storia utente" msgstr "stati della storia utente"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "punti" msgstr "punti"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "stati del compito" msgstr "stati del compito"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "stati del probema" msgstr "stati del probema"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "tipologie del problema" msgstr "tipologie del problema"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "priorità" msgstr "priorità"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "criticità " msgstr "criticità "
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "ruoli" msgstr "ruoli"
@ -3291,11 +3295,15 @@ msgid ""
"new project owner for \"%(project_name)s\".</p>\n" "new project owner for \"%(project_name)s\".</p>\n"
" " " "
msgstr "" msgstr ""
"\n"
"<p>Ciao %(old_owner_name)s,</p>\n"
"<p>%(new_owner_name)s ha accettato la tua offerta e diventerà il nuovo "
"proprietario del progetto \"%(project_name)s\".</p>"
#: taiga/projects/templates/emails/transfer_accept-body-html.jinja:10 #: taiga/projects/templates/emails/transfer_accept-body-html.jinja:10
#, python-format #, python-format
msgid "<p>%(new_owner_name)s says:</p>" msgid "<p>%(new_owner_name)s says:</p>"
msgstr "" msgstr "<p>%(new_owner_name)s dice:</p>"
#: taiga/projects/templates/emails/transfer_accept-body-html.jinja:14 #: taiga/projects/templates/emails/transfer_accept-body-html.jinja:14
msgid "" msgid ""
@ -3304,6 +3312,9 @@ msgid ""
"p>\n" "p>\n"
" " " "
msgstr "" msgstr ""
"\n"
"<p>Da adesso in avanti, il tuo nuovo status per questo progetto sarà \"admin"
"\".</p>"
#: taiga/projects/templates/emails/transfer_accept-body-text.jinja:1 #: taiga/projects/templates/emails/transfer_accept-body-text.jinja:1
#, python-format #, python-format
@ -3313,6 +3324,10 @@ msgid ""
"%(new_owner_name)s has accepted your offer and will become the new project " "%(new_owner_name)s has accepted your offer and will become the new project "
"owner for \"%(project_name)s\".\n" "owner for \"%(project_name)s\".\n"
msgstr "" msgstr ""
"\n"
"Ciao %(old_owner_name)s,\n"
"%(new_owner_name)s ha accettato la tua offerta e diventerà il nuovo "
"proprietario del progetto \"%(project_name)s\".\n"
#: taiga/projects/templates/emails/transfer_accept-body-text.jinja:7 #: taiga/projects/templates/emails/transfer_accept-body-text.jinja:7
#, python-format #, python-format
@ -3843,19 +3858,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Controlla le API della storie per la differenza esatta" msgstr "Controlla le API della storie per la differenza esatta"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Informazioni personali" msgstr "Informazioni personali"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Permessi" msgstr "Permessi"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Date importanti" msgstr "Date importanti"

View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/nl/)\n" "language/nl/)\n"
@ -518,59 +518,59 @@ msgstr "Dump file nodig"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Ongeldig dump formaat" msgstr "Ongeldig dump formaat"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "fout bij het importeren van project data" msgstr "fout bij het importeren van project data"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "fout bij importeren van project attributenlijst" msgstr "fout bij importeren van project attributenlijst"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "fout bij importeren van standaard projectattributen waarden" msgstr "fout bij importeren van standaard projectattributen waarden"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "fout bij importeren eigen attributen" msgstr "fout bij importeren eigen attributen"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "fout bij importeren rollen" msgstr "fout bij importeren rollen"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "fout bij importeren lidmaatschappen" msgstr "fout bij importeren lidmaatschappen"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "fout bij importeren sprints" msgstr "fout bij importeren sprints"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "fout bij importeren wiki pagina's" msgstr "fout bij importeren wiki pagina's"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "fout bij importeren wiki links" msgstr "fout bij importeren wiki links"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "fout bij importeren issues" msgstr "fout bij importeren issues"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "fout bij importeren user stories" msgstr "fout bij importeren user stories"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "fout bij importeren taken" msgstr "fout bij importeren taken"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "fout bij importeren tags" msgstr "fout bij importeren tags"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "fout bij importeren tijdlijnen" msgstr "fout bij importeren tijdlijnen"
@ -593,11 +593,11 @@ msgstr "Het bevat ongeldige eigen velden:"
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Naam gedupliceerd voor het project" msgstr "Naam gedupliceerd voor het project"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Fout bij genereren project dump" msgstr "Fout bij genereren project dump"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Fout bij laden project dump" msgstr "Fout bij laden project dump"
@ -778,11 +778,12 @@ msgstr ""
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "naam" msgstr "naam"
@ -798,7 +799,7 @@ msgstr ""
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "omschrijving" msgstr "omschrijving"
@ -836,7 +837,7 @@ msgstr "commentaar"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -870,7 +871,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Extra info" msgstr "Extra info"
@ -1260,17 +1261,17 @@ msgstr "Project ID van object is niet gelijk aan die van het project"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "eigenaar" msgstr "eigenaar"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1289,7 +1290,7 @@ msgstr "object id"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1309,10 +1310,10 @@ msgstr "is verouderd"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "volgorde" msgstr "volgorde"
@ -1593,9 +1594,10 @@ msgid "Likes"
msgstr "Personen die dit leuk vinden" msgstr "Personen die dit leuk vinden"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1607,8 +1609,8 @@ msgstr "geschatte start datum"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "geschatte datum van afwerking" msgstr "geschatte datum van afwerking"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "is gesloten" msgstr "is gesloten"
@ -1705,27 +1707,27 @@ msgstr "totaal van de milestones"
msgid "total story points" msgid "total story points"
msgstr "totaal story points" msgstr "totaal story points"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "actief backlog paneel" msgstr "actief backlog paneel"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "actief kanban paneel" msgstr "actief kanban paneel"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "actief wiki paneel" msgstr "actief wiki paneel"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "actief issues paneel" msgstr "actief issues paneel"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "videoconference systeem" msgstr "videoconference systeem"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "" msgstr ""
@ -1741,7 +1743,7 @@ msgstr "anonieme toestemmingen"
msgid "user permissions" msgid "user permissions"
msgstr "gebruikers toestemmingen" msgstr "gebruikers toestemmingen"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "is privé" msgstr "is privé"
@ -1802,67 +1804,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "module config" msgstr "module config"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "is gearchiveerd" msgstr "is gearchiveerd"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "kleur" msgstr "kleur"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "work in progress limiet" msgstr "work in progress limiet"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "waarde" msgstr "waarde"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "standaard rol eigenaar" msgstr "standaard rol eigenaar"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "standaard instellingen" msgstr "standaard instellingen"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "us statussen" msgstr "us statussen"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "punten" msgstr "punten"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "taak statussen" msgstr "taak statussen"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "issue statussen" msgstr "issue statussen"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "issue types" msgstr "issue types"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "prioriteiten" msgstr "prioriteiten"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "ernstniveaus" msgstr "ernstniveaus"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "rollen" msgstr "rollen"
@ -3240,19 +3242,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Persoonlijke info" msgstr "Persoonlijke info"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Toestemmingen" msgstr "Toestemmingen"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Belangrijke data" msgstr "Belangrijke data"

View File

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Polish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Polish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/pl/)\n" "language/pl/)\n"
@ -519,59 +519,59 @@ msgstr "Wymagany plik zrzutu"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Nieprawidłowy format zrzutu" msgstr "Nieprawidłowy format zrzutu"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "błąd w trakcie importu danych projektu" msgstr "błąd w trakcie importu danych projektu"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "błąd w trakcie importu atrybutów projektu" msgstr "błąd w trakcie importu atrybutów projektu"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "błąd w trakcie importu domyślnych atrybutów projektu" msgstr "błąd w trakcie importu domyślnych atrybutów projektu"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "błąd w trakcie importu niestandardowych atrybutów" msgstr "błąd w trakcie importu niestandardowych atrybutów"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "błąd w trakcie importu ról" msgstr "błąd w trakcie importu ról"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "błąd w trakcie importu członkostw" msgstr "błąd w trakcie importu członkostw"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "błąd w trakcie importu sprintów" msgstr "błąd w trakcie importu sprintów"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "błąd w trakcie importu stron Wiki" msgstr "błąd w trakcie importu stron Wiki"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "błąd w trakcie importu linków Wiki" msgstr "błąd w trakcie importu linków Wiki"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "błąd w trakcie importu zgłoszeń" msgstr "błąd w trakcie importu zgłoszeń"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "błąd w trakcie importu historyjek użytkownika" msgstr "błąd w trakcie importu historyjek użytkownika"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "błąd w trakcie importu zadań" msgstr "błąd w trakcie importu zadań"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "błąd w trakcie importu tagów" msgstr "błąd w trakcie importu tagów"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "błąd w trakcie importu osi czasu" msgstr "błąd w trakcie importu osi czasu"
@ -594,11 +594,11 @@ msgstr "Zawiera niewłaściwe pola niestandardowe."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Nazwa projektu zduplikowana" msgstr "Nazwa projektu zduplikowana"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Błąd w trakcie generowania zrzutu projektu" msgstr "Błąd w trakcie generowania zrzutu projektu"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Błąd w trakcie wczytywania zrzutu projektu" msgstr "Błąd w trakcie wczytywania zrzutu projektu"
@ -846,11 +846,12 @@ msgstr ""
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "nazwa" msgstr "nazwa"
@ -866,7 +867,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "opis" msgstr "opis"
@ -904,7 +905,7 @@ msgstr "komentarz"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -938,7 +939,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Dodatkowe info" msgstr "Dodatkowe info"
@ -1368,17 +1369,17 @@ msgstr "ID nie pasuje pomiędzy obiektem a projektem"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "właściciel" msgstr "właściciel"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1397,7 +1398,7 @@ msgstr "id obiektu"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1417,10 +1418,10 @@ msgstr "jest przestarzałe"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "kolejność" msgstr "kolejność"
@ -1699,9 +1700,10 @@ msgid "Likes"
msgstr "" msgstr ""
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1713,8 +1715,8 @@ msgstr "szacowana data rozpoczecia"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "szacowana data zakończenia" msgstr "szacowana data zakończenia"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "jest zamknięte" msgstr "jest zamknięte"
@ -1811,27 +1813,27 @@ msgstr "wszystkich kamieni milowych"
msgid "total story points" msgid "total story points"
msgstr "wszystkich punktów " msgstr "wszystkich punktów "
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "aktywny panel backlog" msgstr "aktywny panel backlog"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "aktywny panel Kanban" msgstr "aktywny panel Kanban"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "aktywny panel Wiki" msgstr "aktywny panel Wiki"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "aktywny panel zgłoszeń " msgstr "aktywny panel zgłoszeń "
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "system wideokonferencji" msgstr "system wideokonferencji"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "dodatkowe dane dla wideokonferencji" msgstr "dodatkowe dane dla wideokonferencji"
@ -1847,7 +1849,7 @@ msgstr "uprawnienia anonimowych"
msgid "user permissions" msgid "user permissions"
msgstr "uprawnienia użytkownika" msgstr "uprawnienia użytkownika"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "jest prywatna" msgstr "jest prywatna"
@ -1908,67 +1910,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "konfiguracja modułów" msgstr "konfiguracja modułów"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "zarchiwizowane" msgstr "zarchiwizowane"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "kolor" msgstr "kolor"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "limit postępu prac" msgstr "limit postępu prac"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "wartość" msgstr "wartość"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "domyśla rola właściciela" msgstr "domyśla rola właściciela"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "domyślne opcje" msgstr "domyślne opcje"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "statusy HU" msgstr "statusy HU"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "pinkty" msgstr "pinkty"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "statusy zadań" msgstr "statusy zadań"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "statusy zgłoszeń" msgstr "statusy zgłoszeń"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "typy zgłoszeń" msgstr "typy zgłoszeń"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "priorytety" msgstr "priorytety"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "ważność" msgstr "ważność"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "role" msgstr "role"
@ -3607,19 +3609,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Dla pełengo diffa sprawdź API historii" msgstr "Dla pełengo diffa sprawdź API historii"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Informacje osobiste" msgstr "Informacje osobiste"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Uprawnienia" msgstr "Uprawnienia"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Ważne daty" msgstr "Ważne daty"

View File

@ -19,8 +19,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/taiga-agile-llc/" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/taiga-agile-llc/"
"taiga-back/language/pt_BR/)\n" "taiga-back/language/pt_BR/)\n"
@ -527,59 +527,59 @@ msgstr "Necessário de arquivo de restauração"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Formato de aquivo de restauração inválido" msgstr "Formato de aquivo de restauração inválido"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "erro ao importar informações de projeto" msgstr "erro ao importar informações de projeto"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "erro importando lista de atributos do projeto" msgstr "erro importando lista de atributos do projeto"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "erro importando valores de atributos do projeto padrão" msgstr "erro importando valores de atributos do projeto padrão"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "erro importando atributos personalizados" msgstr "erro importando atributos personalizados"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "erro importando funcões" msgstr "erro importando funcões"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "erro importando filiações" msgstr "erro importando filiações"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "erro importando sprints" msgstr "erro importando sprints"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "erro importando páginas wiki" msgstr "erro importando páginas wiki"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "erro importando wiki links" msgstr "erro importando wiki links"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "erro importando casos" msgstr "erro importando casos"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "erro importando user stories" msgstr "erro importando user stories"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "erro importando tarefas" msgstr "erro importando tarefas"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "erro importando tags" msgstr "erro importando tags"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "erro importando linha do tempo" msgstr "erro importando linha do tempo"
@ -602,11 +602,11 @@ msgstr "Contém campos personalizados inválidos"
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Nome duplicado para o projeto" msgstr "Nome duplicado para o projeto"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Erro gerando arquivo de restauração do projeto" msgstr "Erro gerando arquivo de restauração do projeto"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Erro carregando arquivo de restauração do projeto" msgstr "Erro carregando arquivo de restauração do projeto"
@ -853,11 +853,12 @@ msgstr "Autenticação necessária"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "Nome" msgstr "Nome"
@ -873,7 +874,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "descrição" msgstr "descrição"
@ -911,7 +912,7 @@ msgstr "comentário"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -945,7 +946,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Informação extra" msgstr "Informação extra"
@ -1374,17 +1375,17 @@ msgstr "ID do projeto não combina entre objeto e projeto"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "dono" msgstr "dono"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1403,7 +1404,7 @@ msgstr "identidade de objeto"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1423,10 +1424,10 @@ msgstr "está obsoleto"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "ordem" msgstr "ordem"
@ -1705,9 +1706,10 @@ msgid "Likes"
msgstr "Curtidas" msgstr "Curtidas"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slug" msgstr "slug"
@ -1719,8 +1721,8 @@ msgstr "data de início estimada"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "data de encerramento estimada" msgstr "data de encerramento estimada"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "está fechado" msgstr "está fechado"
@ -1817,27 +1819,27 @@ msgstr "total de marcos de progresso"
msgid "total story points" msgid "total story points"
msgstr "pontos totais de US" msgstr "pontos totais de US"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "painel de backlog ativo" msgstr "painel de backlog ativo"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "painel de kanban ativo" msgstr "painel de kanban ativo"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "painel de wiki ativo" msgstr "painel de wiki ativo"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "painel de casos ativo" msgstr "painel de casos ativo"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "sistema de vídeo conferência" msgstr "sistema de vídeo conferência"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "informação extra de vídeo conferência" msgstr "informação extra de vídeo conferência"
@ -1853,7 +1855,7 @@ msgstr "permissão anônima"
msgid "user permissions" msgid "user permissions"
msgstr "permissão de usuário" msgstr "permissão de usuário"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "é privado" msgstr "é privado"
@ -1914,67 +1916,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "configurações de módulos" msgstr "configurações de módulos"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "está arquivado" msgstr "está arquivado"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "cor" msgstr "cor"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "trabalho no limite de progresso" msgstr "trabalho no limite de progresso"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "valor" msgstr "valor"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "função padrão para dono " msgstr "função padrão para dono "
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "opções padrão" msgstr "opções padrão"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "status de US" msgstr "status de US"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "pontos" msgstr "pontos"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "status de tarefa" msgstr "status de tarefa"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "status de casos" msgstr "status de casos"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "tipos de caso" msgstr "tipos de caso"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "prioridades" msgstr "prioridades"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "severidades" msgstr "severidades"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "funções" msgstr "funções"
@ -3588,19 +3590,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Verifique o histórico da API para a exata diferença" msgstr "Verifique o histórico da API para a exata diferença"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Informação pessoal" msgstr "Informação pessoal"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Permissões" msgstr "Permissões"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Datas importantes" msgstr "Datas importantes"

View File

@ -15,8 +15,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Russian (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Russian (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/ru/)\n" "language/ru/)\n"
@ -529,59 +529,59 @@ msgstr "Необходим дамп-файл"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Неправильный формат дампа" msgstr "Неправильный формат дампа"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "ошибка при импорте данных проекта" msgstr "ошибка при импорте данных проекта"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "ошибка при импорте списков свойств проекта" msgstr "ошибка при импорте списков свойств проекта"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "ошибка при импорте значений по умолчанию свойств проекта" msgstr "ошибка при импорте значений по умолчанию свойств проекта"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "ошибка при импорте пользовательских свойств" msgstr "ошибка при импорте пользовательских свойств"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "ошибка при импорте ролей" msgstr "ошибка при импорте ролей"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "ошибка при импорте членства" msgstr "ошибка при импорте членства"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "ошибка при импорте спринтов" msgstr "ошибка при импорте спринтов"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "ошибка при импорте вики-страниц" msgstr "ошибка при импорте вики-страниц"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "ошибка при импорте вики-ссылок" msgstr "ошибка при импорте вики-ссылок"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "ошибка при импорте запросов" msgstr "ошибка при импорте запросов"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "ошибка импорта историй от пользователей" msgstr "ошибка импорта историй от пользователей"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "ошибка импорта задач" msgstr "ошибка импорта задач"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "ошибка импорта тэгов" msgstr "ошибка импорта тэгов"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "ошибка импорта хронологии проекта" msgstr "ошибка импорта хронологии проекта"
@ -604,11 +604,11 @@ msgstr "Содержит неверные специальные поля"
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Уже есть такое имя для проекта" msgstr "Уже есть такое имя для проекта"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Ошибка создания свалочного файла для проекта" msgstr "Ошибка создания свалочного файла для проекта"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Ошибка загрузки свалочного файла проекта" msgstr "Ошибка загрузки свалочного файла проекта"
@ -853,11 +853,12 @@ msgstr "Необходима аутентификация"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "имя" msgstr "имя"
@ -873,7 +874,7 @@ msgstr "веб"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "описание" msgstr "описание"
@ -911,7 +912,7 @@ msgstr "комментарий"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -945,7 +946,7 @@ msgstr ""
" " " "
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Дополнительное инфо" msgstr "Дополнительное инфо"
@ -1375,17 +1376,17 @@ msgstr "Идентификатор проекта не подходит к эт
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "владелец" msgstr "владелец"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1404,7 +1405,7 @@ msgstr "идентификатор объекта"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1424,10 +1425,10 @@ msgstr "устаревшее"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "порядок" msgstr "порядок"
@ -1710,9 +1711,10 @@ msgid "Likes"
msgstr "Лайки" msgstr "Лайки"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "ссылочное имя" msgstr "ссылочное имя"
@ -1724,8 +1726,8 @@ msgstr "предполагаемая дата начала"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "предполагаемая дата завершения" msgstr "предполагаемая дата завершения"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "закрыто" msgstr "закрыто"
@ -1824,27 +1826,27 @@ msgstr "общее количество вех"
msgid "total story points" msgid "total story points"
msgstr "очки истории" msgstr "очки истории"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "активная панель списка задач" msgstr "активная панель списка задач"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "активная панель kanban" msgstr "активная панель kanban"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "активная wiki-панель" msgstr "активная wiki-панель"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "панель активных запросов" msgstr "панель активных запросов"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "система видеоконференций" msgstr "система видеоконференций"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "дополнительные данные системы видеоконференций" msgstr "дополнительные данные системы видеоконференций"
@ -1860,7 +1862,7 @@ msgstr "права анонимов"
msgid "user permissions" msgid "user permissions"
msgstr "права пользователя" msgstr "права пользователя"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "личное" msgstr "личное"
@ -1921,67 +1923,67 @@ msgstr "активность за месяц"
msgid "activity last year" msgid "activity last year"
msgstr "активность за год" msgstr "активность за год"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "конфигурация модулей" msgstr "конфигурация модулей"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "архивировано" msgstr "архивировано"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "цвет" msgstr "цвет"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "ограничение на активную работу" msgstr "ограничение на активную работу"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "значение" msgstr "значение"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "роль владельца по умолчанию" msgstr "роль владельца по умолчанию"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "параметры по умолчанию" msgstr "параметры по умолчанию"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "статусы ПИ" msgstr "статусы ПИ"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "очки" msgstr "очки"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "статусы задач" msgstr "статусы задач"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "статусы запросов" msgstr "статусы запросов"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "типы запросов" msgstr "типы запросов"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "приоритеты" msgstr "приоритеты"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "степени важности" msgstr "степени важности"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "роли" msgstr "роли"
@ -3609,19 +3611,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Свертесть с историей API для получения изменений" msgstr "Свертесть с историей API для получения изменений"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Личные данные" msgstr "Личные данные"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Права доступа" msgstr "Права доступа"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Важные даты" msgstr "Важные даты"

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Swedish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Swedish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/sv/)\n" "language/sv/)\n"
@ -503,59 +503,59 @@ msgstr "Behöver en hämtningsfil"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Invalid hämtningsfilformat" msgstr "Invalid hämtningsfilformat"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "fel vid import av projektdata" msgstr "fel vid import av projektdata"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "fel vid import av en lista på projektegenskaper" msgstr "fel vid import av en lista på projektegenskaper"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "fel vid import av standard projektegenskapsvärden" msgstr "fel vid import av standard projektegenskapsvärden"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "fel vid import av anpassade egenskaper" msgstr "fel vid import av anpassade egenskaper"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "fel vid importering av roller" msgstr "fel vid importering av roller"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "fel vid import av medlemskap" msgstr "fel vid import av medlemskap"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "felaktig import av sprintar" msgstr "felaktig import av sprintar"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "vel vid import av wiki-sidor" msgstr "vel vid import av wiki-sidor"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "fel vid import av wiki-länkar" msgstr "fel vid import av wiki-länkar"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "fel vid import av ärenden" msgstr "fel vid import av ärenden"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "fel vid import av användarhistorier" msgstr "fel vid import av användarhistorier"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "fel vid import av uppgifter" msgstr "fel vid import av uppgifter"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "fel vid importering av taggar" msgstr "fel vid importering av taggar"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "fel vid importering av tidslinje" msgstr "fel vid importering av tidslinje"
@ -578,11 +578,11 @@ msgstr "Innehåller felaktigt anpassad fält."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Namnet är upprepad för projektet" msgstr "Namnet är upprepad för projektet"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Fel vid skapandet av projektkopia" msgstr "Fel vid skapandet av projektkopia"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Feil vid hämtning av projektkopia" msgstr "Feil vid hämtning av projektkopia"
@ -741,11 +741,12 @@ msgstr "Verifiering krävs"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "namn" msgstr "namn"
@ -761,7 +762,7 @@ msgstr "Internet"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "beskrivning" msgstr "beskrivning"
@ -799,7 +800,7 @@ msgstr "kommentera"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -825,7 +826,7 @@ msgid ""
msgstr "" msgstr ""
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Extra information" msgstr "Extra information"
@ -1215,17 +1216,17 @@ msgstr "Projekt-ID stämmer inte mellan objekt och projekt"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "ägare" msgstr "ägare"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1244,7 +1245,7 @@ msgstr "objekt-ID"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1264,10 +1265,10 @@ msgstr "undviks"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "sortera" msgstr "sortera"
@ -1546,9 +1547,10 @@ msgid "Likes"
msgstr "Gillar" msgstr "Gillar"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "slugg" msgstr "slugg"
@ -1560,8 +1562,8 @@ msgstr "Beräknad startdatum"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "Beräknad slutdato" msgstr "Beräknad slutdato"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "är stängd" msgstr "är stängd"
@ -1658,27 +1660,27 @@ msgstr "totalt antal milstolpar"
msgid "total story points" msgid "total story points"
msgstr "totalt antal historiepoäng" msgstr "totalt antal historiepoäng"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "aktivt panel för inkorg" msgstr "aktivt panel för inkorg"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "aktiv kanban-panel" msgstr "aktiv kanban-panel"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "aktiv wiki-panel" msgstr "aktiv wiki-panel"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "aktiv panel för ärenden" msgstr "aktiv panel för ärenden"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "videokonferensssystem" msgstr "videokonferensssystem"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "videokonferens - extra data" msgstr "videokonferens - extra data"
@ -1694,7 +1696,7 @@ msgstr "anonyma rättigheter"
msgid "user permissions" msgid "user permissions"
msgstr "användarbehörigheter" msgstr "användarbehörigheter"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "är privat" msgstr "är privat"
@ -1755,67 +1757,67 @@ msgstr ""
msgid "activity last year" msgid "activity last year"
msgstr "" msgstr ""
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "konfigurera moduler" msgstr "konfigurera moduler"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "är arkiverad" msgstr "är arkiverad"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "färg" msgstr "färg"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "begränsad arbete pågår" msgstr "begränsad arbete pågår"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "värde" msgstr "värde"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "ägarens standardroll" msgstr "ägarens standardroll"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "standard val" msgstr "standard val"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "US statuser" msgstr "US statuser"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "poäng" msgstr "poäng"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "statuser för uppgifter" msgstr "statuser för uppgifter"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "status för ärenden" msgstr "status för ärenden"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "ärendentyper" msgstr "ärendentyper"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "prioriteter" msgstr "prioriteter"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "allvarsgrad" msgstr "allvarsgrad"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "roller" msgstr "roller"
@ -3152,19 +3154,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "Kolla historie API för exakt skillnad" msgstr "Kolla historie API för exakt skillnad"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Personalinformation" msgstr "Personalinformation"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "Behörigheter" msgstr "Behörigheter"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Viktiga datum" msgstr "Viktiga datum"

View File

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Turkish (http://www.transifex.com/taiga-agile-llc/taiga-back/" "Language-Team: Turkish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/tr/)\n" "language/tr/)\n"
@ -513,59 +513,59 @@ msgstr "İhtiyaç duyulan döküm dosyası"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "Geçersiz döküm biçemi" msgstr "Geçersiz döküm biçemi"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "İçeri aktarılan proje verisinde hata" msgstr "İçeri aktarılan proje verisinde hata"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "proje öznitelikleri listesi içeriye aktarılırken hata oluştu" msgstr "proje öznitelikleri listesi içeriye aktarılırken hata oluştu"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "varsayılan proje öznitelikleri değerlerinin içeriye aktarımında hata" msgstr "varsayılan proje öznitelikleri değerlerinin içeriye aktarımında hata"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "özel öznitelikler içeri aktarılırken hata" msgstr "özel öznitelikler içeri aktarılırken hata"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "İçeri aktarılan rollerde hata" msgstr "İçeri aktarılan rollerde hata"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "İçeri aktarılan üyeliklerde hata" msgstr "İçeri aktarılan üyeliklerde hata"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "İçeri aktarılan sprintlerde hata" msgstr "İçeri aktarılan sprintlerde hata"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "İçeri aktarılan wiki sayfalarında hata" msgstr "İçeri aktarılan wiki sayfalarında hata"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "İçeri aktarılan wiki bağlantılarında hata" msgstr "İçeri aktarılan wiki bağlantılarında hata"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "İçeri aktarılan taleplerde hata" msgstr "İçeri aktarılan taleplerde hata"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "İçeri aktarılan kullanıcı hikayelerinde hata" msgstr "İçeri aktarılan kullanıcı hikayelerinde hata"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "İçeri aktarılan görevlerde hata" msgstr "İçeri aktarılan görevlerde hata"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "İçeri aktarılan etiketlerde hata" msgstr "İçeri aktarılan etiketlerde hata"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "zaman çizelgesi içeri aktarılırken hata" msgstr "zaman çizelgesi içeri aktarılırken hata"
@ -588,11 +588,11 @@ msgstr "Geçersiz özel alanlar içeriyor."
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "Aynı isimde proje bulunmakta" msgstr "Aynı isimde proje bulunmakta"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "Proje dökümü oluşturulurken hata" msgstr "Proje dökümü oluşturulurken hata"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "Proje dökümü yükleniyorken hata" msgstr "Proje dökümü yükleniyorken hata"
@ -836,11 +836,12 @@ msgstr "Kimlik doğrulama gerekli"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "isim" msgstr "isim"
@ -856,7 +857,7 @@ msgstr "web"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "tanı" msgstr "tanı"
@ -894,7 +895,7 @@ msgstr "yorum"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -926,7 +927,7 @@ msgstr ""
"<p>%(comment)s</p>" "<p>%(comment)s</p>"
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "Ekstra bilgi" msgstr "Ekstra bilgi"
@ -1322,17 +1323,17 @@ msgstr "Proje ve nesne arasında Proje ID uyuşmazlığı mevcut"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "sahip" msgstr "sahip"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1351,7 +1352,7 @@ msgstr "nesne id"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1371,10 +1372,10 @@ msgstr "kaldırıldı"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "sıra" msgstr "sıra"
@ -1653,9 +1654,10 @@ msgid "Likes"
msgstr "Beğeniler" msgstr "Beğeniler"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "satır" msgstr "satır"
@ -1667,8 +1669,8 @@ msgstr "yaklaşık başlama tarihi"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "yaklaşık bitiş tarihi" msgstr "yaklaşık bitiş tarihi"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "kapatılmış" msgstr "kapatılmış"
@ -1765,27 +1767,27 @@ msgstr "aşamaların toplamı"
msgid "total story points" msgid "total story points"
msgstr "toplam hikaye puanı" msgstr "toplam hikaye puanı"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "aktif birikmiş iler paneli" msgstr "aktif birikmiş iler paneli"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "aktif kanban paneli" msgstr "aktif kanban paneli"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "aktif wiki paneli" msgstr "aktif wiki paneli"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "aktif talep paneli" msgstr "aktif talep paneli"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "video konferans sistemi" msgstr "video konferans sistemi"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "videokonferans ekstra verisi" msgstr "videokonferans ekstra verisi"
@ -1801,7 +1803,7 @@ msgstr "anonim izinler"
msgid "user permissions" msgid "user permissions"
msgstr "kullanıcı izinleri" msgstr "kullanıcı izinleri"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "gizli" msgstr "gizli"
@ -1862,67 +1864,67 @@ msgstr "geçen ayın aktiviteleri"
msgid "activity last year" msgid "activity last year"
msgstr "geçen yılın aktiviteleri" msgstr "geçen yılın aktiviteleri"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "modül ayarları" msgstr "modül ayarları"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "arşivlenmiş" msgstr "arşivlenmiş"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "renk" msgstr "renk"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "" msgstr ""
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "değer" msgstr "değer"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "varsayılan sahip rolü" msgstr "varsayılan sahip rolü"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "varsayılan ayarlar" msgstr "varsayılan ayarlar"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "kh durumları" msgstr "kh durumları"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "puanlar" msgstr "puanlar"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "görev durumları" msgstr "görev durumları"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "talep durumları" msgstr "talep durumları"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "talep tipleri" msgstr "talep tipleri"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "öncelikler" msgstr "öncelikler"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "önem durumları" msgstr "önem durumları"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "roller" msgstr "roller"
@ -3324,19 +3326,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "" msgstr ""
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "Kişisel bilgi" msgstr "Kişisel bilgi"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "İzinler" msgstr "İzinler"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "Önemli tarihler" msgstr "Önemli tarihler"

View File

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: taiga-back\n" "Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-08 13:23+0200\n" "POT-Creation-Date: 2016-04-19 16:00+0200\n"
"PO-Revision-Date: 2016-04-08 11:23+0000\n" "PO-Revision-Date: 2016-04-19 14:00+0000\n"
"Last-Translator: Taiga Dev Team <support@taiga.io>\n" "Last-Translator: Taiga Dev Team <support@taiga.io>\n"
"Language-Team: Chinese Traditional (http://www.transifex.com/taiga-agile-llc/" "Language-Team: Chinese Traditional (http://www.transifex.com/taiga-agile-llc/"
"taiga-back/language/zh-Hant/)\n" "taiga-back/language/zh-Hant/)\n"
@ -510,59 +510,59 @@ msgstr "需要的堆存檔案"
msgid "Invalid dump format" msgid "Invalid dump format"
msgstr "無效堆存格式" msgstr "無效堆存格式"
#: taiga/export_import/dump_service.py:115 #: taiga/export_import/dump_service.py:112
msgid "error importing project data" msgid "error importing project data"
msgstr "滙入重要專案資料出錯" msgstr "滙入重要專案資料出錯"
#: taiga/export_import/dump_service.py:128 #: taiga/export_import/dump_service.py:125
msgid "error importing lists of project attributes" msgid "error importing lists of project attributes"
msgstr "滙入標籤出錯" msgstr "滙入標籤出錯"
#: taiga/export_import/dump_service.py:133 #: taiga/export_import/dump_service.py:130
msgid "error importing default project attributes values" msgid "error importing default project attributes values"
msgstr "滙入預設專案屬性數值出錯" msgstr "滙入預設專案屬性數值出錯"
#: taiga/export_import/dump_service.py:143 #: taiga/export_import/dump_service.py:140
msgid "error importing custom attributes" msgid "error importing custom attributes"
msgstr "滙入客制性屬出錯" msgstr "滙入客制性屬出錯"
#: taiga/export_import/dump_service.py:148 #: taiga/export_import/dump_service.py:145
msgid "error importing roles" msgid "error importing roles"
msgstr "滙入角色出錯" msgstr "滙入角色出錯"
#: taiga/export_import/dump_service.py:163 #: taiga/export_import/dump_service.py:160
msgid "error importing memberships" msgid "error importing memberships"
msgstr "滙入成員資格出錯" msgstr "滙入成員資格出錯"
#: taiga/export_import/dump_service.py:168 #: taiga/export_import/dump_service.py:165
msgid "error importing sprints" msgid "error importing sprints"
msgstr "滙入衝刺任務出錯" msgstr "滙入衝刺任務出錯"
#: taiga/export_import/dump_service.py:173 #: taiga/export_import/dump_service.py:170
msgid "error importing wiki pages" msgid "error importing wiki pages"
msgstr "滙入維基頁出錯" msgstr "滙入維基頁出錯"
#: taiga/export_import/dump_service.py:178 #: taiga/export_import/dump_service.py:175
msgid "error importing wiki links" msgid "error importing wiki links"
msgstr "滙入維基連結出錯" msgstr "滙入維基連結出錯"
#: taiga/export_import/dump_service.py:183 #: taiga/export_import/dump_service.py:180
msgid "error importing issues" msgid "error importing issues"
msgstr "滙入問題出錯" msgstr "滙入問題出錯"
#: taiga/export_import/dump_service.py:188 #: taiga/export_import/dump_service.py:185
msgid "error importing user stories" msgid "error importing user stories"
msgstr "滙入使用者故事出錯" msgstr "滙入使用者故事出錯"
#: taiga/export_import/dump_service.py:193 #: taiga/export_import/dump_service.py:190
msgid "error importing tasks" msgid "error importing tasks"
msgstr "滙入任務出錯" msgstr "滙入任務出錯"
#: taiga/export_import/dump_service.py:198 #: taiga/export_import/dump_service.py:195
msgid "error importing tags" msgid "error importing tags"
msgstr "滙入標籤出錯" msgstr "滙入標籤出錯"
#: taiga/export_import/dump_service.py:202 #: taiga/export_import/dump_service.py:199
msgid "error importing timelines" msgid "error importing timelines"
msgstr "滙入時間軸出錯" msgstr "滙入時間軸出錯"
@ -585,11 +585,11 @@ msgstr "包括無效慣例欄位"
msgid "Name duplicated for the project" msgid "Name duplicated for the project"
msgstr "專案的名稱被複製了" msgstr "專案的名稱被複製了"
#: taiga/export_import/tasks.py:54 taiga/export_import/tasks.py:55 #: taiga/export_import/tasks.py:55 taiga/export_import/tasks.py:56
msgid "Error generating project dump" msgid "Error generating project dump"
msgstr "產生專案傾倒時出錯" msgstr "產生專案傾倒時出錯"
#: taiga/export_import/tasks.py:86 taiga/export_import/tasks.py:87 #: taiga/export_import/tasks.py:88 taiga/export_import/tasks.py:89
msgid "Error loading project dump" msgid "Error loading project dump"
msgstr "載入專案傾倒時出錯" msgstr "載入專案傾倒時出錯"
@ -833,11 +833,12 @@ msgstr "要求取得授權"
#: taiga/external_apps/models.py:34 #: taiga/external_apps/models.py:34
#: taiga/projects/custom_attributes/models.py:35 #: taiga/projects/custom_attributes/models.py:35
#: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146 #: taiga/projects/milestones/models.py:38 taiga/projects/models.py:146
#: taiga/projects/models.py:472 taiga/projects/models.py:511 #: taiga/projects/models.py:478 taiga/projects/models.py:517
#: taiga/projects/models.py:536 taiga/projects/models.py:573 #: taiga/projects/models.py:542 taiga/projects/models.py:579
#: taiga/projects/models.py:596 taiga/projects/models.py:619 #: taiga/projects/models.py:602 taiga/projects/models.py:625
#: taiga/projects/models.py:654 taiga/projects/models.py:677 #: taiga/projects/models.py:660 taiga/projects/models.py:683
#: taiga/users/models.py:292 taiga/webhooks/models.py:28 #: taiga/users/admin.py:53 taiga/users/models.py:292
#: taiga/webhooks/models.py:28
msgid "name" msgid "name"
msgstr "姓名" msgstr "姓名"
@ -853,7 +854,7 @@ msgstr "網頁"
#: taiga/projects/custom_attributes/models.py:36 #: taiga/projects/custom_attributes/models.py:36
#: taiga/projects/history/templatetags/functions.py:24 #: taiga/projects/history/templatetags/functions.py:24
#: taiga/projects/issues/models.py:62 taiga/projects/models.py:150 #: taiga/projects/issues/models.py:62 taiga/projects/models.py:150
#: taiga/projects/models.py:681 taiga/projects/tasks/models.py:61 #: taiga/projects/models.py:687 taiga/projects/tasks/models.py:61
#: taiga/projects/userstories/models.py:92 #: taiga/projects/userstories/models.py:92
msgid "description" msgid "description"
msgstr "描述" msgstr "描述"
@ -891,7 +892,7 @@ msgstr "評論"
#: taiga/projects/custom_attributes/models.py:45 #: taiga/projects/custom_attributes/models.py:45
#: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32 #: taiga/projects/issues/models.py:54 taiga/projects/likes/models.py:32
#: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157 #: taiga/projects/milestones/models.py:49 taiga/projects/models.py:157
#: taiga/projects/models.py:683 taiga/projects/notifications/models.py:88 #: taiga/projects/models.py:689 taiga/projects/notifications/models.py:88
#: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84 #: taiga/projects/tasks/models.py:47 taiga/projects/userstories/models.py:84
#: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40 #: taiga/projects/votes/models.py:53 taiga/projects/wiki/models.py:40
#: taiga/userstorage/models.py:28 #: taiga/userstorage/models.py:28
@ -923,7 +924,7 @@ msgstr ""
"<p>%(comment)s</p>" "<p>%(comment)s</p>"
#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18 #: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
#: taiga/users/admin.py:52 #: taiga/users/admin.py:120
msgid "Extra info" msgid "Extra info"
msgstr "額外資訊" msgstr "額外資訊"
@ -1348,17 +1349,17 @@ msgstr "專案ID不符合物件與專案"
#: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162 #: taiga/projects/milestones/models.py:43 taiga/projects/models.py:162
#: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38 #: taiga/projects/notifications/models.py:61 taiga/projects/tasks/models.py:38
#: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36 #: taiga/projects/userstories/models.py:66 taiga/projects/wiki/models.py:36
#: taiga/userstorage/models.py:26 #: taiga/users/admin.py:69 taiga/userstorage/models.py:26
msgid "owner" msgid "owner"
msgstr "所有者" msgstr "所有者"
#: taiga/projects/attachments/models.py:40 #: taiga/projects/attachments/models.py:40
#: taiga/projects/custom_attributes/models.py:42 #: taiga/projects/custom_attributes/models.py:42
#: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45 #: taiga/projects/issues/models.py:52 taiga/projects/milestones/models.py:45
#: taiga/projects/models.py:460 taiga/projects/models.py:486 #: taiga/projects/models.py:466 taiga/projects/models.py:492
#: taiga/projects/models.py:517 taiga/projects/models.py:546 #: taiga/projects/models.py:523 taiga/projects/models.py:552
#: taiga/projects/models.py:579 taiga/projects/models.py:602 #: taiga/projects/models.py:585 taiga/projects/models.py:608
#: taiga/projects/models.py:629 taiga/projects/models.py:660 #: taiga/projects/models.py:635 taiga/projects/models.py:666
#: taiga/projects/notifications/models.py:73 #: taiga/projects/notifications/models.py:73
#: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42 #: taiga/projects/notifications/models.py:90 taiga/projects/tasks/models.py:42
#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30 #: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:30
@ -1377,7 +1378,7 @@ msgstr "物件ID"
#: taiga/projects/attachments/models.py:50 #: taiga/projects/attachments/models.py:50
#: taiga/projects/custom_attributes/models.py:47 #: taiga/projects/custom_attributes/models.py:47
#: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52 #: taiga/projects/issues/models.py:57 taiga/projects/milestones/models.py:52
#: taiga/projects/models.py:160 taiga/projects/models.py:686 #: taiga/projects/models.py:160 taiga/projects/models.py:692
#: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87 #: taiga/projects/tasks/models.py:50 taiga/projects/userstories/models.py:87
#: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30 #: taiga/projects/wiki/models.py:43 taiga/userstorage/models.py:30
msgid "modified date" msgid "modified date"
@ -1397,10 +1398,10 @@ msgstr "棄用"
#: taiga/projects/attachments/models.py:61 #: taiga/projects/attachments/models.py:61
#: taiga/projects/custom_attributes/models.py:40 #: taiga/projects/custom_attributes/models.py:40
#: taiga/projects/milestones/models.py:58 taiga/projects/models.py:476 #: taiga/projects/milestones/models.py:58 taiga/projects/models.py:482
#: taiga/projects/models.py:513 taiga/projects/models.py:540 #: taiga/projects/models.py:519 taiga/projects/models.py:546
#: taiga/projects/models.py:575 taiga/projects/models.py:598 #: taiga/projects/models.py:581 taiga/projects/models.py:604
#: taiga/projects/models.py:623 taiga/projects/models.py:656 #: taiga/projects/models.py:629 taiga/projects/models.py:662
#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300 #: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order" msgid "order"
msgstr "次序" msgstr "次序"
@ -1679,9 +1680,10 @@ msgid "Likes"
msgstr "喜歡" msgstr "喜歡"
#: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148 #: taiga/projects/milestones/models.py:41 taiga/projects/models.py:148
#: taiga/projects/models.py:474 taiga/projects/models.py:538 #: taiga/projects/models.py:480 taiga/projects/models.py:544
#: taiga/projects/models.py:621 taiga/projects/models.py:679 #: taiga/projects/models.py:627 taiga/projects/models.py:685
#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294 #: taiga/projects/wiki/models.py:32 taiga/users/admin.py:57
#: taiga/users/models.py:294
msgid "slug" msgid "slug"
msgstr "代稱" msgstr "代稱"
@ -1693,8 +1695,8 @@ msgstr "预計開始日期"
msgid "estimated finish date" msgid "estimated finish date"
msgstr "預計完成日期" msgstr "預計完成日期"
#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:478 #: taiga/projects/milestones/models.py:54 taiga/projects/models.py:484
#: taiga/projects/models.py:542 taiga/projects/models.py:625 #: taiga/projects/models.py:548 taiga/projects/models.py:631
msgid "is closed" msgid "is closed"
msgstr "被關閉" msgstr "被關閉"
@ -1791,27 +1793,27 @@ msgstr "全部里程碑"
msgid "total story points" msgid "total story points"
msgstr "全部故事點數" msgstr "全部故事點數"
#: taiga/projects/models.py:171 taiga/projects/models.py:692 #: taiga/projects/models.py:171 taiga/projects/models.py:698
msgid "active backlog panel" msgid "active backlog panel"
msgstr "活躍的待辦任務優先表面板" msgstr "活躍的待辦任務優先表面板"
#: taiga/projects/models.py:173 taiga/projects/models.py:694 #: taiga/projects/models.py:173 taiga/projects/models.py:700
msgid "active kanban panel" msgid "active kanban panel"
msgstr "活躍的看板式面板" msgstr "活躍的看板式面板"
#: taiga/projects/models.py:175 taiga/projects/models.py:696 #: taiga/projects/models.py:175 taiga/projects/models.py:702
msgid "active wiki panel" msgid "active wiki panel"
msgstr "活躍的維基面板" msgstr "活躍的維基面板"
#: taiga/projects/models.py:177 taiga/projects/models.py:698 #: taiga/projects/models.py:177 taiga/projects/models.py:704
msgid "active issues panel" msgid "active issues panel"
msgstr "活躍的問題面板" msgstr "活躍的問題面板"
#: taiga/projects/models.py:180 taiga/projects/models.py:701 #: taiga/projects/models.py:180 taiga/projects/models.py:707
msgid "videoconference system" msgid "videoconference system"
msgstr "視訊會議系統" msgstr "視訊會議系統"
#: taiga/projects/models.py:182 taiga/projects/models.py:703 #: taiga/projects/models.py:182 taiga/projects/models.py:709
msgid "videoconference extra data" msgid "videoconference extra data"
msgstr "視訊會議額外資料" msgstr "視訊會議額外資料"
@ -1827,7 +1829,7 @@ msgstr "匿名權限"
msgid "user permissions" msgid "user permissions"
msgstr "使用者權限" msgstr "使用者權限"
#: taiga/projects/models.py:198 #: taiga/projects/models.py:198 taiga/users/admin.py:61
msgid "is private" msgid "is private"
msgstr "私密" msgstr "私密"
@ -1888,67 +1890,67 @@ msgstr "上月活躍成員"
msgid "activity last year" msgid "activity last year"
msgstr "去年活躍成員" msgstr "去年活躍成員"
#: taiga/projects/models.py:461 #: taiga/projects/models.py:467
msgid "modules config" msgid "modules config"
msgstr "模組設定" msgstr "模組設定"
#: taiga/projects/models.py:480 #: taiga/projects/models.py:486
msgid "is archived" msgid "is archived"
msgstr "已歸檔" msgstr "已歸檔"
#: taiga/projects/models.py:482 taiga/projects/models.py:544 #: taiga/projects/models.py:488 taiga/projects/models.py:550
#: taiga/projects/models.py:577 taiga/projects/models.py:600 #: taiga/projects/models.py:583 taiga/projects/models.py:606
#: taiga/projects/models.py:627 taiga/projects/models.py:658 #: taiga/projects/models.py:633 taiga/projects/models.py:664
#: taiga/users/models.py:140 #: taiga/users/models.py:140
msgid "color" msgid "color"
msgstr "顏色" msgstr "顏色"
#: taiga/projects/models.py:484 #: taiga/projects/models.py:490
msgid "work in progress limit" msgid "work in progress limit"
msgstr "工作進度限制" msgstr "工作進度限制"
#: taiga/projects/models.py:515 taiga/userstorage/models.py:32 #: taiga/projects/models.py:521 taiga/userstorage/models.py:32
msgid "value" msgid "value"
msgstr "價值" msgstr "價值"
#: taiga/projects/models.py:689 #: taiga/projects/models.py:695
msgid "default owner's role" msgid "default owner's role"
msgstr "預設所有者角色" msgstr "預設所有者角色"
#: taiga/projects/models.py:705 #: taiga/projects/models.py:711
msgid "default options" msgid "default options"
msgstr "預設選項" msgstr "預設選項"
#: taiga/projects/models.py:706 #: taiga/projects/models.py:712
msgid "us statuses" msgid "us statuses"
msgstr "我們狀況" msgstr "我們狀況"
#: taiga/projects/models.py:707 taiga/projects/userstories/models.py:42 #: taiga/projects/models.py:713 taiga/projects/userstories/models.py:42
#: taiga/projects/userstories/models.py:74 #: taiga/projects/userstories/models.py:74
msgid "points" msgid "points"
msgstr "點數" msgstr "點數"
#: taiga/projects/models.py:708 #: taiga/projects/models.py:714
msgid "task statuses" msgid "task statuses"
msgstr "任務狀況" msgstr "任務狀況"
#: taiga/projects/models.py:709 #: taiga/projects/models.py:715
msgid "issue statuses" msgid "issue statuses"
msgstr "問題狀況" msgstr "問題狀況"
#: taiga/projects/models.py:710 #: taiga/projects/models.py:716
msgid "issue types" msgid "issue types"
msgstr "問題類型" msgstr "問題類型"
#: taiga/projects/models.py:711 #: taiga/projects/models.py:717
msgid "priorities" msgid "priorities"
msgstr "優先性" msgstr "優先性"
#: taiga/projects/models.py:712 #: taiga/projects/models.py:718
msgid "severities" msgid "severities"
msgstr "嚴重性" msgstr "嚴重性"
#: taiga/projects/models.py:713 #: taiga/projects/models.py:719
msgid "roles" msgid "roles"
msgstr "角色" msgstr "角色"
@ -3564,19 +3566,39 @@ msgstr "href"
msgid "Check the history API for the exact diff" msgid "Check the history API for the exact diff"
msgstr "檢查API過去資料以找出差異" msgstr "檢查API過去資料以找出差異"
#: taiga/users/admin.py:51 #: taiga/users/admin.py:38
msgid "Project Member"
msgstr ""
#: taiga/users/admin.py:39
msgid "Project Members"
msgstr ""
#: taiga/users/admin.py:49
msgid "id"
msgstr ""
#: taiga/users/admin.py:81
msgid "Project Ownership"
msgstr ""
#: taiga/users/admin.py:82
msgid "Project Ownerships"
msgstr ""
#: taiga/users/admin.py:119
msgid "Personal info" msgid "Personal info"
msgstr "個人資訊" msgstr "個人資訊"
#: taiga/users/admin.py:54 #: taiga/users/admin.py:122
msgid "Permissions" msgid "Permissions"
msgstr "許可" msgstr "許可"
#: taiga/users/admin.py:55 #: taiga/users/admin.py:123
msgid "Restrictions" msgid "Restrictions"
msgstr "" msgstr ""
#: taiga/users/admin.py:57 #: taiga/users/admin.py:125
msgid "Important dates" msgid "Important dates"
msgstr "重要日期" msgstr "重要日期"

View File

@ -40,6 +40,10 @@ class DiscoverModeFilterBackend(FilterBackend):
qs = qs.filter(anon_permissions__contains=["view_project"], qs = qs.filter(anon_permissions__contains=["view_project"],
blocked_code__isnull=True) blocked_code__isnull=True)
# random order for featured projects
if request.QUERY_PARAMS.get("is_featured", None) == 'true':
qs = qs.order_by("?")
return super().filter_queryset(request, qs.distinct(), view) return super().filter_queryset(request, qs.distinct(), view)

View File

@ -84,12 +84,11 @@ def update_issues_order_in_bulk(bulk_data):
def issues_to_csv(project, queryset): def issues_to_csv(project, queryset):
csv_data = io.StringIO() csv_data = io.StringIO()
fieldnames = ["ref", "subject", "description", "milestone", "owner", fieldnames = ["ref", "subject", "description", "sprint", "sprint_estimated_start",
"owner_full_name", "assigned_to", "assigned_to_full_name", "sprint_estimated_finish", "owner", "owner_full_name", "assigned_to",
"status", "severity", "priority", "type", "is_closed", "assigned_to_full_name", "status", "severity", "priority", "type",
"attachments", "external_reference", "tags", "is_closed", "attachments", "external_reference", "tags", "watchers",
"watchers", "voters", "voters", "created_date", "modified_date", "finished_date"]
"created_date", "modified_date", "finished_date"]
custom_attrs = project.issuecustomattributes.all() custom_attrs = project.issuecustomattributes.all()
for custom_attr in custom_attrs: for custom_attr in custom_attrs:
@ -112,7 +111,9 @@ def issues_to_csv(project, queryset):
"ref": issue.ref, "ref": issue.ref,
"subject": issue.subject, "subject": issue.subject,
"description": issue.description, "description": issue.description,
"milestone": issue.milestone.name if issue.milestone else None, "sprint": issue.milestone.name if issue.milestone else None,
"sprint_estimated_start": issue.milestone.estimated_start if issue.milestone else None,
"sprint_estimated_finish": issue.milestone.estimated_finish if issue.milestone else None,
"owner": issue.owner.username if issue.owner else None, "owner": issue.owner.username if issue.owner else None,
"owner_full_name": issue.owner.get_full_name() 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": issue.assigned_to.username if issue.assigned_to else None,

View File

@ -95,11 +95,10 @@ def snapshot_tasks_in_bulk(bulk_data, user):
def tasks_to_csv(project, queryset): def tasks_to_csv(project, queryset):
csv_data = io.StringIO() csv_data = io.StringIO()
fieldnames = ["ref", "subject", "description", "user_story", "milestone", "owner", fieldnames = ["ref", "subject", "description", "user_story", "sprint", "sprint_estimated_start",
"owner_full_name", "assigned_to", "assigned_to_full_name", "sprint_estimated_finish", "owner", "owner_full_name", "assigned_to",
"status", "is_iocaine", "is_closed", "us_order", "assigned_to_full_name", "status", "is_iocaine", "is_closed", "us_order",
"taskboard_order", "attachments", "external_reference", "tags", "taskboard_order", "attachments", "external_reference", "tags", "watchers", "voters"]
"watchers", "voters"]
custom_attrs = project.taskcustomattributes.all() custom_attrs = project.taskcustomattributes.all()
for custom_attr in custom_attrs: for custom_attr in custom_attrs:
@ -124,7 +123,9 @@ def tasks_to_csv(project, queryset):
"subject": task.subject, "subject": task.subject,
"description": task.description, "description": task.description,
"user_story": task.user_story.ref if task.user_story else None, "user_story": task.user_story.ref if task.user_story else None,
"milestone": task.milestone.name if task.milestone else None, "sprint": task.milestone.name if task.milestone else None,
"sprint_estimated_start": task.milestone.estimated_start if task.milestone else None,
"sprint_estimated_finish": task.milestone.estimated_finish if task.milestone else None,
"owner": task.owner.username if task.owner else None, "owner": task.owner.username if task.owner else None,
"owner_full_name": task.owner.get_full_name() 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": task.assigned_to.username if task.assigned_to else None,

View File

@ -130,9 +130,9 @@ def open_userstory(us):
def userstories_to_csv(project,queryset): def userstories_to_csv(project,queryset):
csv_data = io.StringIO() csv_data = io.StringIO()
fieldnames = ["ref", "subject", "description", "milestone", "owner", fieldnames = ["ref", "subject", "description", "sprint", "sprint_estimated_start",
"owner_full_name", "assigned_to", "assigned_to_full_name", "sprint_estimated_finish", "owner", "owner_full_name", "assigned_to",
"status", "is_closed"] "assigned_to_full_name", "status", "is_closed"]
roles = project.roles.filter(computable=True).order_by('slug') roles = project.roles.filter(computable=True).order_by('slug')
for role in roles: for role in roles:
@ -144,8 +144,7 @@ def userstories_to_csv(project,queryset):
"created_date", "modified_date", "finish_date", "created_date", "modified_date", "finish_date",
"client_requirement", "team_requirement", "attachments", "client_requirement", "team_requirement", "attachments",
"generated_from_issue", "external_reference", "tasks", "generated_from_issue", "external_reference", "tasks",
"tags", "tags","watchers", "voters"]
"watchers", "voters"]
custom_attrs = project.userstorycustomattributes.all() custom_attrs = project.userstorycustomattributes.all()
for custom_attr in custom_attrs: for custom_attr in custom_attrs:
@ -174,7 +173,9 @@ def userstories_to_csv(project,queryset):
"ref": us.ref, "ref": us.ref,
"subject": us.subject, "subject": us.subject,
"description": us.description, "description": us.description,
"milestone": us.milestone.name if us.milestone else None, "sprint": us.milestone.name if us.milestone else None,
"sprint_estimated_start": us.milestone.estimated_start if us.milestone else None,
"sprint_estimated_finish": us.milestone.estimated_finish if us.milestone else None,
"owner": us.owner.username if us.owner else None, "owner": us.owner.username if us.owner else None,
"owner_full_name": us.owner.get_full_name() 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": us.assigned_to.username if us.assigned_to else None,

View File

@ -41,7 +41,8 @@ class TaskSearchResultsSerializer(TaskSerializer):
class UserStorySearchResultsSerializer(UserStorySerializer): class UserStorySearchResultsSerializer(UserStorySerializer):
class Meta: class Meta:
model = UserStory model = UserStory
fields = ('id', 'ref', 'subject', 'status', 'total_points') fields = ('id', 'ref', 'subject', 'status', 'total_points',
'milestone_name', 'milestone_slug')
class WikiPageSearchResultsSerializer(WikiPageSerializer): class WikiPageSearchResultsSerializer(WikiPageSerializer):

View File

@ -15,6 +15,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base import filters from taiga.base import filters
@ -45,7 +46,7 @@ class WebhookViewSet(BlockedByProjectMixin, ModelCrudViewSet):
self.check_permissions(request, 'test', webhook) self.check_permissions(request, 'test', webhook)
self.pre_conditions_blocked(webhook) self.pre_conditions_blocked(webhook)
webhooklog = tasks.test_webhook(webhook.id, webhook.url, webhook.key) webhooklog = tasks.test_webhook(webhook.id, webhook.url, webhook.key, request.user, timezone.now())
log = serializers.WebhookLogSerializer(webhooklog) log = serializers.WebhookLogSerializer(webhooklog)
return response.Ok(log.data) return response.Ok(log.data)

View File

@ -20,21 +20,26 @@ from django.core.exceptions import ObjectDoesNotExist
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.fields import TagsField, PgArrayField, JsonField from taiga.base.fields import TagsField, PgArrayField, JsonField
from taiga.projects.userstories import models as us_models from taiga.front.templatetags.functions import resolve as resolve_front_url
from taiga.projects.tasks import models as task_models
from taiga.projects.history import models as history_models
from taiga.projects.issues import models as issue_models from taiga.projects.issues import models as issue_models
from taiga.projects.milestones import models as milestone_models from taiga.projects.milestones import models as milestone_models
from taiga.projects.wiki import models as wiki_models
from taiga.projects.history import models as history_models
from taiga.projects.notifications.mixins import EditableWatchedResourceModelSerializer from taiga.projects.notifications.mixins import EditableWatchedResourceModelSerializer
from taiga.projects.services import get_logo_big_thumbnail_url
from taiga.projects.tasks import models as task_models
from taiga.projects.userstories import models as us_models
from taiga.projects.wiki import models as wiki_models
from taiga.users.gravatar import get_gravatar_url
from taiga.users.services import get_photo_or_gravatar_url
from .models import Webhook, WebhookLog from .models import Webhook, WebhookLog
class HistoryDiffField(serializers.Field): ########################################################################
def to_native(self, obj): ## WebHooks
return {key: {"from": value[0], "to": value[1]} for key, value in obj.items()} ########################################################################
class WebhookSerializer(serializers.ModelSerializer): class WebhookSerializer(serializers.ModelSerializer):
logs_counter = serializers.SerializerMethodField("get_logs_counter") logs_counter = serializers.SerializerMethodField("get_logs_counter")
@ -55,16 +60,93 @@ class WebhookLogSerializer(serializers.ModelSerializer):
model = WebhookLog model = WebhookLog
########################################################################
## User
########################################################################
class UserSerializer(serializers.Serializer): class UserSerializer(serializers.Serializer):
id = serializers.SerializerMethodField("get_pk") id = serializers.SerializerMethodField("get_pk")
name = serializers.SerializerMethodField("get_name") permalink = serializers.SerializerMethodField("get_permalink")
gravatar_url = serializers.SerializerMethodField("get_gravatar_url")
username = serializers.SerializerMethodField("get_username")
full_name = serializers.SerializerMethodField("get_full_name")
photo = serializers.SerializerMethodField("get_photo")
def get_pk(self, obj): def get_pk(self, obj):
return obj.pk return obj.pk
def get_name(self, obj): def get_permalink(self, obj):
return obj.full_name return resolve_front_url("user", obj.username)
def get_gravatar_url(self, obj):
return get_gravatar_url(obj.email)
def get_username(self, obj):
return obj.get_username
def get_full_name(self, obj):
return obj.get_full_name()
def get_photo(self, obj):
return get_photo_or_gravatar_url(obj)
########################################################################
## Project
########################################################################
class ProjectSerializer(serializers.Serializer):
id = serializers.SerializerMethodField("get_pk")
permalink = serializers.SerializerMethodField("get_permalink")
name = serializers.SerializerMethodField("get_name")
logo_big_url = serializers.SerializerMethodField("get_logo_big_url")
def get_pk(self, obj):
return obj.pk
def get_permalink(self, obj):
return resolve_front_url("project", obj.slug)
def get_name(self, obj):
return obj.name
def get_logo_big_url(self, obj):
return get_logo_big_thumbnail_url(obj)
########################################################################
## History Serializer
########################################################################
class HistoryDiffField(serializers.Field):
def to_native(self, value):
# Tip: 'value' is the object returned by
# taiga.projects.history.models.HistoryEntry.values_diff()
ret = {}
for key, val in value.items():
if key in ["attachments", "custom_attributes"]:
ret[key] = val
elif key == "points":
ret[key] = {k: {"from": v[0], "to": v[1]} for k, v in val.items()}
else:
ret[key] = {"from": val[0], "to": val[1]}
return ret
class HistoryEntrySerializer(serializers.ModelSerializer):
diff = HistoryDiffField(source="values_diff")
class Meta:
model = history_models.HistoryEntry
exclude = ("id", "type", "key", "is_hidden", "is_snapshot", "snapshot", "user", "delete_comment_user",
"values", "created_at")
########################################################################
## _Misc_
########################################################################
class CustomAttributesValuesWebhookSerializerMixin(serializers.ModelSerializer): class CustomAttributesValuesWebhookSerializerMixin(serializers.ModelSerializer):
custom_attributes_values = serializers.SerializerMethodField("get_custom_attributes_values") custom_attributes_values = serializers.SerializerMethodField("get_custom_attributes_values")
@ -90,86 +172,251 @@ class CustomAttributesValuesWebhookSerializerMixin(serializers.ModelSerializer):
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
class PointSerializer(serializers.Serializer):
id = serializers.SerializerMethodField("get_pk") class RolePointsSerializer(serializers.Serializer):
role = serializers.SerializerMethodField("get_role")
name = serializers.SerializerMethodField("get_name") name = serializers.SerializerMethodField("get_name")
value = serializers.SerializerMethodField("get_value") value = serializers.SerializerMethodField("get_value")
def get_role(self, obj):
return obj.role.name
def get_name(self, obj):
return obj.points.name
def get_value(self, obj):
return obj.points.value
class UserStoryStatusSerializer(serializers.Serializer):
id = serializers.SerializerMethodField("get_pk")
name = serializers.SerializerMethodField("get_name")
slug = serializers.SerializerMethodField("get_slug")
color = serializers.SerializerMethodField("get_color")
is_closed = serializers.SerializerMethodField("get_is_closed")
is_archived = serializers.SerializerMethodField("get_is_archived")
def get_pk(self, obj): def get_pk(self, obj):
return obj.pk return obj.pk
def get_name(self, obj): def get_name(self, obj):
return obj.name return obj.name
def get_value(self, obj): def get_slug(self, obj):
return obj.value return obj.slug
def get_color(self, obj):
return obj.color
def get_is_closed(self, obj):
return obj.is_closed
def get_is_archived(self, obj):
return obj.is_archived
class UserStorySerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer, class TaskStatusSerializer(serializers.Serializer):
serializers.ModelSerializer): id = serializers.SerializerMethodField("get_pk")
tags = TagsField(default=[], required=False) name = serializers.SerializerMethodField("get_name")
external_reference = PgArrayField(required=False) slug = serializers.SerializerMethodField("get_slug")
owner = UserSerializer() color = serializers.SerializerMethodField("get_color")
assigned_to = UserSerializer() is_closed = serializers.SerializerMethodField("get_is_closed")
points = PointSerializer(many=True)
class Meta: def get_pk(self, obj):
model = us_models.UserStory return obj.pk
exclude = ("backlog_order", "sprint_order", "kanban_order", "version")
def custom_attributes_queryset(self, project): def get_name(self, obj):
return project.userstorycustomattributes.all() return obj.name
def get_slug(self, obj):
return obj.slug
def get_color(self, obj):
return obj.color
def get_is_closed(self, obj):
return obj.is_closed
class TaskSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer, class IssueStatusSerializer(serializers.Serializer):
serializers.ModelSerializer): id = serializers.SerializerMethodField("get_pk")
tags = TagsField(default=[], required=False) name = serializers.SerializerMethodField("get_name")
owner = UserSerializer() slug = serializers.SerializerMethodField("get_slug")
assigned_to = UserSerializer() color = serializers.SerializerMethodField("get_color")
is_closed = serializers.SerializerMethodField("get_is_closed")
class Meta: def get_pk(self, obj):
model = task_models.Task return obj.pk
def custom_attributes_queryset(self, project): def get_name(self, obj):
return project.taskcustomattributes.all() return obj.name
def get_slug(self, obj):
return obj.slug
def get_color(self, obj):
return obj.color
def get_is_closed(self, obj):
return obj.is_closed
class IssueSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer, class IssueTypeSerializer(serializers.Serializer):
serializers.ModelSerializer): id = serializers.SerializerMethodField("get_pk")
tags = TagsField(default=[], required=False) name = serializers.SerializerMethodField("get_name")
owner = UserSerializer() color = serializers.SerializerMethodField("get_color")
assigned_to = UserSerializer()
class Meta: def get_pk(self, obj):
model = issue_models.Issue return obj.pk
def custom_attributes_queryset(self, project): def get_name(self, obj):
return project.issuecustomattributes.all() return obj.name
def get_color(self, obj):
return obj.color
class WikiPageSerializer(serializers.ModelSerializer): class PrioritySerializer(serializers.Serializer):
owner = UserSerializer() id = serializers.SerializerMethodField("get_pk")
last_modifier = UserSerializer() name = serializers.SerializerMethodField("get_name")
color = serializers.SerializerMethodField("get_color")
class Meta: def get_pk(self, obj):
model = wiki_models.WikiPage return obj.pk
exclude = ("watchers", "version")
def get_name(self, obj):
return obj.name
def get_color(self, obj):
return obj.color
class SeveritySerializer(serializers.Serializer):
id = serializers.SerializerMethodField("get_pk")
name = serializers.SerializerMethodField("get_name")
color = serializers.SerializerMethodField("get_color")
def get_pk(self, obj):
return obj.pk
def get_name(self, obj):
return obj.name
def get_color(self, obj):
return obj.color
########################################################################
## Milestone
########################################################################
class MilestoneSerializer(serializers.ModelSerializer): class MilestoneSerializer(serializers.ModelSerializer):
permalink = serializers.SerializerMethodField("get_permalink")
project = ProjectSerializer()
owner = UserSerializer() owner = UserSerializer()
class Meta: class Meta:
model = milestone_models.Milestone model = milestone_models.Milestone
exclude = ("order", "watchers") exclude = ("order", "watchers")
def get_permalink(self, obj):
return resolve_front_url("taskboard", obj.project.slug, obj.slug)
class HistoryEntrySerializer(serializers.ModelSerializer):
diff = HistoryDiffField() ########################################################################
snapshot = JsonField() ## User Story
values = JsonField() ########################################################################
user = JsonField()
delete_comment_user = JsonField() class UserStorySerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer,
serializers.ModelSerializer):
permalink = serializers.SerializerMethodField("get_permalink")
tags = TagsField(default=[], required=False)
external_reference = PgArrayField(required=False)
project = ProjectSerializer()
owner = UserSerializer()
assigned_to = UserSerializer()
points = RolePointsSerializer(source="role_points", many=True)
status = UserStoryStatusSerializer()
milestone = MilestoneSerializer()
class Meta: class Meta:
model = history_models.HistoryEntry model = us_models.UserStory
exclude = ("backlog_order", "sprint_order", "kanban_order", "version", "total_watchers", "is_watcher")
def get_permalink(self, obj):
return resolve_front_url("userstory", obj.project.slug, obj.ref)
def custom_attributes_queryset(self, project):
return project.userstorycustomattributes.all()
########################################################################
## Task
########################################################################
class TaskSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer,
serializers.ModelSerializer):
permalink = serializers.SerializerMethodField("get_permalink")
tags = TagsField(default=[], required=False)
project = ProjectSerializer()
owner = UserSerializer()
assigned_to = UserSerializer()
status = TaskStatusSerializer()
user_story = UserStorySerializer()
milestone = MilestoneSerializer()
class Meta:
model = task_models.Task
exclude = ("version", "total_watchers", "is_watcher")
def get_permalink(self, obj):
return resolve_front_url("task", obj.project.slug, obj.ref)
def custom_attributes_queryset(self, project):
return project.taskcustomattributes.all()
########################################################################
## Issue
########################################################################
class IssueSerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer,
serializers.ModelSerializer):
permalink = serializers.SerializerMethodField("get_permalink")
tags = TagsField(default=[], required=False)
project = ProjectSerializer()
milestone = MilestoneSerializer()
owner = UserSerializer()
assigned_to = UserSerializer()
status = IssueStatusSerializer()
type = IssueTypeSerializer()
priority = PrioritySerializer()
severity = SeveritySerializer()
class Meta:
model = issue_models.Issue
exclude = ("version", "total_watchers", "is_watcher")
def get_permalink(self, obj):
return resolve_front_url("issue", obj.project.slug, obj.ref)
def custom_attributes_queryset(self, project):
return project.issuecustomattributes.all()
########################################################################
## Wiki Page
########################################################################
class WikiPageSerializer(serializers.ModelSerializer):
permalink = serializers.SerializerMethodField("get_permalink")
project = ProjectSerializer()
owner = UserSerializer()
last_modifier = UserSerializer()
class Meta:
model = wiki_models.WikiPage
exclude = ("watchers", "total_watchers", "is_watcher", "version")
def get_permalink(self, obj):
return resolve_front_url("wiki", obj.project.slug, obj.slug)

View File

@ -61,10 +61,13 @@ def on_new_history_entry(sender, instance, created, **kwargs):
extra_args = [instance] extra_args = [instance]
elif instance.type == HistoryType.delete: elif instance.type == HistoryType.delete:
task = tasks.delete_webhook task = tasks.delete_webhook
extra_args = [timezone.now()] extra_args = []
by = instance.owner
date = timezone.now()
for webhook in webhooks: for webhook in webhooks:
args = [webhook["id"], webhook["url"], webhook["key"], obj] + extra_args args = [webhook["id"], webhook["url"], webhook["key"], by, date, obj] + extra_args
if settings.CELERY_ENABLED: if settings.CELERY_ENABLED:
connection.on_commit(lambda: task.delay(*args)) connection.on_commit(lambda: task.delay(*args))

View File

@ -26,7 +26,7 @@ from taiga.celery import app
from .serializers import (UserStorySerializer, IssueSerializer, TaskSerializer, from .serializers import (UserStorySerializer, IssueSerializer, TaskSerializer,
WikiPageSerializer, MilestoneSerializer, WikiPageSerializer, MilestoneSerializer,
HistoryEntrySerializer) HistoryEntrySerializer, UserSerializer)
from .models import WebhookLog from .models import WebhookLog
@ -67,58 +67,70 @@ def _send_request(webhook_id, url, key, data):
request = requests.Request('POST', url, data=serialized_data, headers=headers) request = requests.Request('POST', url, data=serialized_data, headers=headers)
prepared_request = request.prepare() prepared_request = request.prepare()
session = requests.Session() with requests.Session() as session:
try: try:
response = session.send(prepared_request) response = session.send(prepared_request)
webhook_log = WebhookLog.objects.create(webhook_id=webhook_id, url=url, except RequestException as e:
status=response.status_code, # Error sending the webhook
request_data=data, webhook_log = WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=0,
request_headers=dict(prepared_request.headers), request_data=data,
response_data=response.content, request_headers=dict(prepared_request.headers),
response_headers=dict(response.headers), response_data="error-in-request: {}".format(str(e)),
duration=response.elapsed.total_seconds()) response_headers={},
except RequestException as e: duration=0)
webhook_log = WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=0, else:
request_data=data, # Webhook was sent successfully
request_headers=dict(prepared_request.headers), webhook_log = WebhookLog.objects.create(webhook_id=webhook_id, url=url,
response_data="error-in-request: {}".format(str(e)), status=response.status_code,
response_headers={}, request_data=data,
duration=0) request_headers=dict(prepared_request.headers),
session.close() response_data=response.content,
response_headers=dict(response.headers),
duration=response.elapsed.total_seconds())
finally:
# Only the last ten webhook logs traces are required
# so remove the leftover
ids = (WebhookLog.objects.filter(webhook_id=webhook_id)
.order_by("-id")
.values_list('id', flat=True)[10:])
WebhookLog.objects.filter(id__in=ids).delete()
ids = [log.id for log in WebhookLog.objects.filter(webhook_id=webhook_id).order_by("-id")[10:]]
WebhookLog.objects.filter(id__in=ids).delete()
return webhook_log return webhook_log
@app.task @app.task
def change_webhook(webhook_id, url, key, obj, change): def create_webhook(webhook_id, url, key, by, date, obj):
data = {} data = {}
data['data'] = _serialize(obj)
data['action'] = "change"
data['type'] = _get_type(obj)
data['change'] = _serialize(change)
return _send_request(webhook_id, url, key, data)
@app.task
def create_webhook(webhook_id, url, key, obj):
data = {}
data['data'] = _serialize(obj)
data['action'] = "create" data['action'] = "create"
data['type'] = _get_type(obj) data['type'] = _get_type(obj)
data['by'] = UserSerializer(by).data
data['date'] = date
data['data'] = _serialize(obj)
return _send_request(webhook_id, url, key, data) return _send_request(webhook_id, url, key, data)
@app.task @app.task
def delete_webhook(webhook_id, url, key, obj, deleted_date): def delete_webhook(webhook_id, url, key, by, date, obj):
data = {} data = {}
data['data'] = _serialize(obj)
data['action'] = "delete" data['action'] = "delete"
data['type'] = _get_type(obj) data['type'] = _get_type(obj)
data['deleted_date'] = deleted_date data['by'] = UserSerializer(by).data
data['date'] = date
data['data'] = _serialize(obj)
return _send_request(webhook_id, url, key, data)
@app.task
def change_webhook(webhook_id, url, key, by, date, obj, change):
data = {}
data['action'] = "change"
data['type'] = _get_type(obj)
data['by'] = UserSerializer(by).data
data['date'] = date
data['data'] = _serialize(obj)
data['change'] = _serialize(change)
return _send_request(webhook_id, url, key, data) return _send_request(webhook_id, url, key, data)
@ -129,10 +141,12 @@ def resend_webhook(webhook_id, url, key, data):
@app.task @app.task
def test_webhook(webhook_id, url, key): def test_webhook(webhook_id, url, key, by, date):
data = {} data = {}
data['data'] = {"test": "test"}
data['action'] = "test" data['action'] = "test"
data['type'] = "test" data['type'] = "test"
data['by'] = UserSerializer(by).data
data['date'] = date
data['data'] = {"test": "test"}
return _send_request(webhook_id, url, key, data) return _send_request(webhook_id, url, key, data)

File diff suppressed because it is too large Load Diff

View File

@ -433,6 +433,6 @@ def test_custom_fields_csv_generation():
data.seek(0) data.seek(0)
reader = csv.reader(data) reader = csv.reader(data)
row = next(reader) row = next(reader)
assert row[21] == attr.name assert row[23] == attr.name
row = next(reader) row = next(reader)
assert row[21] == "val1" assert row[23] == "val1"

View File

@ -64,7 +64,7 @@ def test_create_task_without_default_values(client):
response = client.json.post(url, json.dumps(data)) response = client.json.post(url, json.dumps(data))
assert response.status_code == 201 assert response.status_code == 201
assert response.data['status'] == None assert response.data['status'] == None
def test_api_update_task_tags(client): def test_api_update_task_tags(client):
project = f.ProjectFactory.create() project = f.ProjectFactory.create()
@ -176,6 +176,6 @@ def test_custom_fields_csv_generation():
data.seek(0) data.seek(0)
reader = csv.reader(data) reader = csv.reader(data)
row = next(reader) row = next(reader)
assert row[19] == attr.name assert row[21] == attr.name
row = next(reader) row = next(reader)
assert row[19] == "val1" assert row[21] == "val1"

View File

@ -469,9 +469,9 @@ def test_custom_fields_csv_generation():
data.seek(0) data.seek(0)
reader = csv.reader(data) reader = csv.reader(data)
row = next(reader) row = next(reader)
assert row[26] == attr.name assert row[28] == attr.name
row = next(reader) row = next(reader)
assert row[26] == "val1" assert row[28] == "val1"
def test_update_userstory_respecting_watchers(client): def test_update_userstory_respecting_watchers(client):

View File

@ -0,0 +1,248 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# Copyright (C) 2014-2016 Anler Hernández <hello@anler.me>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
import pytest
from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f
from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True)
from taiga.base.utils import json
def test_webhooks_when_create_issue(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.IssueFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "create"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
def test_webhooks_when_update_issue(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.IssueFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
obj.subject = "test webhook update"
obj.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["data"]["subject"] == obj.subject
assert data["change"]["comment"] == "test_comment"
assert data["change"]["diff"]["subject"]["to"] == data["data"]["subject"]
assert data["change"]["diff"]["subject"]["from"] != data["data"]["subject"]
def test_webhooks_when_delete_issue(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.IssueFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, delete=True)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "delete"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert "data" in data
def test_webhooks_when_update_issue_attachments(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.IssueFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create attachments
attachment1 = f.IssueAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
attachment2 = f.IssueAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 2
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Update attachment
attachment1.description = "new attachment description"
attachment1.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 1
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Delete attachment
attachment2.delete()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 1
def test_webhooks_when_update_issue_custom_attributes(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.IssueFactory.create(project=project)
custom_attr_1 = f.IssueCustomAttributeFactory(project=obj.project)
ct1_id = "{}".format(custom_attr_1.id)
custom_attr_2 = f.IssueCustomAttributeFactory(project=obj.project)
ct2_id = "{}".format(custom_attr_2.id)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create custom attributes
obj.custom_attributes_values.attributes_values = {
ct1_id: "test_1_updated",
ct2_id: "test_2_updated"
}
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 2
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Update custom attributes
obj.custom_attributes_values.attributes_values[ct1_id] = "test_2_updated"
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 1
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Delete custom attributes
del obj.custom_attributes_values.attributes_values[ct1_id]
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "issue"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 1

View File

@ -0,0 +1,101 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# Copyright (C) 2014-2016 Anler Hernández <hello@anler.me>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
import pytest
from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f
from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True)
from taiga.base.utils import json
def test_webhooks_when_create_milestone(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.MilestoneFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "create"
assert data["type"] == "milestone"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
def test_webhooks_when_update_milestone(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.MilestoneFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
obj.name = "test webhook update"
obj.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "milestone"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["data"]["name"] == obj.name
assert data["change"]["comment"] == "test_comment"
assert data["change"]["diff"]["name"]["to"] == data["data"]["name"]
assert data["change"]["diff"]["name"]["from"] != data["data"]["name"]
def test_webhooks_when_delete_milestone(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.MilestoneFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, delete=True)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "delete"
assert data["type"] == "milestone"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert "data" in data

View File

@ -18,6 +18,7 @@
import pytest import pytest
from unittest.mock import patch from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f from .. import factories as f
@ -26,7 +27,7 @@ from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True) pytestmark = pytest.mark.django_db(transaction=True)
def test_new_object_with_one_webhook(settings): def test_new_object_with_one_webhook_signal(settings):
settings.WEBHOOKS_ENABLED = True settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory() project = f.ProjectFactory()
f.WebhookFactory.create(project=project) f.WebhookFactory.create(project=project)
@ -38,28 +39,31 @@ def test_new_object_with_one_webhook(settings):
f.WikiPageFactory.create(project=project) f.WikiPageFactory.create(project=project)
] ]
for obj in objects: response = Mock(status_code=200, headers={}, content="ok")
with patch('taiga.webhooks.tasks.create_webhook') as create_webhook_mock: response.elapsed.total_seconds.return_value = 100
services.take_snapshot(obj, user=obj.owner, comment="test")
assert create_webhook_mock.call_count == 1
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.change_webhook') as change_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test")
assert session_send_mock.call_count == 1
for obj in objects:
with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner) services.take_snapshot(obj, user=obj.owner)
assert change_webhook_mock.call_count == 0 assert session_send_mock.call_count == 0
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.change_webhook') as change_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test") services.take_snapshot(obj, user=obj.owner, comment="test")
assert change_webhook_mock.call_count == 1 assert session_send_mock.call_count == 1
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.delete_webhook') as delete_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test", delete=True) services.take_snapshot(obj, user=obj.owner, comment="test", delete=True)
assert delete_webhook_mock.call_count == 1 assert session_send_mock.call_count == 1
def test_new_object_with_two_webhook(settings): def test_new_object_with_two_webhook_signals(settings):
settings.WEBHOOKS_ENABLED = True settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory() project = f.ProjectFactory()
f.WebhookFactory.create(project=project) f.WebhookFactory.create(project=project)
@ -72,28 +76,31 @@ def test_new_object_with_two_webhook(settings):
f.WikiPageFactory.create(project=project) f.WikiPageFactory.create(project=project)
] ]
for obj in objects: response = Mock(status_code=200, headers={}, content="ok")
with patch('taiga.webhooks.tasks.create_webhook') as create_webhook_mock: response.elapsed.total_seconds.return_value = 100
services.take_snapshot(obj, user=obj.owner, comment="test")
assert create_webhook_mock.call_count == 2
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.change_webhook') as change_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test") services.take_snapshot(obj, user=obj.owner, comment="test")
assert change_webhook_mock.call_count == 2 assert session_send_mock.call_count == 2
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.change_webhook') as change_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test")
assert session_send_mock.call_count == 2
for obj in objects:
with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner) services.take_snapshot(obj, user=obj.owner)
assert change_webhook_mock.call_count == 0 assert session_send_mock.call_count == 0
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks.delete_webhook') as delete_webhook_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test", delete=True) services.take_snapshot(obj, user=obj.owner, comment="test", delete=True)
assert delete_webhook_mock.call_count == 2 assert session_send_mock.call_count == 2
def test_send_request_one_webhook(settings): def test_send_request_one_webhook_signal(settings):
settings.WEBHOOKS_ENABLED = True settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory() project = f.ProjectFactory()
f.WebhookFactory.create(project=project) f.WebhookFactory.create(project=project)
@ -105,12 +112,15 @@ def test_send_request_one_webhook(settings):
f.WikiPageFactory.create(project=project) f.WikiPageFactory.create(project=project)
] ]
for obj in objects: response = Mock(status_code=200, headers={}, content="ok")
with patch('taiga.webhooks.tasks._send_request') as _send_request_mock: response.elapsed.total_seconds.return_value = 100
services.take_snapshot(obj, user=obj.owner, comment="test")
assert _send_request_mock.call_count == 1
for obj in objects: for obj in objects:
with patch('taiga.webhooks.tasks._send_request') as _send_request_mock: with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test")
assert session_send_mock.call_count == 1
for obj in objects:
with patch("taiga.webhooks.tasks.requests.Session.send", return_value=response) as session_send_mock:
services.take_snapshot(obj, user=obj.owner, comment="test", delete=True) services.take_snapshot(obj, user=obj.owner, comment="test", delete=True)
assert _send_request_mock.call_count == 1 assert session_send_mock.call_count == 1

View File

@ -0,0 +1,248 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# Copyright (C) 2014-2016 Anler Hernández <hello@anler.me>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
import pytest
from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f
from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True)
from taiga.base.utils import json
def test_webhooks_when_create_task(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.TaskFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "create"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
def test_webhooks_when_update_task(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.TaskFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
obj.subject = "test webhook update"
obj.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["data"]["subject"] == obj.subject
assert data["change"]["comment"] == "test_comment"
assert data["change"]["diff"]["subject"]["to"] == data["data"]["subject"]
assert data["change"]["diff"]["subject"]["from"] != data["data"]["subject"]
def test_webhooks_when_delete_task(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.TaskFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, delete=True)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "delete"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert "data" in data
def test_webhooks_when_update_task_attachments(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.TaskFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create attachments
attachment1 = f.TaskAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
attachment2 = f.TaskAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 2
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Update attachment
attachment1.description = "new attachment description"
attachment1.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 1
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Delete attachment
attachment2.delete()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 1
def test_webhooks_when_update_task_custom_attributes(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.TaskFactory.create(project=project)
custom_attr_1 = f.TaskCustomAttributeFactory(project=obj.project)
ct1_id = "{}".format(custom_attr_1.id)
custom_attr_2 = f.TaskCustomAttributeFactory(project=obj.project)
ct2_id = "{}".format(custom_attr_2.id)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create custom attributes
obj.custom_attributes_values.attributes_values = {
ct1_id: "test_1_updated",
ct2_id: "test_2_updated"
}
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 2
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Update custom attributes
obj.custom_attributes_values.attributes_values[ct1_id] = "test_2_updated"
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 1
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Delete custom attributes
del obj.custom_attributes_values.attributes_values[ct1_id]
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "task"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 1

View File

@ -0,0 +1,308 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# Copyright (C) 2014-2016 Anler Hernández <hello@anler.me>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
import pytest
from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f
from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True)
from taiga.base.utils import json
def test_webhooks_when_create_user_story(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.UserStoryFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "create"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
def test_webhooks_when_update_user_story(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.UserStoryFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
obj.subject = "test webhook update"
obj.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["data"]["subject"] == obj.subject
assert data["change"]["comment"] == "test_comment"
assert data["change"]["diff"]["subject"]["to"] == data["data"]["subject"]
assert data["change"]["diff"]["subject"]["from"] != data["data"]["subject"]
def test_webhooks_when_delete_user_story(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.UserStoryFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, delete=True)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "delete"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert "data" in data
def test_webhooks_when_update_user_story_attachments(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.UserStoryFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create attachments
attachment1 = f.UserStoryAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
attachment2 = f.UserStoryAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 2
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Update attachment
attachment1.description = "new attachment description"
attachment1.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 1
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Delete attachment
attachment2.delete()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 1
def test_webhooks_when_update_user_story_custom_attributes(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.UserStoryFactory.create(project=project)
custom_attr_1 = f.UserStoryCustomAttributeFactory(project=obj.project)
ct1_id = "{}".format(custom_attr_1.id)
custom_attr_2 = f.UserStoryCustomAttributeFactory(project=obj.project)
ct2_id = "{}".format(custom_attr_2.id)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create custom attributes
obj.custom_attributes_values.attributes_values = {
ct1_id: "test_1_updated",
ct2_id: "test_2_updated"
}
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 2
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Update custom attributes
obj.custom_attributes_values.attributes_values[ct1_id] = "test_2_updated"
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 1
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 0
# Delete custom attributes
del obj.custom_attributes_values.attributes_values[ct1_id]
obj.custom_attributes_values.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["custom_attributes"]["new"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["changed"]) == 0
assert len(data["change"]["diff"]["custom_attributes"]["deleted"]) == 1
def test_webhooks_when_update_user_story_points(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
role1 = f.RoleFactory.create(project=project)
role2 = f.RoleFactory.create(project=project)
points1 = f.PointsFactory.create(project=project, value=None)
points2 = f.PointsFactory.create(project=project, value=1)
points3 = f.PointsFactory.create(project=project, value=2)
obj = f.UserStoryFactory.create(project=project)
obj.role_points.all().delete()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Set points
f.RolePointsFactory.create(user_story=obj, role=role1, points=points1)
f.RolePointsFactory.create(user_story=obj, role=role2, points=points2)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == ""
assert data["change"]["diff"]["points"][role1.name]["from"] == None
assert data["change"]["diff"]["points"][role1.name]["to"] == points1.name
assert data["change"]["diff"]["points"][role2.name]["from"] == None
assert data["change"]["diff"]["points"][role2.name]["to"] == points2.name
# Change points
obj.role_points.all().update(points=points3)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "userstory"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == ""
assert data["change"]["diff"]["points"][role1.name]["from"] == points1.name
assert data["change"]["diff"]["points"][role1.name]["to"] == points3.name
assert data["change"]["diff"]["points"][role2.name]["from"] == points2.name
assert data["change"]["diff"]["points"][role2.name]["to"] == points3.name

View File

@ -0,0 +1,170 @@
# Copyright (C) 2014-2016 Andrey Antukh <niwi@niwi.nz>
# Copyright (C) 2014-2016 Jesús Espino <jespinog@gmail.com>
# Copyright (C) 2014-2016 David Barragán <bameda@dbarragan.com>
# Copyright (C) 2014-2016 Alejandro Alonso <alejandro.alonso@kaleidos.net>
# Copyright (C) 2014-2016 Anler Hernández <hello@anler.me>
# This program is free software: you can redistribute it and/or 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 <http://www.gnu.org/licenses/>.
import pytest
from unittest.mock import patch
from unittest.mock import Mock
from .. import factories as f
from taiga.projects.history import services
pytestmark = pytest.mark.django_db(transaction=True)
from taiga.base.utils import json
def test_webhooks_when_create_wiki_page(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.WikiPageFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "create"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
def test_webhooks_when_update_wiki_page(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.WikiPageFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
obj.content = "test webhook update"
obj.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["data"]["content"] == obj.content
assert data["change"]["comment"] == "test_comment"
assert data["change"]["diff"]["content_html"]["from"] != data["change"]["diff"]["content_html"]["to"]
assert obj.content in data["change"]["diff"]["content_html"]["to"]
def test_webhooks_when_delete_wiki_page(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.WikiPageFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, delete=True)
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "delete"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert "data" in data
def test_webhooks_when_update_wiki_page_attachments(settings):
settings.WEBHOOKS_ENABLED = True
project = f.ProjectFactory()
f.WebhookFactory.create(project=project)
f.WebhookFactory.create(project=project)
obj = f.WikiPageFactory.create(project=project)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner)
assert send_request_mock.call_count == 2
# Create attachments
attachment1 = f.WikiAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
attachment2 = f.WikiAttachmentFactory(project=obj.project, content_object=obj, owner=obj.owner)
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 2
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Update attachment
attachment1.description = "new attachment description"
attachment1.save()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 1
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 0
# Delete attachment
attachment2.delete()
with patch('taiga.webhooks.tasks._send_request') as send_request_mock:
services.take_snapshot(obj, user=obj.owner, comment="test_comment")
assert send_request_mock.call_count == 2
(webhook_id, url, key, data) = send_request_mock.call_args[0]
assert data["action"] == "change"
assert data["type"] == "wikipage"
assert data["by"]["id"] == obj.owner.id
assert "date" in data
assert data["data"]["id"] == obj.id
assert data["change"]["comment"] == "test_comment"
assert len(data["change"]["diff"]["attachments"]["new"]) == 0
assert len(data["change"]["diff"]["attachments"]["changed"]) == 0
assert len(data["change"]["diff"]["attachments"]["deleted"]) == 1

View File

@ -20,7 +20,7 @@ import io
from .. import factories as f from .. import factories as f
from taiga.base.utils import json from taiga.base.utils import json
from taiga.export_import.service import render_project from taiga.export_import.services import render_project
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db