{ "info": { "author": "Mikhail Antonov", "author_email": "atin65536@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development" ], "description": "Django Permanent\n================\n\nYet another approach to provide soft (logical) delete or masking (thrashing) django models instead of deleting them physically from db.\n\n.. image:: https://api.travis-ci.org/MnogoByte/django-permanent.svg?branch=master\n\nModels\n================\n\nTo create a non-deletable model just inherit it from ``PermanentModel``:\n\n.. code-block:: python\n\n class MyModel(PermanentModel):\n pass\n\nIt automatically changes delete behaviour to hide objects instead of deleting them:\n\n.. code-block:: python\n\n >>> a = MyModel.objects.create(pk=1)\n >>> b = MyModel.objects.create(pk=2)\n >>> MyModel.objects.count()\n 2\n >>> a.delete()\n >>> MyModel.objects.count()\n 1\n\nTo recover a deleted object just call its ``restore`` method:\n\n.. code-block:: python\n\n >>> a.restore()\n >>> MyModel.objects.count()\n 2\n\nUse the ``force`` kwarg to enforce physical deletion:\n\n.. code-block:: python\n\n >>> a.delete(force=True) # Will act as the default django delete\n >>> MyModel._base_manager.count()\n 0\n\nIf you need to restore a deleted object instead of re-creating the same one use the ``restore_on_create`` attribute:\n\n.. code-block:: python\n\n class MyModel(PermanentModel):\n class Permanent:\n restore_on_create = True\n\nIn this case ``QuerySet`` provides check existence of same attribute objects and restores them if they've been deleted, creating new ones if not.\n\nManagers\n========\n\nIt changes the default model manager to ignore deleted objects, adding a ``deleted_objects`` manager to see them instead:\n\n.. code-block:: python\n\n >>> MyModel.objects.count()\n 2\n >>> a.delete()\n >>> MyModel.objects.count()\n 1\n >>> MyModel.deleted_objects.count()\n 1\n >>> MyModel.all_objects.count()\n 2\n >>> MyModel._base_manager.count()\n 2\n\nQuerySet\n========\n\nThe ``QuerySet.delete`` method will act as the default django delete, with one exception - objects of models subclassing ``PermanentModel`` will be marked as deleted; the rest will be deleted physically:\n\n.. code-block:: python\n\n >>> MyModel.objects.all().delete()\n\nYou can still force django query set physical deletion:\n\n.. code-block:: python\n\n >>> MyModel.objects.all().delete(force=True)\n\nUsing custom querysets\n======================\n\n1. Inherit your query set from ``PermanentQuerySet``:\n\n .. code-block:: python\n\n class ServerFileQuerySet(PermanentQuerySet)\n pass\n\n2. Wrap ``PermanentQuerySet`` or ``DeletedQuerySet`` in you model manager declaration:\n\n .. code-block:: python\n\n class MyModel(PermanentModel)\n objects = MultiPassThroughManager(ServerFileQuerySet, NonDeletedQuerySet)\n deleted_objects = MultiPassThroughManager(ServerFileQuerySet, DeletedQuerySet)\n all_objects = MultiPassThroughManager(ServerFileQuerySet, PermanentQuerySet)\n\nMethod ``get_restore_or_create``\n================================\n\n1. Check for existence of the object.\n2. Restore it if it was deleted.\n3. Create a new one, if it was never created.\n\nField name\n==========\n\nThe default field named is 'removed', but you can override it with the PERMANENT_FIELD variable in settings.py:\n\n.. code-block:: python\n\n PERMANENT_FIELD = 'deleted'\n\nRequirements\n============\n\n- Django 1.7+\n- Python 2.7, 3.4+\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/MnogoByte/django-permanent", "keywords": "django", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-permanent-model", "package_url": "https://pypi.org/project/django-permanent-model/", "platform": "", "project_url": "https://pypi.org/project/django-permanent-model/", "project_urls": { "Homepage": "https://github.com/MnogoByte/django-permanent" }, "release_url": "https://pypi.org/project/django-permanent-model/1.1.7/", "requires_dist": null, "requires_python": "", "summary": "Yet another approach to provide soft (logical) delete or masking (thrashing) django models instead of deleting them physically from db.", "version": "1.1.7" }, "last_serial": 5366824, "releases": { "1.1.7": [ { "comment_text": "", "digests": { "md5": "ed47e320556108992e07b73d998a8bbf", "sha256": "b6dac8b0b9185fd276956ff8064906faecc4e61cd01a0b78ef23806bbf57135d" }, "downloads": -1, "filename": "django-permanent-model-1.1.7.tar.gz", "has_sig": false, "md5_digest": "ed47e320556108992e07b73d998a8bbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10249, "upload_time": "2019-06-06T12:10:23", "url": "https://files.pythonhosted.org/packages/34/5d/b354fb41e176228b0b10b6f60fb8203d0aa0b862839f8f96ff5ce512a842/django-permanent-model-1.1.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ed47e320556108992e07b73d998a8bbf", "sha256": "b6dac8b0b9185fd276956ff8064906faecc4e61cd01a0b78ef23806bbf57135d" }, "downloads": -1, "filename": "django-permanent-model-1.1.7.tar.gz", "has_sig": false, "md5_digest": "ed47e320556108992e07b73d998a8bbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10249, "upload_time": "2019-06-06T12:10:23", "url": "https://files.pythonhosted.org/packages/34/5d/b354fb41e176228b0b10b6f60fb8203d0aa0b862839f8f96ff5ce512a842/django-permanent-model-1.1.7.tar.gz" } ] }