Moving ValidationError to taiga.base.exceptions

remotes/origin/issue/4795/notification_even_they_are_disabled
Jesús Espino 2016-07-06 12:46:22 +02:00 committed by David Barragán Merino
parent 6e3eeb7cca
commit 9c8a630fc6
20 changed files with 58 additions and 55 deletions

View File

@ -17,11 +17,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core import validators as core_validators from django.core import validators as core_validators
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.exceptions import ValidationError
import re import re
@ -39,7 +39,7 @@ class BaseRegisterValidator(validators.Validator):
try: try:
validator(value) validator(value)
except ValidationError: except ValidationError:
raise serializers.ValidationError(_("Required. 255 characters or fewer. Letters, numbers " raise ValidationError(_("Required. 255 characters or fewer. Letters, numbers "
"and /./-/_ characters'")) "and /./-/_ characters'"))
return attrs return attrs

View File

@ -50,7 +50,6 @@ They are very similar to Django's form fields.
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core import validators from django.core import validators
from django.core.exceptions import ValidationError
from django.db.models.fields import BLANK_CHOICE_DASH from django.db.models.fields import BLANK_CHOICE_DASH
from django.forms import widgets from django.forms import widgets
from django.http import QueryDict from django.http import QueryDict
@ -66,6 +65,8 @@ from django.utils.functional import Promise
from django.utils.translation import ugettext from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.base.exceptions import ValidationError
from . import ISO_8601 from . import ISO_8601
from .settings import api_settings from .settings import api_settings

View File

@ -44,12 +44,12 @@
import warnings import warnings
from django.core.exceptions import ValidationError
from django.http import Http404 from django.http import Http404
from django.db import transaction as tx from django.db import transaction as tx
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base import response from taiga.base import response
from taiga.base.exceptions import ValidationError
from .settings import api_settings from .settings import api_settings
from .utils import get_object_or_404 from .utils import get_object_or_404

View File

@ -48,7 +48,7 @@ Serializer fields that deal with relationships.
These fields allow you to specify the style that should be used to represent These fields allow you to specify the style that should be used to represent
model relationships, including hyperlinks, primary keys, or slugs. model relationships, including hyperlinks, primary keys, or slugs.
""" """
from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
from django import forms from django import forms
from django.db.models.fields import BLANK_CHOICE_DASH from django.db.models.fields import BLANK_CHOICE_DASH
@ -59,6 +59,7 @@ from django.utils.translation import ugettext_lazy as _
from .fields import Field, WritableField, get_component, is_simple_callable from .fields import Field, WritableField, get_component, is_simple_callable
from .reverse import reverse from .reverse import reverse
from taiga.base.exceptions import ValidationError
import warnings import warnings
from urllib import parse as urlparse from urllib import parse as urlparse

View File

@ -78,6 +78,8 @@ import serpy
# This helps keep the separation between model fields, form fields, and # This helps keep the separation between model fields, form fields, and
# serializer fields more explicit. # serializer fields more explicit.
from taiga.base.exceptions import ValidationError
from .relations import * from .relations import *
from .fields import * from .fields import *

View File

@ -51,6 +51,7 @@ In addition Django's built in 403 and 404 exceptions are handled.
""" """
from django.core.exceptions import PermissionDenied as DjangoPermissionDenied from django.core.exceptions import PermissionDenied as DjangoPermissionDenied
from django.core.exceptions import ValidationError as DjangoValidationError
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.http import Http404 from django.http import Http404
@ -224,6 +225,7 @@ class NotEnoughSlotsForProject(BaseException):
"total_memberships": total_memberships "total_memberships": total_memberships
} }
def format_exception(exc): def format_exception(exc):
if isinstance(exc.detail, (dict, list, tuple,)): if isinstance(exc.detail, (dict, list, tuple,)):
detail = exc.detail detail = exc.detail
@ -270,3 +272,6 @@ def exception_handler(exc):
# Note: Unhandled exceptions will raise a 500 error. # Note: Unhandled exceptions will raise a 500 error.
return None return None
ValidationError = DjangoValidationError

View File

@ -23,11 +23,11 @@ from collections import OrderedDict
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.exceptions import ValidationError
from taiga.base.fields import JsonField from taiga.base.fields import JsonField
from taiga.mdrender.service import render as mdrender from taiga.mdrender.service import render as mdrender
from taiga.users import models as users_models from taiga.users import models as users_models

View File

@ -16,13 +16,11 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import copy
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.fields import JsonField, PgArrayField from taiga.base.fields import JsonField, PgArrayField
from taiga.base.exceptions import ValidationError
from taiga.projects import models as projects_models from taiga.projects import models as projects_models
from taiga.projects.custom_attributes import models as custom_attributes_models from taiga.projects.custom_attributes import models as custom_attributes_models
@ -31,15 +29,12 @@ from taiga.projects.tasks import models as tasks_models
from taiga.projects.issues import models as issues_models from taiga.projects.issues import models as issues_models
from taiga.projects.milestones import models as milestones_models from taiga.projects.milestones import models as milestones_models
from taiga.projects.wiki import models as wiki_models from taiga.projects.wiki import models as wiki_models
from taiga.projects.history import models as history_models
from taiga.projects.attachments import models as attachments_models
from taiga.timeline import models as timeline_models from taiga.timeline import models as timeline_models
from taiga.users import models as users_models from taiga.users import models as users_models
from taiga.projects.votes import services as votes_service from taiga.projects.votes import services as votes_service
from .fields import (FileField, RelatedNoneSafeField, UserRelatedField, from .fields import (FileField, UserRelatedField,
UserPkField, CommentField, ProjectRelatedField, ProjectRelatedField,
HistoryUserField, HistoryValuesField, HistoryDiffField,
TimelineDataField, ContentTypeField) TimelineDataField, ContentTypeField)
from .mixins import (HistoryExportSerializerMixin, from .mixins import (HistoryExportSerializerMixin,
AttachmentExportSerializerMixin, AttachmentExportSerializerMixin,
@ -158,6 +153,7 @@ class BaseCustomAttributesValuesExportSerializer(serializers.ModelSerializer):
return attrs return attrs
class UserStoryCustomAttributesValuesExportSerializer(BaseCustomAttributesValuesExportSerializer): class UserStoryCustomAttributesValuesExportSerializer(BaseCustomAttributesValuesExportSerializer):
_custom_attribute_model = custom_attributes_models.UserStoryCustomAttribute _custom_attribute_model = custom_attributes_models.UserStoryCustomAttribute
_container_model = "userstories.UserStory" _container_model = "userstories.UserStory"
@ -224,7 +220,7 @@ class MilestoneExportSerializer(WatcheableObjectModelSerializerMixin):
name = attrs[source] name = attrs[source]
qs = self.project.milestones.filter(name=name) qs = self.project.milestones.filter(name=name)
if qs.exists(): if qs.exists():
raise serializers.ValidationError(_("Name duplicated for the project")) raise ValidationError(_("Name duplicated for the project"))
return attrs return attrs
@ -268,7 +264,9 @@ class UserStoryExportSerializer(CustomAttributesValuesExportSerializerMixin, His
def custom_attributes_queryset(self, project): def custom_attributes_queryset(self, project):
if project.id not in _custom_userstories_attributes_cache: if project.id not in _custom_userstories_attributes_cache:
_custom_userstories_attributes_cache[project.id] = list(project.userstorycustomattributes.all().values('id', 'name')) _custom_userstories_attributes_cache[project.id] = list(
project.userstorycustomattributes.all().values('id', 'name')
)
return _custom_userstories_attributes_cache[project.id] return _custom_userstories_attributes_cache[project.id]
@ -314,10 +312,10 @@ class WikiLinkExportSerializer(serializers.ModelSerializer):
exclude = ('id', 'project') exclude = ('id', 'project')
class TimelineExportSerializer(serializers.ModelSerializer): class TimelineExportSerializer(serializers.ModelSerializer):
data = TimelineDataField() data = TimelineDataField()
data_content_type = ContentTypeField() data_content_type = ContentTypeField()
class Meta: class Meta:
model = timeline_models.Timeline model = timeline_models.Timeline
exclude = ('id', 'project', 'namespace', 'object_id', 'content_type') exclude = ('id', 'project', 'namespace', 'object_id', 'content_type')

View File

@ -22,7 +22,6 @@ from dateutil.relativedelta import relativedelta
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError
from django.http import Http404 from django.http import Http404
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils import timezone from django.utils import timezone
@ -651,7 +650,7 @@ class MembershipViewSet(BlockedByProjectMixin, ModelCrudViewSet):
invitation_extra_text=invitation_extra_text, invitation_extra_text=invitation_extra_text,
callback=self.post_save, callback=self.post_save,
precall=self.pre_save) precall=self.pre_save)
except ValidationError as err: except exc.ValidationError as err:
return response.BadRequest(err.message_dict) return response.BadRequest(err.message_dict)
members_serialized = self.admin_serializer_class(members, many=True) members_serialized = self.admin_serializer_class(members, many=True)

View File

@ -20,7 +20,7 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.base.fields import JsonField from taiga.base.fields import JsonField
from taiga.base.api.serializers import ValidationError from taiga.base.exceptions import ValidationError
from taiga.base.api.validators import ModelValidator from taiga.base.api.validators import ModelValidator
from . import models from . import models

View File

@ -18,7 +18,7 @@
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.exceptions import ValidationError
from taiga.base.api import validators from taiga.base.api import validators
from taiga.projects.validators import DuplicatedNameInProjectValidator from taiga.projects.validators import DuplicatedNameInProjectValidator
from taiga.projects.notifications.validators import WatchersValidator from taiga.projects.notifications.validators import WatchersValidator
@ -31,7 +31,7 @@ class MilestoneExistsValidator:
value = attrs[source] value = attrs[source]
if not models.Milestone.objects.filter(pk=value).exists(): if not models.Milestone.objects.filter(pk=value).exists():
msg = _("There's no milestone with that id") msg = _("There's no milestone with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs

View File

@ -18,7 +18,7 @@
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.exceptions import ValidationError
class WatchersValidator: class WatchersValidator:
@ -45,6 +45,6 @@ class WatchersValidator:
existing_watcher_ids = project.get_watchers().values_list("id", flat=True) existing_watcher_ids = project.get_watchers().values_list("id", flat=True)
result = set(users).difference(member_ids).difference(existing_watcher_ids) result = set(users).difference(member_ids).difference(existing_watcher_ids)
if result: if result:
raise serializers.ValidationError(_("Watchers contains invalid users")) raise ValidationError(_("Watchers contains invalid users"))
return attrs return attrs

View File

@ -18,6 +18,7 @@
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.exceptions import ValidationError
class ResolverValidator(validators.Validator): class ResolverValidator(validators.Validator):
@ -32,10 +33,10 @@ class ResolverValidator(validators.Validator):
def validate(self, attrs): def validate(self, attrs):
if "ref" in attrs: if "ref" in attrs:
if "us" in attrs: if "us" in attrs:
raise serializers.ValidationError("'us' param is incompatible with 'ref' in the same request") raise ValidationError("'us' param is incompatible with 'ref' in the same request")
if "task" in attrs: if "task" in attrs:
raise serializers.ValidationError("'task' param is incompatible with 'ref' in the same request") raise ValidationError("'task' param is incompatible with 'ref' in the same request")
if "issue" in attrs: if "issue" in attrs:
raise serializers.ValidationError("'issue' param is incompatible with 'ref' in the same request") raise ValidationError("'issue' param is incompatible with 'ref' in the same request")
return attrs return attrs

View File

@ -16,11 +16,11 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core.exceptions import ValidationError
from django.forms import widgets from django.forms import widgets
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.exceptions import ValidationError
import re import re

View File

@ -20,6 +20,7 @@ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.exceptions import ValidationError
from taiga.base.fields import PgArrayField from taiga.base.fields import PgArrayField
from taiga.projects.milestones.validators import MilestoneExistsValidator from taiga.projects.milestones.validators import MilestoneExistsValidator
from taiga.projects.notifications.mixins import EditableWatchedResourceSerializer from taiga.projects.notifications.mixins import EditableWatchedResourceSerializer
@ -34,7 +35,7 @@ class TaskExistsValidator:
value = attrs[source] value = attrs[source]
if not models.Task.objects.filter(pk=value).exists(): if not models.Task.objects.filter(pk=value).exists():
msg = _("There's no task with that id") msg = _("There's no task with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.api.utils import get_object_or_404 from taiga.base.api.utils import get_object_or_404
from taiga.base.exceptions import ValidationError
from taiga.base.fields import PgArrayField from taiga.base.fields import PgArrayField
from taiga.base.fields import PickledObjectField from taiga.base.fields import PickledObjectField
from taiga.projects.milestones.validators import MilestoneExistsValidator from taiga.projects.milestones.validators import MilestoneExistsValidator
@ -40,7 +41,7 @@ class UserStoryExistsValidator:
value = attrs[source] value = attrs[source]
if not models.UserStory.objects.filter(pk=value).exists(): if not models.UserStory.objects.filter(pk=value).exists():
msg = _("There's no user story with that id") msg = _("There's no user story with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs
@ -105,9 +106,9 @@ class UpdateMilestoneBulkValidator(ProjectExistsValidator, MilestoneExistsValida
project = get_object_or_404(Project, pk=data["project_id"]) project = get_object_or_404(Project, pk=data["project_id"])
if project.user_stories.filter(id__in=user_story_ids).count() != len(user_story_ids): if project.user_stories.filter(id__in=user_story_ids).count() != len(user_story_ids):
raise serializers.ValidationError("all the user stories must be from the same project") raise ValidationError("all the user stories must be from the same project")
if project.milestones.filter(id=data["milestone_id"]).count() != 1: if project.milestones.filter(id=data["milestone_id"]).count() != 1:
raise serializers.ValidationError("the milestone isn't valid for the project") raise ValidationError("the milestone isn't valid for the project")
return data return data

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.exceptions import ValidationError
from taiga.base.fields import JsonField from taiga.base.fields import JsonField
from taiga.base.fields import PgArrayField from taiga.base.fields import PgArrayField
from taiga.users.validators import RoleExistsValidator from taiga.users.validators import RoleExistsValidator
@ -49,7 +50,7 @@ class DuplicatedNameInProjectValidator:
qs = model.objects.filter(project=attrs["project"], name=attrs[source]) qs = model.objects.filter(project=attrs["project"], name=attrs[source])
if qs and qs.exists(): if qs and qs.exists():
raise serializers.ValidationError(_("Name duplicated for the project")) raise ValidationError(_("Name duplicated for the project"))
return attrs return attrs
@ -59,7 +60,7 @@ class ProjectExistsValidator:
value = attrs[source] value = attrs[source]
if not models.Project.objects.filter(pk=value).exists(): if not models.Project.objects.filter(pk=value).exists():
msg = _("There's no project with that id") msg = _("There's no project with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs
@ -68,7 +69,7 @@ class UserStoryStatusExistsValidator:
value = attrs[source] value = attrs[source]
if not models.UserStoryStatus.objects.filter(pk=value).exists(): if not models.UserStoryStatus.objects.filter(pk=value).exists():
msg = _("There's no user story status with that id") msg = _("There's no user story status with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs
@ -77,7 +78,7 @@ class TaskStatusExistsValidator:
value = attrs[source] value = attrs[source]
if not models.TaskStatus.objects.filter(pk=value).exists(): if not models.TaskStatus.objects.filter(pk=value).exists():
msg = _("There's no task status with that id") msg = _("There's no task status with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs
@ -152,7 +153,7 @@ class MembershipValidator(validators.ModelValidator):
Q(project_id=project.id, email=email)) Q(project_id=project.id, email=email))
if qs.count() > 0: if qs.count() > 0:
raise serializers.ValidationError(_("Email address is already taken")) raise ValidationError(_("Email address is already taken"))
return attrs return attrs
@ -164,7 +165,7 @@ class MembershipValidator(validators.ModelValidator):
role = attrs[source] role = attrs[source]
if project.roles.filter(id=role.id).count() == 0: if project.roles.filter(id=role.id).count() == 0:
raise serializers.ValidationError(_("Invalid role for the project")) raise ValidationError(_("Invalid role for the project"))
return attrs return attrs
@ -175,10 +176,10 @@ class MembershipValidator(validators.ModelValidator):
if (self.object and self.object.user): if (self.object and self.object.user):
if self.object.user.id == project.owner_id and not attrs[source]: if self.object.user.id == project.owner_id and not attrs[source]:
raise serializers.ValidationError(_("The project owner must be admin.")) raise ValidationError(_("The project owner must be admin."))
if not services.project_has_valid_admins(project, exclude_user=self.object.user): if not services.project_has_valid_admins(project, exclude_user=self.object.user):
raise serializers.ValidationError( raise ValidationError(
_("At least one user must be an active admin for this project.") _("At least one user must be an active admin for this project.")
) )

View File

@ -17,9 +17,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf import settings from django.conf import settings
from django.core import validators
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.fields import PgArrayField, Field, MethodField, I18NField from taiga.base.fields import PgArrayField, Field, MethodField, I18NField
@ -27,14 +24,11 @@ from taiga.base.fields import PgArrayField, Field, MethodField, I18NField
from taiga.base.utils.thumbnails import get_thumbnail_url from taiga.base.utils.thumbnails import get_thumbnail_url
from taiga.projects.models import Project from taiga.projects.models import Project
from .models import User, Role
from .services import get_photo_or_gravatar_url, get_big_photo_or_gravatar_url from .services import get_photo_or_gravatar_url, get_big_photo_or_gravatar_url
from .gravatar import get_gravatar_url from .gravatar import get_gravatar_url
from collections import namedtuple from collections import namedtuple
import re
###################################################### ######################################################
# User # User

View File

@ -17,12 +17,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core import validators as core_validators from django.core import validators as core_validators
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.base.api import serializers from taiga.base.api import serializers
from taiga.base.api import validators from taiga.base.api import validators
from taiga.base.fields import PgArrayField, Field from taiga.base.exceptions import ValidationError
from taiga.base.fields import PgArrayField
from .models import User, Role from .models import User, Role
@ -34,7 +34,7 @@ class RoleExistsValidator:
value = attrs[source] value = attrs[source]
if not Role.objects.filter(pk=value).exists(): if not Role.objects.filter(pk=value).exists():
msg = _("There's no role with that id") msg = _("There's no role with that id")
raise serializers.ValidationError(msg) raise ValidationError(msg)
return attrs return attrs
@ -55,13 +55,13 @@ class UserValidator(validators.ModelValidator):
try: try:
validator(value) validator(value)
except ValidationError: except ValidationError:
raise validators.ValidationError(_("Required. 255 characters or fewer. Letters, " raise ValidationError(_("Required. 255 characters or fewer. Letters, "
"numbers and /./-/_ characters'")) "numbers and /./-/_ characters'"))
if (self.object and if (self.object and
self.object.username != value and self.object.username != value and
User.objects.filter(username=value).exists()): User.objects.filter(username=value).exists()):
raise validators.ValidationError(_("Invalid username. Try with a different one.")) raise ValidationError(_("Invalid username. Try with a different one."))
return attrs return attrs

View File

@ -19,7 +19,6 @@
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base.api import ModelCrudViewSet from taiga.base.api import ModelCrudViewSet
from taiga.base.api.serializers import ValidationError
from taiga.base import exceptions as exc from taiga.base import exceptions as exc
from . import models from . import models