diff --git a/taiga/userstorage/api.py b/taiga/userstorage/api.py
index 62575d2b..5b097e71 100644
--- a/taiga/userstorage/api.py
+++ b/taiga/userstorage/api.py
@@ -17,14 +17,15 @@
# along with this program. If not, see .
from django.utils.translation import ugettext as _
-from django.db import IntegrityError
from taiga.base.api import ModelCrudViewSet
+from taiga.base.api.serializers import ValidationError
from taiga.base import exceptions as exc
from . import models
from . import filters
from . import serializers
+from . import validators
from . import permissions
@@ -32,6 +33,7 @@ class StorageEntriesViewSet(ModelCrudViewSet):
model = models.StorageEntry
filter_backends = (filters.StorageEntriesFilterBackend,)
serializer_class = serializers.StorageEntrySerializer
+ validator_class = validators.StorageEntryValidator
permission_classes = [permissions.StorageEntriesPermission]
lookup_field = "key"
@@ -45,9 +47,11 @@ class StorageEntriesViewSet(ModelCrudViewSet):
obj.owner = self.request.user
def create(self, *args, **kwargs):
- try:
- return super().create(*args, **kwargs)
- except IntegrityError:
- key = self.request.DATA.get("key", None)
- raise exc.IntegrityError(_("Duplicate key value violates unique constraint. "
- "Key '{}' already exists.").format(key))
+ key = self.request.DATA.get("key", None)
+ if (key and self.request.user.is_authenticated() and
+ self.request.user.storage_entries.filter(key=key).exists()):
+ raise exc.BadRequest(
+ _("Duplicate key value violates unique constraint. "
+ "Key '{}' already exists.").format(key)
+ )
+ return super().create(*args, **kwargs)
diff --git a/taiga/userstorage/serializers.py b/taiga/userstorage/serializers.py
index 5fd97692..38765f19 100644
--- a/taiga/userstorage/serializers.py
+++ b/taiga/userstorage/serializers.py
@@ -17,15 +17,11 @@
# along with this program. If not, see .
from taiga.base.api import serializers
-from taiga.base.fields import JsonField
-
-from . import models
+from taiga.base.fields import Field
-class StorageEntrySerializer(serializers.ModelSerializer):
- value = JsonField(label="value")
-
- class Meta:
- model = models.StorageEntry
- fields = ("key", "value", "created_date", "modified_date")
- read_only_fields = ("created_date", "modified_date")
+class StorageEntrySerializer(serializers.LightSerializer):
+ key = Field()
+ value = Field()
+ created_date = Field()
+ modified_date = Field()
diff --git a/taiga/userstorage/validators.py b/taiga/userstorage/validators.py
new file mode 100644
index 00000000..615b88d7
--- /dev/null
+++ b/taiga/userstorage/validators.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# 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 taiga.base.api import validators
+
+from . import models
+
+
+class StorageEntryValidator(validators.ModelValidator):
+ class Meta:
+ model = models.StorageEntry
+ fields = ("key", "value")