Skip to main content

Undeletable Django models

Project description

django-undeletable |BuildStatus|_ |Coverage|_

.. |BuildStatus| image:: https://travis-ci.org/kakulukia/django-undeletable.svg .. _BuildStatus: https://travis-ci.org/kakulukia/django-undeletable

.. |Coverage| image:: https://codecov.io/gh/kakulukia/django-undeletable/branch/master/graph/badge.svg .. _Coverage: https://codecov.io/gh/kakulukia/django-undeletable

I have run into dozens of situations where data got deleted by accident or somebody wanted to know when something got deleted or changed, so this little module will prevent accidents and you will always be able to reverse the situation or to identify why that little bug deleted exactly this set of data. And even if somebody from marketing all in a sudden wants to know what was in those temporary shopping baskets that should have been deleted already - you will be able to answer those questions! I never had the problem of too much data - it was always the missing data, the missing creation and modification timestamps that makes your job harder than it has to be.

So here is the answer to all that. Nothing will be deleted anymore and you will know when X got created, changed or deleted. Django Undeletable provides a BaseModel with useful default attributes to keep track of your data. The custom DataManager keeps track of deleted and live data. You can also keep stuff hidden from the public while displaying that data to some chosen customers (like beta testers).

Installation

Install django-undeletable

.. code-block:: bash

pip install django-undeletable

When using this package, all your models should extend from BaseModel instead of django.db.models.Model. Take a look at the additional NamedModel as to how its done.

.. code-block:: python

class NamedModel(BaseModel):
    name = models.CharField(_('Name'), max_length=150, db_index=True)

    class Meta(BaseModel.Meta):
        ordering = ['name']
        abstract = True

Extending the Meta class from BaseModel.Meta is important for Django 2.0+ otherwise you will experience your related QuerySets to not be managed by a DataManager but by Djangos default manager instead including deleted data.

For a fully working QuerySet and Manager relation which share methods, you should create your managers the following way:

.. code-block:: python

class BookQuerySet(DataQuerySet):
    def not_null(self):
        return self.filter(author__isnull=False)


class CoverBook(Book):
    data = DataManager.from_queryset(BookQuerySet)()

This way you can do CoverBook.data.all().nut_null() and CoverBook.data.nut_null() otherwise you will have to define the methods twice or face errors in one of the previous calls.

Features

While inheriting from BaseModel you get the following advantages:

  • Your models have created, modified and deleted DateTime attributes
  • The data queryset shall always tell you which ones of your models are undeletable or from 3rd party modules - but the main reason for using data is that im lazy and prefer typing data instead of objects :)
  • Since quite some modules don't respect a models default manager and just use 'objects', data is mirrored to objects to not run into any trouble
  • You have the option to hide specific data from the public while using visible() instead of all()
  • since its quite common, this package also includes the above NamedModel and a customized User Model that you should copy to your codebase and remove the abstract = True line to have undeletable users
  • The included abstract User class features an EMAIL_OVERRIDE_ADDRESS setting that can be used to not actually email real users on a development system :)

Running Tests

Does the code actually work?

.. code-block:: bash

make init
make test

Credits

Tools used in rendering this package:

  • Cookiecutter_
  • cookiecutter-djangopackage_

.. _Cookiecutter: https://github.com/audreyr/cookiecutter .. _cookiecutter-djangopackage: https://github.com/pydanny/cookiecutter-djangopackage

History

0.6.0 +++++++

  • First release based on the cookiecutter django package
  • full test coverage
  • several small fixes that i found while code the test
  • added Pipfile

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

django_undeletable-1.1.2-py2.py3-none-any.whl (7.8 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django_undeletable-1.1.2-py2.py3-none-any.whl.

File metadata

  • Download URL: django_undeletable-1.1.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 7.8 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.9

File hashes

Hashes for django_undeletable-1.1.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b63981a84f0d1ee17c916124910d578266348487604567ee137013a91d0c5b85
MD5 36fb6c3e0cd1de66f3ae975d12045eb0
BLAKE2b-256 7d5dac394790827e1b510a7d80b4ecb4f5f4cc6336a7743e0590ff94447613f9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page