{ "info": { "author": "Andy Grabow", "author_email": "andy@freilandkiwis.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "django-undeletable |BuildStatus|_ |Coverage|_\n==============================================================\n\n.. |BuildStatus| image:: https://travis-ci.org/kakulukia/django-undeletable.svg\n.. _BuildStatus: https://travis-ci.org/kakulukia/django-undeletable\n\n.. |Coverage| image:: https://codecov.io/gh/kakulukia/django-undeletable/branch/master/graph/badge.svg\n.. _Coverage: https://codecov.io/gh/kakulukia/django-undeletable\n\n\nI have run into dozens of situations where data got deleted by accident or somebody\nwanted to know when something got deleted or changed, so this little module will prevent\naccidents and you will always be able to reverse the situation or to identify why that\nlittle bug deleted exactly this set of data.\nAnd even if somebody from marketing all in a sudden wants to know what was in those\ntemporary shopping baskets that should have been deleted already - you will be able to answer\nthose questions! I never had the problem of too much data - it was always the missing data,\nthe missing creation and modification timestamps that makes your job harder than it has to be.\n\nSo here is the answer to all that. Nothing will be deleted anymore and you will know when X\ngot created, changed or deleted. Django Undeletable provides a **BaseModel** with useful\ndefault attributes to keep track of your data. The custom **DataManager** keeps track of\ndeleted and live data. You can also keep stuff hidden from the public while displaying\nthat data to some chosen customers (like beta testers).\n\n\nInstallation\n--------------\n\nInstall django-undeletable\n\n.. code-block:: bash\n\n pip install django-undeletable\n\nWhen using this package, all your models should extend from BaseModel\ninstead of django.db.models.Model. Take a look at the additional NamedModel as to how its\ndone.\n\n.. code-block:: python\n\n class NamedModel(BaseModel):\n name = models.CharField(_('Name'), max_length=150, db_index=True)\n\n class Meta(BaseModel.Meta):\n ordering = ['name']\n abstract = True\n\nExtending the *Meta* class from *BaseModel.Meta* is important for Django 2.0+ otherwise you will experience\nyour related querysets to not be managed by a DataManager but by Djangos default manager instead including\ndeleted data.\n\n\n\nFeatures\n----------\n\nWhile inheriting from BaseModel you get the following advantages:\n\n* Your models have created, modified and deleted DateTime attributes\n* The *data* queryset shall always tell you which ones of your models are undeletable\n or from 3rd party modules - but the main reason for using data is that im lazy and\n prefer typing data instead of objects :)\n* Since quite some modules don't respect a models default manager and just use 'objects',\n data is mirrored to objects to not run into any trouble\n* You have the option to hide specific data from the public while using *visible()* instead of *all()*\n* since its quite common, this package also includes the above NamedModel and a customized\n User Model that you should copy to your codebase and remove the *abstract = True* line to have undeletable users\n* The included abstract User class features an EMAIL_OVERRIDE_ADDRESS setting that can be\n used to not actually email real users on a development system :)\n\n\nRunning Tests\n---------------\n\nDoes the code actually work?\n\n.. code-block:: bash\n\n make init\n make test\n\nCredits\n---------\n\nTools used in rendering this package:\n\n* Cookiecutter_\n* `cookiecutter-djangopackage`_\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage\n\n\n\n\nHistory\n-------\n\n0.6.0\n+++++++\n\n* First release based on the cookiecutter django package\n* full test coverage\n* several small fixes that i found while code the test\n+ added Pipfile\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/kakulukia/django-undeletable/tarball/1.1.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kakulukia/django-undeletable", "keywords": "orm,undelete,shadow db", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-undeletable", "package_url": "https://pypi.org/project/django-undeletable/", "platform": "", "project_url": "https://pypi.org/project/django-undeletable/", "project_urls": { "Download": "https://github.com/kakulukia/django-undeletable/tarball/1.1.0", "Homepage": "https://github.com/kakulukia/django-undeletable" }, "release_url": "https://pypi.org/project/django-undeletable/1.1.0/", "requires_dist": [ "Django (>=1.11.8)" ], "requires_python": ">=3.3", "summary": "Undeletable Django models", "version": "1.1.0" }, "last_serial": 4831370, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "f3f2136b119c2449203d5cc95f667a50", "sha256": "d405b6589ec97b8a00adc26d173cdfe3efd3f898f827e67e28414dbee11daa22" }, "downloads": -1, "filename": "django-undeletable-0.1.0.tar.gz", "has_sig": false, "md5_digest": "f3f2136b119c2449203d5cc95f667a50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2281, "upload_time": "2014-08-26T10:09:14", "url": "https://files.pythonhosted.org/packages/bc/dc/4327fc1c37a1b02303a683ceb38a72f7a0724bf08bac7de746f90f04fee9/django-undeletable-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d4ab1e692430db77e8b67f8d6aec04ac", "sha256": "904e0fcd8513d0c558e38766746af3098ef4a9ffaf739464d99f88fe442f1ea7" }, "downloads": -1, "filename": "django-undeletable-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d4ab1e692430db77e8b67f8d6aec04ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2278, "upload_time": "2014-08-26T10:14:20", "url": "https://files.pythonhosted.org/packages/fc/46/00445892b192f596c50a0b6ed9a1a4b6cf685a4f612374a2074bda615846/django-undeletable-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "8313c395dd45c0ad5bd38fadb7626ba9", "sha256": "8d1eeef426435f1b6c1071aad6c98d0448b390c94b7c8467805c59f370101be6" }, "downloads": -1, "filename": "django-undeletable-0.1.2.tar.gz", "has_sig": false, "md5_digest": "8313c395dd45c0ad5bd38fadb7626ba9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2282, "upload_time": "2014-08-26T10:34:15", "url": "https://files.pythonhosted.org/packages/d1/c0/61ae37227b108e82aa6c8a431649d65a3c5cd90bb8baf9066e9b99297b93/django-undeletable-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "455ddf0487a5c5846dc1400a13d65961", "sha256": "6ba07f4ff87b28028554c0352e98e8498946e95cb4bec7de26bb6fc10a8ad0f7" }, "downloads": -1, "filename": "django-undeletable-0.1.3.tar.gz", "has_sig": false, "md5_digest": "455ddf0487a5c5846dc1400a13d65961", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2291, "upload_time": "2014-08-27T10:34:48", "url": "https://files.pythonhosted.org/packages/1d/20/66d9b3f73e45826df0a1e3dad7b5ecdb7c5cb69de7787e5e8ffd6f5fffd8/django-undeletable-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "085c2fb53f46130bfc4dcf47ac452d18", "sha256": "2e418f7477d0443fe61285c4b106fc2eaf1a1aa874c4921d41f582689790f2f1" }, "downloads": -1, "filename": "django-undeletable-0.2.0.tar.gz", "has_sig": false, "md5_digest": "085c2fb53f46130bfc4dcf47ac452d18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3093, "upload_time": "2014-09-05T13:32:52", "url": "https://files.pythonhosted.org/packages/91/d1/8a646d69ab4c8fdd503c88878034c88341af7445391df56ae9d79d309c6e/django-undeletable-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "bd85111ff240897a10f48579b7e06f50", "sha256": "5b68dd91b7da0da92a36b5b0467602830cc85ca241f8b7a32aa1b52851b3b57b" }, "downloads": -1, "filename": "django-undeletable-0.2.1.tar.gz", "has_sig": false, "md5_digest": "bd85111ff240897a10f48579b7e06f50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3095, "upload_time": "2014-09-08T12:35:59", "url": "https://files.pythonhosted.org/packages/6f/81/9b48ad44ebcfd50229374c02f856342f2c7266605f6d19054675d53b3412/django-undeletable-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "315d1c47b38e49df919b2647ef7ab1f0", "sha256": "cf9379a478edd2c545c976d3ca28a98a32f9bf415b7923499033e263986fb22e" }, "downloads": -1, "filename": "django-undeletable-0.2.2.tar.gz", "has_sig": false, "md5_digest": "315d1c47b38e49df919b2647ef7ab1f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3077, "upload_time": "2014-09-08T12:40:58", "url": "https://files.pythonhosted.org/packages/54/ab/4bf2fea1ad9bdb3e74a534b72a442dfeec5b7e9f614bb347928e1c45fc38/django-undeletable-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b7fc1454a68f97b316293be6c7977fcc", "sha256": "87ea8f39f05bdacd61dba0edbb38cabfd65d47192172e444769f71cebc0781f6" }, "downloads": -1, "filename": "django-undeletable-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b7fc1454a68f97b316293be6c7977fcc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3542, "upload_time": "2015-08-23T14:13:49", "url": "https://files.pythonhosted.org/packages/04/39/59a0833eef8128faccb7145fdfeb9f95f81f94f5062680108233b8932cbb/django-undeletable-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "a6849a3bbe7ef7d157d8fc04f8fe3aba", "sha256": "1d52ccc22b57e9c578f016cc0375a9a22623ca4e2e71f8d322c621c0529cd7b3" }, "downloads": -1, "filename": "django-undeletable-0.4.0.tar.gz", "has_sig": false, "md5_digest": "a6849a3bbe7ef7d157d8fc04f8fe3aba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3386, "upload_time": "2015-10-21T12:45:11", "url": "https://files.pythonhosted.org/packages/59/7f/9b5582a5a92ec97fe0bbd782db34eb8b5f824dad19d94d81927458801d29/django-undeletable-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "39ccf02458e40828c5dda4272ee615e2", "sha256": "e4a325ad033cc674fde82fe3b6e978a4de0bdc46ea979e0f67dd8583b203cc0b" }, "downloads": -1, "filename": "django-undeletable-0.4.1.tar.gz", "has_sig": false, "md5_digest": "39ccf02458e40828c5dda4272ee615e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3451, "upload_time": "2015-11-12T09:50:02", "url": "https://files.pythonhosted.org/packages/09/bb/e43a47a554163f6109c2f1149cf0bb729230d978e2b61a6c1e39a52b5728/django-undeletable-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "484dbb87b5c2f689c2eafafc9a5861a8", "sha256": "b1c6efda2574f7e2b19910abed5d16a6cde339551d55c588accfbe6dcdcc67a7" }, "downloads": -1, "filename": "django-undeletable-0.4.2.tar.gz", "has_sig": false, "md5_digest": "484dbb87b5c2f689c2eafafc9a5861a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3559, "upload_time": "2017-04-25T09:11:32", "url": "https://files.pythonhosted.org/packages/c0/2e/18b6c47175ee29c2fb800142256127c80a60f7a36466f6b360345b786671/django-undeletable-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "58d6f742092fe938ccba7a6afc0e494b", "sha256": "5d8fff04b92460afb1676ad1d143e181ea17f145723aed8f8b6777c786dd5169" }, "downloads": -1, "filename": "django-undeletable-0.5.0.tar.gz", "has_sig": false, "md5_digest": "58d6f742092fe938ccba7a6afc0e494b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4108, "upload_time": "2018-01-15T08:49:27", "url": "https://files.pythonhosted.org/packages/f3/a1/406e1d4f6fdda933f6a12729b89d96c3e9ff5cc58356ffb3ffd07d4b5777/django-undeletable-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "6cd5ead31bd6b0ac766f1ffccd8c0e77", "sha256": "1dd5954721d03cdda4818db0272ec618fb24605cf05517985a18e66bf5b2250f" }, "downloads": -1, "filename": "django-undeletable-0.5.1.tar.gz", "has_sig": false, "md5_digest": "6cd5ead31bd6b0ac766f1ffccd8c0e77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4101, "upload_time": "2018-01-15T09:12:00", "url": "https://files.pythonhosted.org/packages/42/f1/551aa0c7321e89f0bfb4eeec34dd3da8ba2f9d0020fc36ce189189601b1a/django-undeletable-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "21dddb3648739d8d990b3d13b45237be", "sha256": "6dfb0465a3cfcaf432c28642e1d3bd4e24382b53545cd40cf168db8ea210c791" }, "downloads": -1, "filename": "django_undeletable-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "21dddb3648739d8d990b3d13b45237be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9018, "upload_time": "2018-01-23T21:11:05", "url": "https://files.pythonhosted.org/packages/9c/4f/9fdbf40d837b93f05a4532cd71c0e6226c96d16791aeee366a12f1144a85/django_undeletable-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d49d7d4ba76ebd0de2835643f32d57c", "sha256": "1235ee4668af45a608a2c094d1be67fd93f194c7ab7265dbca9236d301616ee4" }, "downloads": -1, "filename": "django-undeletable-0.6.0.tar.gz", "has_sig": false, "md5_digest": "7d49d7d4ba76ebd0de2835643f32d57c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8537, "upload_time": "2018-01-23T21:11:06", "url": "https://files.pythonhosted.org/packages/e3/4c/1d308032417e01ea302756966a3a3425d397a916030eb4b065fc2bd07bee/django-undeletable-0.6.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "9e4ccb29ce5c983cb419410ec79824fa", "sha256": "2371a44751da3f43f68158a39cf74f2395e677f0c670e72eb876a940c2afd05f" }, "downloads": -1, "filename": "django_undeletable-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9e4ccb29ce5c983cb419410ec79824fa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9026, "upload_time": "2018-02-25T15:39:25", "url": "https://files.pythonhosted.org/packages/a2/52/8ac02464c012bbdf406e9d34fcd8271b7719ccc3db456a37cc436de01b47/django_undeletable-1.0.0-py2.py3-none-any.whl" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "6c1683247f45ecd48e86c512a0495e24", "sha256": "fd889bfc61bb9d076fd3a367d946ebfc1c94034bce10354688ca607405085db4" }, "downloads": -1, "filename": "django_undeletable-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6c1683247f45ecd48e86c512a0495e24", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.3", "size": 7495, "upload_time": "2019-02-17T12:16:59", "url": "https://files.pythonhosted.org/packages/7c/5d/3e2a87008e78761bedd809ef9ffaa572465c3a417ae23d7b7d0d32410731/django_undeletable-1.1.0-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6c1683247f45ecd48e86c512a0495e24", "sha256": "fd889bfc61bb9d076fd3a367d946ebfc1c94034bce10354688ca607405085db4" }, "downloads": -1, "filename": "django_undeletable-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6c1683247f45ecd48e86c512a0495e24", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.3", "size": 7495, "upload_time": "2019-02-17T12:16:59", "url": "https://files.pythonhosted.org/packages/7c/5d/3e2a87008e78761bedd809ef9ffaa572465c3a417ae23d7b7d0d32410731/django_undeletable-1.1.0-py2.py3-none-any.whl" } ] }