diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py
index 1ae5ca4b..5b570980 100644
--- a/taiga/export_import/api.py
+++ b/taiga/export_import/api.py
@@ -91,13 +91,18 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
data = request.DATA.copy()
data['owner'] = data.get('owner', request.user.email)
+ # Validate if the project can be imported
is_private = data.get('is_private', False)
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(
+ 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(
self.request.user,
- Project(is_private=is_private, id=None)
+ is_private,
+ total_memberships
)
if not enough_slots:
- raise exc.NotEnoughSlotsForProject(is_private, 1, not_enough_slots_error)
+ raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message)
# Create Project
project_serialized = service.store_project(data)
@@ -115,14 +120,6 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
# Create memberships
if "memberships" in data:
- members = len([m for m in data.get("memberships", []) if m.get("email", None) != data["owner"]])
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(
- self.request.user,
- Project(is_private=is_private, id=None),
- members
- )
- if not enough_slots:
- raise exc.NotEnoughSlotsForProject(is_private, max(members, 1), not_enough_slots_error)
service.store_memberships(project_serialized.object, data)
try:
@@ -200,53 +197,6 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
headers = self.get_success_headers(response_data)
return response.Created(response_data, headers=headers)
- @list_route(methods=["POST"])
- @method_decorator(atomic)
- def load_dump(self, request):
- throttle = throttling.ImportDumpModeRateThrottle()
-
- if not throttle.allow_request(request, self):
- self.throttled(request, throttle.wait())
-
- self.check_permissions(request, "load_dump", None)
-
- dump = request.FILES.get('dump', None)
-
- if not dump:
- raise exc.WrongArguments(_("Needed dump file"))
-
- reader = codecs.getreader("utf-8")
-
- try:
- dump = json.load(reader(dump))
- is_private = dump.get("is_private", False)
- except Exception:
- raise exc.WrongArguments(_("Invalid dump format"))
-
- slug = dump.get('slug', None)
- if slug is not None and Project.objects.filter(slug=slug).exists():
- del dump['slug']
-
- user = request.user
- dump['owner'] = user.email
-
- members = len([m for m in dump.get("memberships", []) if m.get("email", None) != dump["owner"]])
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(
- user,
- Project(is_private=is_private, id=None),
- members
- )
- if not enough_slots:
- raise exc.NotEnoughSlotsForProject(is_private, max(members, 1), not_enough_slots_error)
-
- if settings.CELERY_ENABLED:
- task = tasks.load_project_dump.delay(user, dump)
- return response.Accepted({"import_id": task.id})
-
- project = dump_service.dict_to_project(dump, request.user)
- response_data = ProjectSerializer(project).data
- return response.Created(response_data)
-
@detail_route(methods=['post'])
@method_decorator(atomic)
def issue(self, request, *args, **kwargs):
@@ -342,3 +292,54 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
headers = self.get_success_headers(wiki_link.data)
return response.Created(wiki_link.data, headers=headers)
+
+ @list_route(methods=["POST"])
+ @method_decorator(atomic)
+ def load_dump(self, request):
+ throttle = throttling.ImportDumpModeRateThrottle()
+
+ if not throttle.allow_request(request, self):
+ self.throttled(request, throttle.wait())
+
+ self.check_permissions(request, "load_dump", None)
+
+ dump = request.FILES.get('dump', None)
+
+ if not dump:
+ raise exc.WrongArguments(_("Needed dump file"))
+
+ reader = codecs.getreader("utf-8")
+
+ try:
+ dump = json.load(reader(dump))
+ except Exception:
+ raise exc.WrongArguments(_("Invalid dump format"))
+
+ slug = dump.get('slug', None)
+ if slug is not None and Project.objects.filter(slug=slug).exists():
+ del dump['slug']
+
+ user = request.user
+ dump['owner'] = user.email
+
+ # Validate if the project can be imported
+ is_private = dump.get("is_private", False)
+ total_memberships = len([m for m in dump.get("memberships", [])
+ if m.get("email", None) != dump["owner"]])
+ total_memberships = total_memberships + 1 # 1 is the owner
+ (enough_slots, error_message) = users_service.has_available_slot_for_import_new_project(
+ user,
+ is_private,
+ total_memberships
+ )
+ if not enough_slots:
+ raise exc.NotEnoughSlotsForProject(is_private, total_memberships, error_message)
+
+ if settings.CELERY_ENABLED:
+ task = tasks.load_project_dump.delay(user, dump)
+ return response.Accepted({"import_id": task.id})
+
+ project = dump_service.dict_to_project(dump, request.user)
+ response_data = ProjectSerializer(project).data
+ return response.Created(response_data)
+
diff --git a/taiga/export_import/dump_service.py b/taiga/export_import/dump_service.py
index b68f3bf9..e7c8848f 100644
--- a/taiga/export_import/dump_service.py
+++ b/taiga/export_import/dump_service.py
@@ -15,6 +15,9 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+from django.db.transaction import atomic
+
+from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from taiga.projects.models import Membership, Project
@@ -88,17 +91,23 @@ def store_tags_colors(project, data):
return None
+@method_decorator(atomic)
def dict_to_project(data, owner=None):
if owner:
data["owner"] = owner.email
- members = len([m for m in data.get("memberships", []) if m.get("email", None) != data["owner"]])
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(
+
+ # 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,
- Project(is_private=data.get("is_private", False), id=None),
- members
+ is_private,
+ total_memberships
)
if not enough_slots:
- raise TaigaImportError(not_enough_slots_error)
+ raise TaigaImportError(error_message)
project_serialized = service.store_project(data)
diff --git a/taiga/locale/ca/LC_MESSAGES/django.po b/taiga/locale/ca/LC_MESSAGES/django.po
index da3a1146..10eb5a90 100644
--- a/taiga/locale/ca/LC_MESSAGES/django.po
+++ b/taiga/locale/ca/LC_MESSAGES/django.po
@@ -9,10 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Catalan (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/ca/)\n"
"MIME-Version: 1.0\n"
@@ -185,7 +184,7 @@ msgstr ""
"està corrupte."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -469,71 +468,71 @@ msgstr ""
" Comentari: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr ""
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Es necessita arxiu dump."
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Format d'arxiu dump invàlid"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr ""
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr ""
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr ""
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr ""
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr ""
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr ""
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr ""
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr ""
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr ""
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr ""
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr ""
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr ""
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr ""
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr ""
@@ -723,7 +722,7 @@ msgstr ""
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "Nom"
@@ -1176,13 +1175,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "No tens permisos per a veure açò."
@@ -1212,7 +1211,7 @@ msgstr "Amo"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "Projecte"
@@ -1251,7 +1250,7 @@ msgstr "està obsolet "
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "Ordre"
@@ -1531,7 +1530,7 @@ msgstr "Fans"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2358,50 +2357,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Opcions per defecte"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Estatus d'històries d'usuari"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Punts"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Estatus de tasques"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Estatus d'incidéncies"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Tipus d'incidéncies"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioritats"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Severitats"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Rols"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr ""
@@ -3271,7 +3292,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "permissos"
@@ -3287,14 +3308,6 @@ msgstr "Nom d'usuari invàlid"
msgid "Username or password does not matches user."
msgstr ""
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/de/LC_MESSAGES/django.po b/taiga/locale/de/LC_MESSAGES/django.po
index 1e58b906..5c261f3f 100644
--- a/taiga/locale/de/LC_MESSAGES/django.po
+++ b/taiga/locale/de/LC_MESSAGES/django.po
@@ -17,10 +17,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: German (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/de/)\n"
"MIME-Version: 1.0\n"
@@ -215,7 +214,7 @@ msgstr ""
"haben, ist entweder kein Bild oder defekt."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -524,71 +523,71 @@ msgstr ""
"Kommentar: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Es ist mindestens eine Rolle nötig"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Exportdatei erforderlich"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Ungültiges Exportdatei Format"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "Fehler beim Importieren der Projektdaten"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "Fehler beim Importieren der Listen von Projektattributen"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "Fehler beim Importieren der vorgegebenen Projekt Attributwerte "
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "Fehler beim Importieren der Kundenattribute"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "Fehler beim Importieren der Rollen"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "Fehler beim Importieren der Mitgliedschaften"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "Fehler beim Import der Sprints"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "Fehler beim Importieren von Wiki Seiten"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "Fehler beim Importieren von Wiki Links"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "Fehler beim Importieren der Tickets"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "Fehler beim Importieren der User-Stories"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "Fehler beim Importieren der Aufgaben"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "Fehler beim Importieren der Schlagworte"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "Fehler beim Importieren der Chroniken"
@@ -871,7 +870,7 @@ msgstr "Authentifizierung erforderlich"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "Name"
@@ -1366,13 +1365,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Sie haben keine Berechtigungen für diese Ansicht"
@@ -1402,7 +1401,7 @@ msgstr "Besitzer"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "Projekt"
@@ -1441,7 +1440,7 @@ msgstr "wurde verworfen"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "Reihenfolge"
@@ -1725,7 +1724,7 @@ msgstr "Likes"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "Slug"
@@ -2830,50 +2829,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Voreingestellte Optionen"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Status für User-Stories"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Punkte"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Aufgaben Status"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Ticket Status"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Ticket Arten"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioritäten"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Gewichtung"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Rollen"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Zukünftiger Sprint"
@@ -3796,7 +3817,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "Berechtigungen"
@@ -3812,14 +3833,6 @@ msgstr "Ungültiger Benutzername. Versuchen Sie es mit einem anderen."
msgid "Username or password does not matches user."
msgstr "Benutzername oder Passwort stimmen mit keinem Benutzer überein."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/en/LC_MESSAGES/django.po b/taiga/locale/en/LC_MESSAGES/django.po
index 8bfe1422..7e173433 100644
--- a/taiga/locale/en/LC_MESSAGES/django.po
+++ b/taiga/locale/en/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
"PO-Revision-Date: 2015-03-25 20:09+0100\n"
"Last-Translator: Taiga Dev Team \n"
"Language-Team: Taiga Dev Team \n"
@@ -176,7 +176,7 @@ msgid ""
msgstr ""
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -457,71 +457,71 @@ msgid ""
" "
msgstr ""
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr ""
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr ""
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr ""
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr ""
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr ""
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr ""
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr ""
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr ""
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr ""
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr ""
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr ""
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr ""
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr ""
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr ""
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr ""
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr ""
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr ""
@@ -711,7 +711,7 @@ msgstr ""
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr ""
@@ -1148,13 +1148,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr ""
@@ -1184,7 +1184,7 @@ msgstr ""
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr ""
@@ -1223,7 +1223,7 @@ msgstr ""
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr ""
@@ -1503,7 +1503,7 @@ msgstr ""
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr ""
@@ -2324,50 +2324,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr ""
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr ""
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr ""
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr ""
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr ""
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr ""
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr ""
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr ""
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr ""
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr ""
@@ -3214,7 +3236,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr ""
@@ -3230,14 +3252,6 @@ msgstr ""
msgid "Username or password does not matches user."
msgstr ""
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/es/LC_MESSAGES/django.po b/taiga/locale/es/LC_MESSAGES/django.po
index 00a75a9c..f9b32379 100644
--- a/taiga/locale/es/LC_MESSAGES/django.po
+++ b/taiga/locale/es/LC_MESSAGES/django.po
@@ -16,10 +16,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Spanish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/es/)\n"
"MIME-Version: 1.0\n"
@@ -202,7 +201,7 @@ msgid ""
msgstr "Adjunta una imagen válida. El fichero no es una imagen o está dañada."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -511,71 +510,71 @@ msgstr ""
"\n"
"Comentario: %(comment)s"
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Necesitamos al menos un rol"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Se necesita el fichero con los datos exportados"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Formato de fichero de exportación inválido"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "error importando los datos del proyecto"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "error importando la listados de valores de attributos del proyecto"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "error importando los valores por defecto de los atributos del proyecto"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "error importando los atributos personalizados"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "error importando los roles"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "error importando los miembros"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "error importando los sprints"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "error importando las páginas del wiki"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "error importando los enlaces del wiki"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "error importando las peticiones"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "error importando las historias de usuario"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "error importando las tareas"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "error importando las etiquetas"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "error importando los timelines"
@@ -853,7 +852,7 @@ msgstr "Se requiere autenticación"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "nombre"
@@ -1346,7 +1345,7 @@ msgstr "El usuario no existe"
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
@@ -1354,7 +1353,7 @@ msgstr ""
"El proyecto debe tener un dueño y al menos uno de los usuarios debe ser un "
"administrador activo"
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "No tienes suficientes permisos para ver esto."
@@ -1384,7 +1383,7 @@ msgstr "Dueño"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "Proyecto"
@@ -1423,7 +1422,7 @@ msgstr "está desactualizado"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "orden"
@@ -1703,7 +1702,7 @@ msgstr "Likes"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2765,50 +2764,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Opciones por defecto"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Estados de historia de usuario"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Puntos"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Estado de tareas"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Estados de peticion"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Tipos de petición"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioridades"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Gravedades"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Roles"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr "No puedes tener más proyectos privados"
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr "No puedes tener más proyectos públicos"
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Sprint futuro"
@@ -3734,7 +3755,7 @@ msgstr "máximo de membresías para cada proyecto privado poseído"
msgid "max number of memberships for each owned public project"
msgstr "máximo de membresías para cada proyecto público poseído"
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "permisos"
@@ -3750,14 +3771,6 @@ msgstr "Nombre de usuario inválido. Prueba con otro."
msgid "Username or password does not matches user."
msgstr "Nombre de usuario o contraseña inválidos."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr "No puedes tener más proyectos privados"
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr "No puedes tener más proyectos públicos"
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/fi/LC_MESSAGES/django.po b/taiga/locale/fi/LC_MESSAGES/django.po
index 6f73ebe2..1d97923b 100644
--- a/taiga/locale/fi/LC_MESSAGES/django.po
+++ b/taiga/locale/fi/LC_MESSAGES/django.po
@@ -9,10 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Finnish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/fi/)\n"
"MIME-Version: 1.0\n"
@@ -187,7 +186,7 @@ msgstr ""
"vioittunut."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -494,71 +493,71 @@ msgstr ""
"\n"
"Kommentti: %(comment)s"
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr ""
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Tarvitaan tiedosto"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Virheellinen tiedostomuoto"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "virhe projektidatan tuonnissa"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "virhe atribuuttilistan tuonnissa"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "virhe oletusarvojen tuonnissa"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "virhe omien arvojen tuonnissa"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "virhe roolien tuonnissa"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "virhe jäsenyyksien tuonnissa"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "virhe kierroksien tuonnissa"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "virhe wiki-sivujen tuonnissa"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "virhe viki-linkkien tuonnissa"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "virhe pyyntöjen tuonnissa"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "virhe käyttäjätarinoiden tuonnissa"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "virhe tehtävien tuonnissa"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "virhe avainsanojen sisäänlukemisessa"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "virhe aikajanojen tuonnissa"
@@ -833,7 +832,7 @@ msgstr ""
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "nimi"
@@ -1305,13 +1304,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Sinulla ei ole oikeuksia nähdä tätä."
@@ -1341,7 +1340,7 @@ msgstr "omistaja"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "projekti"
@@ -1380,7 +1379,7 @@ msgstr "on poistettu"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "order"
@@ -1660,7 +1659,7 @@ msgstr ""
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "hukka-aika"
@@ -2727,50 +2726,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Oletusoptiot"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Käyttäjätarinatilat"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Pisteet"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Tehtävien tilat"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Pyyntöjen tilat"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "pyyntötyypit"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Kiireellisyydet"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Vakavuudet"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Roolit"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Tuleva kierros"
@@ -3672,7 +3693,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "oikeudet"
@@ -3688,14 +3709,6 @@ msgstr "Tuntematon käyttäjänimi, yritä uudelleen."
msgid "Username or password does not matches user."
msgstr "Käyttäjätunnus tai salasana eivät ole oikein."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/fr/LC_MESSAGES/django.po b/taiga/locale/fr/LC_MESSAGES/django.po
index 67c37f2f..9533481a 100644
--- a/taiga/locale/fr/LC_MESSAGES/django.po
+++ b/taiga/locale/fr/LC_MESSAGES/django.po
@@ -22,10 +22,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: French (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -211,7 +210,7 @@ msgstr ""
"image ou était une image corrompue."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -528,72 +527,72 @@ msgstr ""
" Commentaire : %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Veuillez sélectionner au moins un rôle."
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Fichier de dump obligatoire"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Format de dump invalide"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "Erreur lors de l'importation de données"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "erreur lors de l'importation des listes des attributs de projet"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr ""
"erreur lors de l'importation des valeurs par défaut des attributs de projet"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "Erreur à l'importation des champs personnalisés"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "Erreur à l'importation des rôles"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "Erreur à l'importation des groupes d'utilisateurs"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "Erreur lors de l'importation des sprints."
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "Erreur à l'importation des pages Wiki"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "Erreur à l'importation des liens Wiki"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "erreur à l'importation des problèmes"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "erreur à l'importation des histoires utilisateur"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "Erreur lors de l'importation des tâches."
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "erreur lors de l'importation des mots-clés"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "erreur lors de l'import des timelines"
@@ -857,7 +856,7 @@ msgstr "Authentification requise"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "nom"
@@ -1318,13 +1317,13 @@ msgstr "L'utilisateur n'existe pas"
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Vous n'avez pas les permissions pour consulter cet élément"
@@ -1354,7 +1353,7 @@ msgstr "propriétaire"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "projet"
@@ -1393,7 +1392,7 @@ msgstr "est obsolète"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "ordre"
@@ -1673,7 +1672,7 @@ msgstr "Aime"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2524,50 +2523,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Options par défaut"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Etats de la User Story"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Points"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Etats des tâches"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Statuts des problèmes"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Types de problèmes"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Priorités"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Sévérités"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Rôles"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Sprint futurs"
@@ -3460,7 +3481,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "permissions"
@@ -3476,14 +3497,6 @@ msgstr "Nom d'utilisateur invalide. Essayez avec un autre nom."
msgid "Username or password does not matches user."
msgstr "Aucun utilisateur avec ce nom ou ce mot de passe."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/it/LC_MESSAGES/django.po b/taiga/locale/it/LC_MESSAGES/django.po
index ba84680a..1054bf89 100644
--- a/taiga/locale/it/LC_MESSAGES/django.po
+++ b/taiga/locale/it/LC_MESSAGES/django.po
@@ -14,10 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Italian (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/it/)\n"
"MIME-Version: 1.0\n"
@@ -196,7 +195,7 @@ msgstr ""
"o l'immagine potrebbe essere corrotta. "
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -518,72 +517,72 @@ msgstr ""
"\n"
"Commento: %(comment)s"
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "C'è bisogno di almeno un ruolo"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "E' richiesto un file di dump"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Formato di dump invalido"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "Errore nell'importazione del progetto dati"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "Errore nell'importazione della lista degli attributi di progetto"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr ""
"Errore nell'importazione dei valori predefiniti degli attributi del progetto."
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "Errore nell'importazione degli attributi personalizzati"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "Errore nell'importazione i ruoli"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "Errore nell'importazione delle iscrizioni"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "errore nell'importazione degli sprints"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "Errore nell'importazione delle pagine wiki"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "Errore nell'importazione dei link di wiki"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "errore nell'importazione dei problemi"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "Errore nell'importazione delle user story"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "Errore nell'importazione dei compiti "
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "Errore nell'importazione dei tags"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "Errore nell'importazione delle timelines"
@@ -920,7 +919,7 @@ msgstr "E' richiesta l'autenticazione"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "nome"
@@ -1439,13 +1438,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Non hai il permesso di vedere questo elemento."
@@ -1475,7 +1474,7 @@ msgstr "proprietario"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "progetto"
@@ -1514,7 +1513,7 @@ msgstr "non approvato"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "ordine"
@@ -1794,7 +1793,7 @@ msgstr "Piaciuto"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "lumaca"
@@ -3002,50 +3001,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Opzioni predefinite"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Stati della storia utente"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Punti"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Stati del compito"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Stati del problema"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Tipologie del problema"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Priorità"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Criticità"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Ruoli"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Sprint futuri"
@@ -3972,7 +3993,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "permessi"
@@ -3988,14 +4009,6 @@ msgstr "Nome utente non valido. Provane uno diverso."
msgid "Username or password does not matches user."
msgstr "Il nome utente o la password non corrispondono all'utente."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/nl/LC_MESSAGES/django.po b/taiga/locale/nl/LC_MESSAGES/django.po
index b1172cc3..e2543498 100644
--- a/taiga/locale/nl/LC_MESSAGES/django.po
+++ b/taiga/locale/nl/LC_MESSAGES/django.po
@@ -9,10 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Dutch (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/nl/)\n"
"MIME-Version: 1.0\n"
@@ -196,7 +195,7 @@ msgstr ""
"een afbeelding ofwel een corrupte afbeelding."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -507,71 +506,71 @@ msgstr ""
" Commentaar: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "We hadden minstens één rol nodig"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Dump file nodig"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Ongeldig dump formaat"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "fout bij het importeren van project data"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "fout bij importeren van project attributenlijst"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "fout bij importeren van standaard projectattributen waarden"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "fout bij importeren eigen attributen"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "fout bij importeren rollen"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "fout bij importeren lidmaatschappen"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "fout bij importeren sprints"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "fout bij importeren wiki pagina's"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "fout bij importeren wiki links"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "fout bij importeren issues"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "fout bij importeren user stories"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "fout bij importeren taken"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "fout bij importeren tags"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "fout bij importeren tijdlijnen"
@@ -783,7 +782,7 @@ msgstr ""
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "naam"
@@ -1239,13 +1238,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Je hebt geen toestamming om dat te bekijken."
@@ -1275,7 +1274,7 @@ msgstr "eigenaar"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "project"
@@ -1314,7 +1313,7 @@ msgstr "is verouderd"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "volgorde"
@@ -1596,7 +1595,7 @@ msgstr "Personen die dit leuk vinden"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2447,50 +2446,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Standaard opties"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Status van User story"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Punten"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Statussen van taken"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Statussen van Issues"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Types van issue"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioriteiten"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Ernstniveaus"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Rollen"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Toekomstige sprint"
@@ -3365,7 +3386,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "toestemmingen"
@@ -3381,14 +3402,6 @@ msgstr "Ongeldige gebruikersnaam. Probeer met een andere."
msgid "Username or password does not matches user."
msgstr "Gebruikersnaam of wachtwoord stemt niet overeen met gebruiker."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/pl/LC_MESSAGES/django.po b/taiga/locale/pl/LC_MESSAGES/django.po
index 01eeb2dc..f205e65f 100644
--- a/taiga/locale/pl/LC_MESSAGES/django.po
+++ b/taiga/locale/pl/LC_MESSAGES/django.po
@@ -10,10 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Polish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/pl/)\n"
"MIME-Version: 1.0\n"
@@ -190,7 +189,7 @@ msgstr ""
"jest uszkodzony."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -508,71 +507,71 @@ msgstr ""
" Komentarz: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Potrzeba conajmiej jednej roli"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Wymagany plik zrzutu"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Nieprawidłowy format zrzutu"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "błąd w trakcie importu danych projektu"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "błąd w trakcie importu atrybutów projektu"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "błąd w trakcie importu domyślnych atrybutów projektu"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "błąd w trakcie importu niestandardowych atrybutów"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "błąd w trakcie importu ról"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "błąd w trakcie importu członkostw"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "błąd w trakcie importu sprintów"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "błąd w trakcie importu stron Wiki"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "błąd w trakcie importu linków Wiki"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "błąd w trakcie importu zgłoszeń"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "błąd w trakcie importu historyjek użytkownika"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "błąd w trakcie importu zadań"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "błąd w trakcie importu tagów"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "błąd w trakcie importu osi czasu"
@@ -851,7 +850,7 @@ msgstr ""
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "nazwa"
@@ -1347,13 +1346,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Nie masz uprawnień by to zobaczyć."
@@ -1383,7 +1382,7 @@ msgstr "właściciel"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "projekt"
@@ -1422,7 +1421,7 @@ msgstr "jest przestarzałe"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "kolejność"
@@ -1702,7 +1701,7 @@ msgstr ""
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2784,50 +2783,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Domyślne opcje"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Statusy historyjek użytkownika"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Punkty"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Statusy zadań"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Statusy zgłoszeń"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Typu zgłoszeń"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Priorytety"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Ważność"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Role"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Przyszły sprint"
@@ -3736,7 +3757,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "uprawnienia"
@@ -3752,14 +3773,6 @@ msgstr "Niepoprawna nazwa użytkownika. Spróbuj podać inną."
msgid "Username or password does not matches user."
msgstr "Nazwa użytkownika lub hasło są nieprawidłowe"
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/pt_BR/LC_MESSAGES/django.po b/taiga/locale/pt_BR/LC_MESSAGES/django.po
index ca6d64ba..41b4e7b3 100644
--- a/taiga/locale/pt_BR/LC_MESSAGES/django.po
+++ b/taiga/locale/pt_BR/LC_MESSAGES/django.po
@@ -19,10 +19,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/taiga-agile-llc/"
"taiga-back/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -197,7 +196,7 @@ msgstr ""
"está corrompido."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -516,71 +515,71 @@ msgstr ""
" Comentário: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Nós precisamos de pelo menos uma função"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Necessário de arquivo de restauração"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Formato de aquivo de restauração inválido"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "erro ao importar informações de projeto"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "erro importando lista de atributos do projeto"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "erro importando valores de atributos do projeto padrão"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "erro importando atributos personalizados"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "erro importando funcões"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "erro importando filiações"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "erro importando sprints"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "erro importando páginas wiki"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "erro importando wiki links"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "erro importando casos"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "erro importando user stories"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "erro importando tarefas"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "erro importando tags"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "erro importando linha do tempo"
@@ -858,7 +857,7 @@ msgstr "Autenticação necessária"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "Nome"
@@ -1353,13 +1352,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Você não tem permissão para ver isso"
@@ -1389,7 +1388,7 @@ msgstr "dono"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "projeto"
@@ -1428,7 +1427,7 @@ msgstr "está obsoleto"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "ordem"
@@ -1708,7 +1707,7 @@ msgstr "Curtidas"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slug"
@@ -2768,50 +2767,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Opções padrão"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Status de user story"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Pontos"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Status de tarefas"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Status de casos"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Tipos de casos"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioridades"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Severidades"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Funções"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Sprint futuro"
@@ -3715,7 +3736,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "permissões"
@@ -3731,14 +3752,6 @@ msgstr "Usuário inválido. Tente com um diferente."
msgid "Username or password does not matches user."
msgstr "Usuário ou senha não correspondem ao usuário"
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/ru/LC_MESSAGES/django.po b/taiga/locale/ru/LC_MESSAGES/django.po
index 437a2093..ddcdfa3c 100644
--- a/taiga/locale/ru/LC_MESSAGES/django.po
+++ b/taiga/locale/ru/LC_MESSAGES/django.po
@@ -15,10 +15,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Russian (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -200,7 +199,7 @@ msgstr ""
"изображение, либо не корректное изображение."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -518,71 +517,71 @@ msgstr ""
" Комментарий: %(comment)s\n"
" "
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Нам была нужна хотя бы одна роль"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Необходим дамп-файл"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Неправильный формат дампа"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "ошибка при импорте данных проекта"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "ошибка при импорте списков свойств проекта"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "ошибка при импорте значений по умолчанию свойств проекта"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "ошибка при импорте пользовательских свойств"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "ошибка при импорте ролей"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "ошибка при импорте членства"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "ошибка при импорте спринтов"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "ошибка при импорте вики-страниц"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "ошибка при импорте вики-ссылок"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "ошибка при импорте запросов"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "ошибка импорта историй от пользователей"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "ошибка импорта задач"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "ошибка импорта тэгов"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "ошибка импорта хронологии проекта"
@@ -858,7 +857,7 @@ msgstr "Необходима аутентификация"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "имя"
@@ -1354,13 +1353,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "У вас нет разрешения на просмотр."
@@ -1390,7 +1389,7 @@ msgstr "владелец"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "проект"
@@ -1429,7 +1428,7 @@ msgstr "устаревшее"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "порядок"
@@ -1713,7 +1712,7 @@ msgstr "Лайки"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "ссылочное имя"
@@ -2783,50 +2782,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Параметры по умолчанию"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Статусу пользовательских историй"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Очки"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Статусы задачи"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Статусы запроса"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Типы запроса"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Приоритеты"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Степени важности"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Роли"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Будущий спринт"
@@ -3730,7 +3751,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "разрешения"
@@ -3746,14 +3767,6 @@ msgstr "Неверное имя пользователя. Попробуйте
msgid "Username or password does not matches user."
msgstr "Имя пользователя или пароль не соответствуют пользователю."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/sv/LC_MESSAGES/django.po b/taiga/locale/sv/LC_MESSAGES/django.po
index 42b6dac3..d217159d 100644
--- a/taiga/locale/sv/LC_MESSAGES/django.po
+++ b/taiga/locale/sv/LC_MESSAGES/django.po
@@ -8,10 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Swedish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/sv/)\n"
"MIME-Version: 1.0\n"
@@ -189,7 +188,7 @@ msgstr ""
"eller en skadad bild."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -492,71 +491,71 @@ msgid ""
" "
msgstr ""
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "Vi behöver minst en roll"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "Behöver en hämtningsfil"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Invalid hämtningsfilformat"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "fel vid import av projektdata"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "fel vid import av en lista på projektegenskaper"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "fel vid import av standard projektegenskapsvärden"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "fel vid import av anpassade egenskaper"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "fel vid importering av roller"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "fel vid import av medlemskap"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "felaktig import av sprintar"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "vel vid import av wiki-sidor"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "fel vid import av wiki-länkar"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "fel vid import av ärenden"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "fel vid import av användarhistorier"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "fel vid import av uppgifter"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "fel vid importering av taggar"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "fel vid importering av tidslinje"
@@ -746,7 +745,7 @@ msgstr "Verifiering krävs"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "namn"
@@ -1194,13 +1193,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Du har inte behörighet att se det. "
@@ -1230,7 +1229,7 @@ msgstr "ägare"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "projekt"
@@ -1269,7 +1268,7 @@ msgstr "undviks"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "sortera"
@@ -1549,7 +1548,7 @@ msgstr "Gillar"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "slugg"
@@ -2370,50 +2369,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Standardval"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Status för användarhistorien"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Poäng"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Status för uppgifter"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Status för ärenden"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Ärendetyper"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Prioritet"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Allvarsgrad"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Roller"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Framtidig sprint"
@@ -3280,7 +3301,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "behörigheter"
@@ -3296,14 +3317,6 @@ msgstr "Felaktigt användarnamn. Försök med ett annat användarnamn."
msgid "Username or password does not matches user."
msgstr "Användarnamn eller lösenord passar inte."
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/tr/LC_MESSAGES/django.po b/taiga/locale/tr/LC_MESSAGES/django.po
index 591cb691..fe7cf855 100644
--- a/taiga/locale/tr/LC_MESSAGES/django.po
+++ b/taiga/locale/tr/LC_MESSAGES/django.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-04-04 13:40+0000\n"
-"Last-Translator: catborise \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Turkish (http://www.transifex.com/taiga-agile-llc/taiga-back/"
"language/tr/)\n"
"MIME-Version: 1.0\n"
@@ -196,7 +196,7 @@ msgstr ""
"resim dosyası değil."
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -501,71 +501,71 @@ msgstr ""
"\n"
"Yorumlar: %(comment)s"
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "En azından bir role ihtiyacımız var"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "İhtiyaç duyulan döküm dosyası"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "Geçersiz döküm biçemi"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "İçeri aktarılan proje verisinde hata"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "proje öznitelikleri listesi içeriye aktarılırken hata oluştu"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "varsayılan proje öznitelikleri değerlerinin içeriye aktarımında hata"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "özel öznitelikler içeri aktarılırken hata"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "İçeri aktarılan rollerde hata"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "İçeri aktarılan üyeliklerde hata"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "İçeri aktarılan sprintlerde hata"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "İçeri aktarılan wiki sayfalarında hata"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "İçeri aktarılan wiki bağlantılarında hata"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "İçeri aktarılan taleplerde hata"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "İçeri aktarılan kullanıcı hikayelerinde hata"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "İçeri aktarılan görevlerde hata"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "İçeri aktarılan etiketlerde hata"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "zaman çizelgesi içeri aktarılırken hata"
@@ -840,7 +840,7 @@ msgstr "Kimlik doğrulama gerekli"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "isim"
@@ -1300,13 +1300,13 @@ msgstr "Kullanıcı mevcut değil"
msgid "The user must be already a project member"
msgstr "Kullanıcı zaten proje üyesi durumunda"
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "Görebilmek için yetkiniz yok."
@@ -1336,7 +1336,7 @@ msgstr "sahip"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "proje"
@@ -1375,7 +1375,7 @@ msgstr "kaldırıldı"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "sıra"
@@ -1655,7 +1655,7 @@ msgstr "Beğeniler"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "satır"
@@ -2542,50 +2542,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "Varsayılan ayarlar"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "Kullanıcı hikayelerinin durumları"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "Puanlar"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "Görevlerin durumları"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "Taleplerin durumları"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "Taleplerin tipleri"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "Öncelikler"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "Önem dereceleri"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "Roller"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "Gelecek sprint"
@@ -3447,7 +3469,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "izinler"
@@ -3463,14 +3485,6 @@ msgstr "Geçersiz kullanıcı adı. Farklı birşeyle yeniden deneyin."
msgid "Username or password does not matches user."
msgstr "Kullanıcı adı veya parola kullanıcıyla uyuşmuyor"
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/locale/zh-Hant/LC_MESSAGES/django.po b/taiga/locale/zh-Hant/LC_MESSAGES/django.po
index 86d2219b..0734e55d 100644
--- a/taiga/locale/zh-Hant/LC_MESSAGES/django.po
+++ b/taiga/locale/zh-Hant/LC_MESSAGES/django.po
@@ -11,10 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-05 19:23+0200\n"
-"PO-Revision-Date: 2016-03-30 10:59+0000\n"
-"Last-Translator: Alejandro Alonso Fernández \n"
+"POT-Creation-Date: 2016-04-08 13:23+0200\n"
+"PO-Revision-Date: 2016-04-08 11:23+0000\n"
+"Last-Translator: Taiga Dev Team \n"
"Language-Team: Chinese Traditional (http://www.transifex.com/taiga-agile-llc/"
"taiga-back/language/zh-Hant/)\n"
"MIME-Version: 1.0\n"
@@ -183,7 +182,7 @@ msgid ""
msgstr "上傳有效圖片,你所上傳的檔案非圖檔或已損壞"
#: taiga/base/api/mixins.py:255 taiga/base/exceptions.py:209
-#: taiga/hooks/api.py:68 taiga/projects/api.py:641
+#: taiga/hooks/api.py:68 taiga/projects/api.py:642
#: taiga/projects/issues/api.py:233 taiga/projects/mixins/ordering.py:58
#: taiga/projects/tasks/api.py:152 taiga/projects/tasks/api.py:174
#: taiga/projects/userstories/api.py:218 taiga/projects/userstories/api.py:238
@@ -499,71 +498,71 @@ msgstr ""
"\n"
"評論: %(comment)s"
-#: taiga/export_import/api.py:114
+#: taiga/export_import/api.py:119
msgid "We needed at least one role"
msgstr "我們至少需要一個角色"
-#: taiga/export_import/api.py:216
+#: taiga/export_import/api.py:309
msgid "Needed dump file"
msgstr "需要的堆存檔案"
-#: taiga/export_import/api.py:224
+#: taiga/export_import/api.py:316
msgid "Invalid dump format"
msgstr "無效堆存格式"
-#: taiga/export_import/dump_service.py:106
+#: taiga/export_import/dump_service.py:115
msgid "error importing project data"
msgstr "滙入重要專案資料出錯"
-#: taiga/export_import/dump_service.py:119
+#: taiga/export_import/dump_service.py:128
msgid "error importing lists of project attributes"
msgstr "滙入標籤出錯"
-#: taiga/export_import/dump_service.py:124
+#: taiga/export_import/dump_service.py:133
msgid "error importing default project attributes values"
msgstr "滙入預設專案屬性數值出錯"
-#: taiga/export_import/dump_service.py:134
+#: taiga/export_import/dump_service.py:143
msgid "error importing custom attributes"
msgstr "滙入客制性屬出錯"
-#: taiga/export_import/dump_service.py:139
+#: taiga/export_import/dump_service.py:148
msgid "error importing roles"
msgstr "滙入角色出錯"
-#: taiga/export_import/dump_service.py:154
+#: taiga/export_import/dump_service.py:163
msgid "error importing memberships"
msgstr "滙入成員資格出錯"
-#: taiga/export_import/dump_service.py:159
+#: taiga/export_import/dump_service.py:168
msgid "error importing sprints"
msgstr "滙入衝刺任務出錯"
-#: taiga/export_import/dump_service.py:164
+#: taiga/export_import/dump_service.py:173
msgid "error importing wiki pages"
msgstr "滙入維基頁出錯"
-#: taiga/export_import/dump_service.py:169
+#: taiga/export_import/dump_service.py:178
msgid "error importing wiki links"
msgstr "滙入維基連結出錯"
-#: taiga/export_import/dump_service.py:174
+#: taiga/export_import/dump_service.py:183
msgid "error importing issues"
msgstr "滙入問題出錯"
-#: taiga/export_import/dump_service.py:179
+#: taiga/export_import/dump_service.py:188
msgid "error importing user stories"
msgstr "滙入使用者故事出錯"
-#: taiga/export_import/dump_service.py:184
+#: taiga/export_import/dump_service.py:193
msgid "error importing tasks"
msgstr "滙入任務出錯"
-#: taiga/export_import/dump_service.py:189
+#: taiga/export_import/dump_service.py:198
msgid "error importing tags"
msgstr "滙入標籤出錯"
-#: taiga/export_import/dump_service.py:193
+#: taiga/export_import/dump_service.py:202
msgid "error importing timelines"
msgstr "滙入時間軸出錯"
@@ -838,7 +837,7 @@ msgstr "要求取得授權"
#: taiga/projects/models.py:536 taiga/projects/models.py:573
#: taiga/projects/models.py:596 taiga/projects/models.py:619
#: taiga/projects/models.py:654 taiga/projects/models.py:677
-#: taiga/users/models.py:289 taiga/webhooks/models.py:28
+#: taiga/users/models.py:292 taiga/webhooks/models.py:28
msgid "name"
msgstr "姓名"
@@ -1327,13 +1326,13 @@ msgstr ""
msgid "The user must be already a project member"
msgstr ""
-#: taiga/projects/api.py:671
+#: taiga/projects/api.py:672
msgid ""
"The project must have an owner and at least one of the users must be an "
"active admin"
msgstr ""
-#: taiga/projects/api.py:705
+#: taiga/projects/api.py:706
msgid "You don't have permisions to see that."
msgstr "您無觀看權限"
@@ -1363,7 +1362,7 @@ msgstr "所有者"
#: taiga/projects/notifications/models.py:73
#: 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/wiki/models.py:68 taiga/users/models.py:302
+#: taiga/projects/wiki/models.py:68 taiga/users/models.py:305
msgid "project"
msgstr "專案"
@@ -1402,7 +1401,7 @@ msgstr "棄用"
#: taiga/projects/models.py:513 taiga/projects/models.py:540
#: taiga/projects/models.py:575 taiga/projects/models.py:598
#: taiga/projects/models.py:623 taiga/projects/models.py:656
-#: taiga/projects/wiki/models.py:73 taiga/users/models.py:297
+#: taiga/projects/wiki/models.py:73 taiga/users/models.py:300
msgid "order"
msgstr "次序"
@@ -1682,7 +1681,7 @@ msgstr "喜歡"
#: 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:621 taiga/projects/models.py:679
-#: taiga/projects/wiki/models.py:32 taiga/users/models.py:291
+#: taiga/projects/wiki/models.py:32 taiga/users/models.py:294
msgid "slug"
msgstr "代稱"
@@ -2753,50 +2752,72 @@ msgstr ""
msgid "At least one user must be an active admin for this project."
msgstr ""
-#: taiga/projects/serializers.py:394
+#: taiga/projects/serializers.py:392
msgid "Default options"
msgstr "預設選項"
-#: taiga/projects/serializers.py:395
+#: taiga/projects/serializers.py:393
msgid "User story's statuses"
msgstr "使用者故事狀態"
-#: taiga/projects/serializers.py:396
+#: taiga/projects/serializers.py:394
msgid "Points"
msgstr "點數"
-#: taiga/projects/serializers.py:397
+#: taiga/projects/serializers.py:395
msgid "Task's statuses"
msgstr "任務狀態"
-#: taiga/projects/serializers.py:398
+#: taiga/projects/serializers.py:396
msgid "Issue's statuses"
msgstr "問題狀態"
-#: taiga/projects/serializers.py:399
+#: taiga/projects/serializers.py:397
msgid "Issue's types"
msgstr "問題類型"
-#: taiga/projects/serializers.py:400
+#: taiga/projects/serializers.py:398
msgid "Priorities"
msgstr "優先性"
-#: taiga/projects/serializers.py:401
+#: taiga/projects/serializers.py:399
msgid "Severities"
msgstr "嚴重性"
-#: taiga/projects/serializers.py:402
+#: taiga/projects/serializers.py:400
msgid "Roles"
msgstr "角色"
-#: taiga/projects/services/members.py:147 taiga/users/services.py:625
+#: taiga/projects/services/members.py:116
msgid "You have reached your current limit of memberships for private projects"
msgstr ""
-#: taiga/projects/services/members.py:151 taiga/users/services.py:634
+#: taiga/projects/services/members.py:120
msgid "You have reached your current limit of memberships for public projects"
msgstr ""
+#: taiga/projects/services/projects.py:69
+#: taiga/projects/services/projects.py:106 taiga/users/services.py:582
+msgid "You can't have more private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:73
+#: taiga/projects/services/projects.py:110 taiga/users/services.py:585
+msgid ""
+"This project reaches your current limit of memberships for private projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:77
+#: taiga/projects/services/projects.py:114 taiga/users/services.py:589
+msgid "You can't have more public projects"
+msgstr ""
+
+#: taiga/projects/services/projects.py:81
+#: taiga/projects/services/projects.py:118 taiga/users/services.py:592
+msgid ""
+"This project reaches your current limit of memberships for public projects"
+msgstr ""
+
#: taiga/projects/services/stats.py:196
msgid "Future sprint"
msgstr "未來之衝刺"
@@ -3685,7 +3706,7 @@ msgstr ""
msgid "max number of memberships for each owned public project"
msgstr ""
-#: taiga/users/models.py:294
+#: taiga/users/models.py:297
msgid "permissions"
msgstr "許可"
@@ -3701,14 +3722,6 @@ msgstr "無效使用者名稱,請重試其它名稱 "
msgid "Username or password does not matches user."
msgstr "用戶名稱與密碼不符"
-#: taiga/users/services.py:602
-msgid "You can't have more private projects"
-msgstr ""
-
-#: taiga/users/services.py:612
-msgid "You can't have more public projects"
-msgstr ""
-
#: taiga/users/templates/emails/change_email-body-html.jinja:4
#, python-format
msgid ""
diff --git a/taiga/projects/api.py b/taiga/projects/api.py
index 07aaaab1..a7c3aa61 100644
--- a/taiga/projects/api.py
+++ b/taiga/projects/api.py
@@ -378,13 +378,13 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin,
project = self.get_object()
self.check_permissions(request, "transfer_accept", project)
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(
- request.user,
+ (can_transfer, error_message) = services.check_if_project_can_be_transfered(
project,
+ request.user,
)
- if not enough_slots:
+ if not can_transfer:
members = project.memberships.count()
- raise exc.NotEnoughSlotsForProject(project.is_private, members, not_enough_slots_error)
+ raise exc.NotEnoughSlotsForProject(project.is_private, members, error_message)
reason = request.DATA.get('reason', None)
services.accept_project_transfer(project, request.user, token, reason)
@@ -422,12 +422,13 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin,
obj.owner = self.request.user
obj.template = self.request.QUERY_PARAMS.get('template', None)
- # Validate if the owner have enought slots to create or update the project
- # TODO: Move to the ProjectAdminSerializer
- (enough_slots, not_enough_slots_error) = users_service.has_available_slot_for_project(obj.owner, obj)
- if not enough_slots:
- members = max(obj.memberships.count(), 1)
- raise exc.NotEnoughSlotsForProject(obj.is_private, members, not_enough_slots_error)
+ if not obj.id or self.get_object().is_private != obj.is_private:
+ # Validate if the owner have enought slots to create the project
+ # or if you are changing the privacity
+ (can_create_or_update, error_message) = services.check_if_project_can_be_created_or_updated(obj)
+ if not can_create_or_update:
+ members = max(obj.memberships.count(), 1)
+ raise exc.NotEnoughSlotsForProject(obj.is_private, members, error_message)
self._set_base_permissions(obj)
super().pre_save(obj)
diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py
index 829eec89..95f05703 100644
--- a/taiga/projects/serializers.py
+++ b/taiga/projects/serializers.py
@@ -373,8 +373,6 @@ class ProjectDetailAdminSerializer(ProjectDetailSerializer):
return services.get_max_memberships_for_project(obj)
-
-
######################################################
## Liked
######################################################
diff --git a/taiga/projects/services/__init__.py b/taiga/projects/services/__init__.py
index a4a1d465..d813423d 100644
--- a/taiga/projects/services/__init__.py
+++ b/taiga/projects/services/__init__.py
@@ -39,17 +39,19 @@ from .members import create_members_in_bulk
from .members import get_members_from_bulk
from .members import remove_user_from_project, project_has_valid_admins, can_user_leave_project
from .members import get_max_memberships_for_project, get_total_project_memberships
-from .members import check_if_project_privacity_can_be_changed
from .members import check_if_project_can_have_more_memberships
from .modules_config import get_modules_config
+from .projects import check_if_project_privacity_can_be_changed
+from .projects import check_if_project_can_be_created_or_updated
+from .projects import check_if_project_can_be_transfered
+
from .stats import get_stats_for_project_issues
from .stats import get_stats_for_project
from .stats import get_member_stats_for_project
from .tags_colors import update_project_tags_colors_handler
-from .modules_config import get_modules_config
from .transfer import request_project_transfer, start_project_transfer
from .transfer import accept_project_transfer, reject_project_transfer
diff --git a/taiga/projects/services/members.py b/taiga/projects/services/members.py
index 1174bdf3..039ffd32 100644
--- a/taiga/projects/services/members.py
+++ b/taiga/projects/services/members.py
@@ -102,45 +102,14 @@ def get_total_project_memberships(project):
return project.memberships.count()
-ERROR_MAX_PUBLIC_PROJECTS_MEMBERSHIPS = 'max_public_projects_memberships'
-ERROR_MAX_PRIVATE_PROJECTS_MEMBERSHIPS = 'max_private_projects_memberships'
-ERROR_MAX_PUBLIC_PROJECTS = 'max_public_projects'
-ERROR_MAX_PRIVATE_PROJECTS = 'max_private_projects'
-
-def check_if_project_privacity_can_be_changed(project):
- """Return if the project privacity can be changed from private to public or viceversa.
+def check_if_project_can_have_more_memberships(project, total_new_memberships):
+ """Return if a project can have more n new memberships.
:param project: A project object.
+ :param total_new_memberships: the total of new memberships to add (int).
- :return: True if it can be changed or False if can't.
+ :return: {bool, error_mesage} return a tuple (can add new members?, error message).
"""
- if project.is_private:
- current_memberships = project.memberships.count()
- max_memberships = project.owner.max_memberships_public_projects
- error_members_exceeded = ERROR_MAX_PUBLIC_PROJECTS_MEMBERSHIPS
-
- current_projects = project.owner.owned_projects.filter(is_private=False).count()
- max_projects = project.owner.max_public_projects
- error_project_exceeded = ERROR_MAX_PUBLIC_PROJECTS
- else:
- current_memberships = project.memberships.count()
- max_memberships = project.owner.max_memberships_private_projects
- error_members_exceeded = ERROR_MAX_PRIVATE_PROJECTS_MEMBERSHIPS
-
- current_projects = project.owner.owned_projects.filter(is_private=True).count()
- max_projects = project.owner.max_private_projects
- error_project_exceeded = ERROR_MAX_PRIVATE_PROJECTS
-
- if max_memberships is not None and current_memberships > max_memberships:
- return {'can_be_updated': False, 'reason': error_members_exceeded}
-
- if max_projects is not None and current_projects >= max_projects:
- return {'can_be_updated': False, 'reason': error_project_exceeded}
-
- return {'can_be_updated': True, 'reason': None}
-
-
-def check_if_project_can_have_more_memberships(project, total_new_memberships):
if project.is_private:
total_memberships = project.memberships.count() + total_new_memberships
max_memberships = project.owner.max_memberships_private_projects
diff --git a/taiga/projects/services/projects.py b/taiga/projects/services/projects.py
new file mode 100644
index 00000000..306c585f
--- /dev/null
+++ b/taiga/projects/services/projects.py
@@ -0,0 +1,126 @@
+# Copyright (C) 2014-2016 Andrey Antukh
+# Copyright (C) 2014-2016 Jesús Espino
+# Copyright (C) 2014-2016 David Barragán
+# Copyright (C) 2014-2016 Alejandro Alonso
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+from django.utils.translation import ugettext as _
+
+
+ERROR_MAX_PUBLIC_PROJECTS_MEMBERSHIPS = 'max_public_projects_memberships'
+ERROR_MAX_PRIVATE_PROJECTS_MEMBERSHIPS = 'max_private_projects_memberships'
+ERROR_MAX_PUBLIC_PROJECTS = 'max_public_projects'
+ERROR_MAX_PRIVATE_PROJECTS = 'max_private_projects'
+
+def check_if_project_privacity_can_be_changed(project):
+ """Return if the project privacity can be changed from private to public or viceversa.
+
+ :param project: A project object.
+
+ :return: A dict like this {'can_be_updated': bool, 'reason': error message}.
+ """
+ if project.is_private:
+ current_memberships = project.memberships.count()
+ max_memberships = project.owner.max_memberships_public_projects
+ error_memberships_exceeded = ERROR_MAX_PUBLIC_PROJECTS_MEMBERSHIPS
+
+ current_projects = project.owner.owned_projects.filter(is_private=False).count()
+ max_projects = project.owner.max_public_projects
+ error_project_exceeded = ERROR_MAX_PUBLIC_PROJECTS
+ else:
+ current_memberships = project.memberships.count()
+ max_memberships = project.owner.max_memberships_private_projects
+ error_memberships_exceeded = ERROR_MAX_PRIVATE_PROJECTS_MEMBERSHIPS
+
+ current_projects = project.owner.owned_projects.filter(is_private=True).count()
+ max_projects = project.owner.max_private_projects
+ error_project_exceeded = ERROR_MAX_PRIVATE_PROJECTS
+
+ if max_memberships is not None and current_memberships > max_memberships:
+ return {'can_be_updated': False, 'reason': error_memberships_exceeded}
+
+ if max_projects is not None and current_projects >= max_projects:
+ return {'can_be_updated': False, 'reason': error_project_exceeded}
+
+ return {'can_be_updated': True, 'reason': None}
+
+
+def check_if_project_can_be_created_or_updated(project):
+ """Return if the project can be create or update (the privacity).
+
+ :param project: A project object.
+
+ :return: {bool, error_mesage} return a tuple (can be created or updated, error message).
+ """
+ if project.is_private:
+ current_projects = project.owner.owned_projects.filter(is_private=True).count()
+ max_projects = project.owner.max_private_projects
+ error_project_exceeded = _("You can't have more private projects")
+
+ current_memberships = project.memberships.count() or 1
+ max_memberships = project.owner.max_memberships_private_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for private projects")
+ else:
+ current_projects = project.owner.owned_projects.filter(is_private=False).count()
+ max_projects = project.owner.max_public_projects
+ error_project_exceeded = _("You can't have more public projects")
+
+ current_memberships = project.memberships.count() or 1
+ max_memberships = project.owner.max_memberships_public_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for public projects")
+
+ if max_projects is not None and current_projects >= max_projects:
+ return (False, error_project_exceeded)
+
+ if max_memberships is not None and current_memberships > max_memberships:
+ return (False, error_memberships_exceeded)
+
+ return (True, None)
+
+
+def check_if_project_can_be_transfered(project, new_owner):
+ """Return if the project can be transfered to another member.
+
+ :param project: A project object.
+ :param new_owner: The new owner.
+
+ :return: {bool, error_mesage} return a tuple (can be transfered?, error message).
+ """
+ if project.owner == new_owner:
+ return (True, None)
+
+ if project.is_private:
+ current_projects = new_owner.owned_projects.filter(is_private=True).count()
+ max_projects = new_owner.max_private_projects
+ error_project_exceeded = _("You can't have more private projects")
+
+ current_memberships = project.memberships.count()
+ max_memberships = new_owner.max_memberships_private_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for private projects")
+ else:
+ current_projects = new_owner.owned_projects.filter(is_private=False).count()
+ max_projects = new_owner.max_public_projects
+ error_project_exceeded = _("You can't have more public projects")
+
+ current_memberships = project.memberships.count()
+ max_memberships = new_owner.max_memberships_public_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for public projects")
+
+ if max_projects is not None and current_projects >= max_projects:
+ return (False, error_project_exceeded)
+
+ if max_memberships is not None and current_memberships > max_memberships:
+ return (False, error_memberships_exceeded)
+
+ return (True, None)
diff --git a/taiga/users/services.py b/taiga/users/services.py
index b18e8b36..7e210275 100644
--- a/taiga/users/services.py
+++ b/taiga/users/services.py
@@ -575,60 +575,26 @@ def get_voted_list(for_user, from_user, type=None, q=None):
]
-def has_available_slot_for_project(user, project, new_members=0):
- # TODO: Refactor: Create one service for every type of action and move to project services
- #
- # - has_available_slot_to_create_new_project()
- # - has_available_slot_to_update_this_project()
- # - has_available_slot_to_transfer_this_project()
- # - has_available_slot_to_import_this_project()
- # - has_available_slot_to_add_members_to_this_project()
-
- (enough, error) = _has_available_slot_for_project_type(user, project)
- if not enough:
- return (enough, error)
- return _has_available_slot_for_project_members(user, project, new_members)
-
-
-def _has_available_slot_for_project_type(user, project):
- if project.is_private:
- if user.max_private_projects is None:
- return (True, None)
-
- current_private_projects = user.owned_projects.filter(is_private=True).exclude(id=project.id).count()
- if current_private_projects < user.max_private_projects:
- return (True, None)
-
- return (False, _("You can't have more private projects"))
+def has_available_slot_for_import_new_project(owner, is_private, total_memberships):
+ if is_private:
+ current_projects = owner.owned_projects.filter(is_private=True).count()
+ max_projects = owner.max_private_projects
+ error_project_exceeded = _("You can't have more private projects")
+ max_memberships = owner.max_memberships_private_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for private projects")
else:
- if user.max_public_projects is None:
- return (True, None)
+ current_projects = owner.owned_projects.filter(is_private=False).count()
+ max_projects = owner.max_public_projects
+ error_project_exceeded = _("You can't have more public projects")
- current_public_project = user.owned_projects.filter(is_private=False).exclude(id=project.id).count()
- if current_public_project < user.max_public_projects:
- return (True, None)
+ max_memberships = owner.max_memberships_public_projects
+ error_memberships_exceeded = _("This project reaches your current limit of memberships for public projects")
- return (False, _("You can't have more public projects"))
+ if max_projects is not None and current_projects >= max_projects:
+ return (False, error_project_exceeded)
+ if max_memberships is not None and total_memberships > max_memberships:
+ return (False, error_memberships_exceeded)
-def _has_available_slot_for_project_members(user, project, new_members):
- current_memberships = max(project.memberships.count(), 1)
-
- if project.is_private:
- if user.max_memberships_private_projects is None:
- return (True, None)
-
- if current_memberships + new_members <= user.max_memberships_private_projects:
- return (True, None)
-
- return (False, _("You have reached your current limit of memberships for private projects"))
-
- else:
- if user.max_memberships_public_projects is None:
- return (True, None)
-
- if current_memberships + new_members <= user.max_memberships_public_projects:
- return (True, None)
-
- return (False, _("You have reached your current limit of memberships for public projects"))
+ return (True, None)
diff --git a/tests/integration/test_importer_api.py b/tests/integration/test_importer_api.py
index 5b6a178c..a881e67d 100644
--- a/tests/integration/test_importer_api.py
+++ b/tests/integration/test_importer_api.py
@@ -1061,7 +1061,7 @@ def test_dict_to_project_with_no_members_private_project_slots_available(client)
with pytest.raises(TaigaImportError) as excinfo:
project = dict_to_project(data, owner=user)
- assert "reached your current limit of memberships for private" in str(excinfo.value)
+ assert "reaches your current limit of memberships for private" in str(excinfo.value)
def test_dict_to_project_with_no_members_public_project_slots_available(client):
@@ -1096,7 +1096,7 @@ def test_dict_to_project_with_no_members_public_project_slots_available(client):
with pytest.raises(TaigaImportError) as excinfo:
project = dict_to_project(data, owner=user)
- assert "reached your current limit of memberships for public" in str(excinfo.value)
+ assert "reaches your current limit of memberships for public" in str(excinfo.value)
def test_invalid_dump_import(client):
@@ -1322,7 +1322,7 @@ def test_valid_dump_import_without_enough_membership_private_project_slots_one_p
response = client.post(url, {'dump': data})
assert response.status_code == 400
- assert "reached your current limit of memberships for private" in response.data["_error_message"]
+ assert "reaches your current limit of memberships for private" in response.data["_error_message"]
assert Project.objects.filter(slug="project-without-memberships-slots").count() == 0
@@ -1369,7 +1369,7 @@ def test_valid_dump_import_without_enough_membership_public_project_slots_one_pr
response = client.post(url, {'dump': data})
assert response.status_code == 400
- assert "reached your current limit of memberships for public" in response.data["_error_message"]
+ assert "reaches your current limit of memberships for public" in response.data["_error_message"]
assert Project.objects.filter(slug="project-without-memberships-slots").count() == 0
diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py
index b086f402..14a8c7f4 100644
--- a/tests/integration/test_projects.py
+++ b/tests/integration/test_projects.py
@@ -1423,10 +1423,10 @@ def test_project_transfer_validate_token_from_no_admin_member_with_valid_token(c
####################################################################################
-# Test taiga.projects.services.members.check_if_project_privacity_can_be_changed
+# Test taiga.projects.services.projects.check_if_project_privacity_can_be_changed
####################################################################################
-from taiga.projects.services.members import (
+from taiga.projects.services.projects import (
check_if_project_privacity_can_be_changed,
ERROR_MAX_PUBLIC_PROJECTS_MEMBERSHIPS,
ERROR_MAX_PUBLIC_PROJECTS,