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")