Projet

Général

Profil

Development #54047

slug trop long -> value too long for type character varying(50)

Ajouté par Frédéric Péters il y a presque 3 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
18 mai 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Il est fait :

class Origin(models.Model):
    label = models.CharField(_('Label'), max_length=80)
    slug = models.SlugField(_('Slug'))

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.label)
        return super(Origin, self).save(*args, **kwargs)

implicitement le SlugField a une longueur max de 50 caractères, on peut donc se trouver à en générer un trop long.

https://sentry.entrouvert.org/entrouvert/sictiam/issues/41999/


Fichiers

Révisions associées

Révision bd8a6e32 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 2 ans

models: prevent too long error on Origin.slug (#54047)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 2 ans

La référence sentry mentionnée n'existe plus mais https://sentry.entrouvert.org/entrouvert/sictiam/issues/49399/ est la même.

Internal Server Error: /api/documents/push/

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 538, in get_or_create
    return self.get(**kwargs), False
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 408, in get
    self.model._meta.object_name
fargo.fargo.models.Origin.DoesNotExist: Origin matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.DataError: value too long for type character varying(50)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/usr/lib/python3/dist-packages/fargo/fargo/api_views.py", line 79, in handle_exception
    return super(CommonAPIMixin, self).handle_exception(exc)
  File "/usr/lib/python3/dist-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/lib/python3/dist-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/fargo/fargo/api_views.py", line 122, in post
    slug=slugify(data.get('origin')), defaults={'label': data.get('origin')}
  File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 541, in get_or_create
    return self._create_object_from_params(kwargs, params)
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 575, in _create_object_from_params
    obj = self.create(**params)
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 422, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/lib/python3/dist-packages/fargo/fargo/models.py", line 53, in save
    return super(Origin, self).save(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 744, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 782, in save_base
    force_update, using, update_fields,
  File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 873, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 911, in _do_insert
    using=using, raw=raw)
  File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 1186, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/lib/python3/dist-packages/django/db/models/sql/compiler.py", line 1377, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/__init__.py", line 434, in execute
    return real_execute(self, sql, params)
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/python3/dist-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.DataError: value too long for type character varying(50)
#2

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Assigné à mis à Benjamin Dauvergne
#3

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

#4

Mis à jour par Serghei Mihai il y a plus de 2 ans

  • Statut changé de Solution proposée à Solution validée
#5

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit bd8a6e32b62baa0a159cf22fd817b4a52e25ebc1
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Aug 24 10:02:54 2021 +0200

    models: prevent too long error on Origin.slug (#54047)
#6

Mis à jour par Frédéric Péters il y a plus de 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF