====================
Django Model Cleanup
====================


.. image:: https://img.shields.io/pypi/v/django-model-cleanup.svg
        :target: https://pypi.python.org/pypi/django-model-cleanup

.. image:: https://img.shields.io/travis/wooyek/django-model-cleanup.svg
        :target: https://travis-ci.org/wooyek/django-model-cleanup

.. image:: https://readthedocs.org/projects/django-model-cleanup/badge/?version=latest
        :target: https://django-model-cleanup.readthedocs.io/en/latest/?badge=latest
        :alt: Documentation Status
.. image:: https://coveralls.io/repos/github/wooyek/django-model-cleanup/badge.svg?branch=develop
        :target: https://coveralls.io/github/wooyek/django-model-cleanup?branch=develop
        :alt: Coveralls.io coverage

.. image:: https://codecov.io/gh/wooyek/django-model-cleanup/branch/develop/graph/badge.svg
        :target: https://codecov.io/gh/wooyek/django-model-cleanup
        :alt: CodeCov coverage

.. image:: https://api.codeclimate.com/v1/badges/0e7992f6259bc7fd1a1a/maintainability
        :target: https://codeclimate.com/github/wooyek/django-model-cleanup/maintainability
        :alt: Maintainability

.. image:: https://img.shields.io/github/license/wooyek/django-model-cleanup.svg
        :target: https://github.com/wooyek/django-model-cleanup/blob/develop/LICENSE
        :alt: License

.. image:: https://img.shields.io/twitter/url/https/github.com/wooyek/django-model-cleanup.svg?style=social
        :target: https://twitter.com/intent/tweet?text=Wow:&url=https://github.com/wooyek/django-model-cleanup
        :alt: Tweet about this project

.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg
        :target: https://saythanks.io/to/wooyek

Mixins for model cleanup methods and validation error concatenations

* Free software: MIT license
* Documentation: https://django-model-cleanup.readthedocs.io.

Features of CleanMixin
----------------------

* Provides `clean` method implementation
* Call to `full_clean` will result in call to all `clean_*` methods
* All methods will get called regardless of validation errors - get all errors at once
* Auto mapping of errors to field names based on clean method names, if errors have no error_dict

Quickstart
----------

Install Django Model Cleanup::

    pip install django-model-cleanup

Add mixin in your models and enjoy `clean_` method collection and error concatenation when `full_clean` is called:

.. code-block:: python

    from django.core.exceptions import ValidationError
    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    from django_model_cleanup import CleanMixin, ExtensibleValidationError


    class SomeModel(CleanMixin, models.Model):
        lorem = models.CharField(max_length=10, blank=True)

        def clean_foo(self):
            raise ValidationError('Foo is bad')

        def clean_bar(self):
            raise ExtensibleValidationError({'bar': _('Bar is wrong cause %s > %s!')}, code='bar', params=(2, 1))

        def clean_legacy(self):
            # We can't init ValidationError as one-liner, cause dict + params are not compatible
            # We need to wrap a message in ValidationError and put that in dict indicating a field
            msg = _('Bar legacy error %s > %s!')
            error = ValidationError(msg, code='bar', params=(7, 5))
            raise ValidationError({'bar': error})

Each error handling and concatenation is no longer required:

.. code-block:: python

        # This is not longer required:
        def clean(self):
            errors = []
            try:
                self.clean_foo()
            except ValidationError as ex:
                errors.append(ex)
            errors = []
            try:
                self.clean_bar()
            except ValidationError as ex:
                errors.append(ex)
            errors = []
            try:
                self.clean_legacy()
            except ValidationError as ex:
                errors.append(ex)
            if errors:
                raise ValidationError(errors)

Running Tests
-------------

Does the code actually work?

::
    $ pipenv install --dev
    $ pipenv shell
    $ tox


We recommend using pipenv_ but a legacy approach to creating virtualenv and installing requirements should also work.
Please install `requirements/development.txt` to setup virtual env for testing and development.


Credits
-------

This package was created with Cookiecutter_ and the `wooyek/cookiecutter-django-app`_ project template.

.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`wooyek/cookiecutter-django-app`: https://github.com/wooyek/cookiecutter-django-app
.. _`pipenv`: https://docs.pipenv.org/install.html#fancy-installation-of-pipenv
