{ "info": { "author": "Eran Rundstein / FundersClub Inc.", "author_email": "eran@fundersclub.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Database", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "# django-papertrail\n\nAn elegant solution for keeping a relational log of chronological events in a Django application.\n\n[![](https://img.shields.io/pypi/l/django-papertrail.svg)](https://pypi.python.org/pypi/django-papertrail)\n[![](https://img.shields.io/pypi/v/django-papertrail.svg)](https://pypi.python.org/pypi/django-papertrail)\n[![](https://circleci.com/gh/FundersClub/django-papertrail.svg?&style=shield)](https://circleci.com/gh/FundersClub/django-papertrail)\n\n\n## Installation\n\nTo install `django-papertrail`:\n```\n$ pip install django-papertrail\n```\n\nTo enable `django-papertrail` in your project you need to add it to `INSTALLED_APPS` in your projects\n`settings.py` file:\n```python\nINSTALLED_APPS = (\n ...\n 'papertrail',\n ...\n)\n```\n\n\nAfter that, you should migrate:\n```\n$ python manage.py migrate\n```\n\n## Using it\n\n```python\nimport papertrail\n\n###########################################################################\n# Creating entries\n###########################################################################\n\n# Basic usage. Timestamp defaults to now\npapertrail.log('cache-flushed', 'Cache was flushed!')\n\n# Optional data\npapertrail.log(\n 'periodic-cleanup-ran',\n 'Periodic cleanup task executed.',\n data={\n 'success': True,\n 'cleaned_objects': 100,\n }\n)\n\n# Optional targets\npapertrail.log(\n 'user-logged-in',\n u'{} logged in'.format(request.user.get_full_name()),\n targets={\n 'user': request.user,\n }\n)\n\n# Optional timestamp\npapertrail.log(\n 'user-joined',\n 'User joined site',\n targets={\n 'user': request.user,\n },\n timestamp=request.user.date_joined,\n)\n\n# Multiple targets\nuser1 = User.objects.get(...)\nuser2 = User.objects.get(...)\npapertrail.log(\n 'user-followed',\n 'User followed another user',\n targets={\n 'follower': user1,\n 'following': user2,\n },\n)\n\n###########################################################################\n# Querying the papertrail\n###########################################################################\n\n# Gettying all papertrail entries that points to user1, without taking\n# into account the target relationship name\nqs = papertrail.related_to(user)\nentry = qs.first()\nprint '[{}] {} ({}) - {}'.format(\n entry.timestamp, entry.type, entry.message, entry.data\n)\n\n# Get all entry that points to both users\n# (Will only return entries that have both user1 and user2 in their\n# targets)\nqs = papertrail.related_to(user1, user2)\n\n# Query specific relationships, such as user1 following user2\nqs = papertrail.related_to(follower=user1, following=user2)\n\n# Filtering entry by a specific type (or any Django ORM filter)\nqs = papertrail.filter(type='user-followed')\n\n# And chaining\nqs = papertrail.filter(type='user-followed').related_to(follower=user1)\n\n# Get all the users that have followed a specific user (user1). This might\n# look a bit confusing at first, but can be very useful.\n# The objects_represented filter allows filtering a given queryset to contain\n# only elements that have a specific papertrail entry pointing at them.\nall_users = get_user_model().objects.all()\nusers_who_followed_user1 = (papertrail\n # Narrow down to only user-followed entries that followed user1\n .filter(type='user-followed')\n .related_to(following=user1)\n # Return a User queryset that only has the users for which we have a\n # user-followed entry that has a followed target pointing at them\n .objects_represented(all_users, 'followed')\n)\n\n# objects_not_represented does the same, but returns a queryset that\n# excludes any object that has a papertrail entry pointing at it:\n# Get all users who never logged in\nusers_who_never_logged_in = (papertrail\n .filter(type='user-logged-in')\n .objects_not_represented(all_users, 'user')\n)\n```\n\n## Admin integration\n\n`django-papertrail` provides a Django admin integration to both view entries\n(simple Django admin Entry list, usually available under /admin/papertrail/entry/)\nas well as a more advanced intergration for objects you want to keep track of.\n\nThe advanced integration provides two useful functionalities:\n\n1) Change tracking - whenever an object for which the integration is enabled is\n added/edited/deleted, a papertrail entry will be created\n2) A convenient link to view all papertrail entries pointing to the object\n being viewed as well as an integrated papertrail viewer:\n\n![](https://raw.githubusercontent.com/FundersClub/django-papertrail/master/docs/scrshots/admin-view-link.png)\n![](https://raw.githubusercontent.com/FundersClub/django-papertrail/master/docs/scrshots/admin-viewer.png)\n\nTo enable the integration, your `ModelAdmin` class needs to inherit from `AdminEventLoggerMixin`:\n\n```python\nfrom papertrail.admin import AdminEventLoggerMixin\n\nclass MyObjectAdmin(AdminEventLoggerMixin, admin.ModelAdmin):\n pass\n\n # The admin papertrail viewer can have filters:\n papertrail_type_filters = {\n 'Login events': (\n 'user-logged-in',\n 'user-logged-out',\n ),\n 'Social events': (\n 'user-followed',\n 'user-unfollowed',\n ),\n }\n```\n\n\nA viewer with filters would look like this:\n\n![](https://raw.githubusercontent.com/FundersClub/django-papertrail/master/docs/scrshots/admin-viewer-filter.png)\n\n\nMaintained by [Eran Rundstein @eranrund](https://www.github.com/eranrund/)", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://www.github.com/FundersClub/django-papertrail", "keywords": "", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "django-papertrail", "package_url": "https://pypi.org/project/django-papertrail/", "platform": "", "project_url": "https://pypi.org/project/django-papertrail/", "project_urls": { "Homepage": "https://www.github.com/FundersClub/django-papertrail" }, "release_url": "https://pypi.org/project/django-papertrail/1.1.9/", "requires_dist": null, "requires_python": "", "summary": "An elegant solution for keeping a relational log of chronological events in a Django application.", "version": "1.1.9" }, "last_serial": 4181677, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "2f84e8e3d259c9cf5b1cae6c979b5ead", "sha256": "02468c480b7b38ce6907607d88aeca3fdbc31b0ef6b12be57b9f838f72d00d22" }, "downloads": -1, "filename": "django-papertrail-1.0.1.tar.gz", "has_sig": false, "md5_digest": "2f84e8e3d259c9cf5b1cae6c979b5ead", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16395, "upload_time": "2016-03-16T21:00:44", "url": "https://files.pythonhosted.org/packages/17/bc/5031bda213c83a245b750327fd1a26f480ff8f2748ab5049940193ae0f99/django-papertrail-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "4788823137f05c81abb85c322d7e6a46", "sha256": "17324bfc8fd90b8d95c2f37294a44a46d10fc9d0aeb350ef1702ff5b8e582a33" }, "downloads": -1, "filename": "django-papertrail-1.0.2.tar.gz", "has_sig": false, "md5_digest": "4788823137f05c81abb85c322d7e6a46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16394, "upload_time": "2016-03-16T21:03:06", "url": "https://files.pythonhosted.org/packages/79/26/385f7bbb4b8d48e867599ce5a9d31169a3517b13704d483fde822a71754b/django-papertrail-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "ee6588f40b23ce2c35fbf06fcdf2b4e4", "sha256": "ab73cbb83059a7b425a3fa5cf59d38362d0ab8a693222c57dd174493c883faa4" }, "downloads": -1, "filename": "django-papertrail-1.0.3.tar.gz", "has_sig": false, "md5_digest": "ee6588f40b23ce2c35fbf06fcdf2b4e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16396, "upload_time": "2016-03-16T21:11:33", "url": "https://files.pythonhosted.org/packages/c8/ff/e243d19bd07ac4377e6ed13b37dd03c63a8a1655697ac4fb87bcc294fc7b/django-papertrail-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "503e3bd486a6e2c41d92745e4e0200cd", "sha256": "92884e8cbe90e9b52d2797269550ee48799ee445caf742a71f2af110727a905b" }, "downloads": -1, "filename": "django-papertrail-1.0.4.tar.gz", "has_sig": false, "md5_digest": "503e3bd486a6e2c41d92745e4e0200cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16412, "upload_time": "2016-06-15T10:53:55", "url": "https://files.pythonhosted.org/packages/74/50/fc15ecf86bca04b77bf9e40a48c22a6deb3aca148c370826afe030b22c69/django-papertrail-1.0.4.tar.gz" } ], "1.0.5": [], "1.0.6": [ { "comment_text": "", "digests": { "md5": "dcfbb709ca592faceab07211829a1980", "sha256": "055def8b7493cb375a33cd02a16f47968a3ea4935f425b0da9f8915658255025" }, "downloads": -1, "filename": "django-papertrail-1.0.6.tar.gz", "has_sig": false, "md5_digest": "dcfbb709ca592faceab07211829a1980", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16457, "upload_time": "2016-06-22T22:10:37", "url": "https://files.pythonhosted.org/packages/0d/e6/cb3ca1962f6cfc5411d9767a1c4855496a731e5f73cea473d31d4c26188d/django-papertrail-1.0.6.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "6ca41b09d4a2643ea15148d5e6e1f894", "sha256": "dba3aadfc18c8a12c2bbd02160ceb63394e7208d3a8c303ab80aeaf2fe58170c" }, "downloads": -1, "filename": "django-papertrail-1.1.0.tar.gz", "has_sig": false, "md5_digest": "6ca41b09d4a2643ea15148d5e6e1f894", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16996, "upload_time": "2016-07-28T17:54:49", "url": "https://files.pythonhosted.org/packages/da/5a/2e07ef245b0388c2dc8cbbec934fe9458f5ffe7919a2c0834b2f3d9a06f4/django-papertrail-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "8099336df24626ca3a7475d8afa7656a", "sha256": "638e8c1c7c88316692b6f0ba57b474f5c9bb33d47bc4540bc9456e7c7edfbaee" }, "downloads": -1, "filename": "django-papertrail-1.1.1.tar.gz", "has_sig": false, "md5_digest": "8099336df24626ca3a7475d8afa7656a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17290, "upload_time": "2016-07-28T19:49:51", "url": "https://files.pythonhosted.org/packages/27/1f/7dc149935d5178abee3e70d08365a1b91b8429f83ee260e59d2b9b89802b/django-papertrail-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "0d0df25343a8c7389e83fbad951c6194", "sha256": "0acf635c2331064294a5aecd8a783c9c836fcdeb7056b43e8aa0feb56ef5c8b8" }, "downloads": -1, "filename": "django-papertrail-1.1.2.tar.gz", "has_sig": false, "md5_digest": "0d0df25343a8c7389e83fbad951c6194", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17762, "upload_time": "2016-08-16T22:25:06", "url": "https://files.pythonhosted.org/packages/f9/b2/1ec7dc582a6c7fe3d9f055f2e71bcdff1cc2b12f2852b73ba7890add9962/django-papertrail-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "33ee543dad1a9eca43b14f636f4594e4", "sha256": "795a8439da5296d222f3f325413f622aa8d0296c3207ee7c78e85439068c3da7" }, "downloads": -1, "filename": "django-papertrail-1.1.3.tar.gz", "has_sig": false, "md5_digest": "33ee543dad1a9eca43b14f636f4594e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19210, "upload_time": "2017-01-24T00:35:32", "url": "https://files.pythonhosted.org/packages/a8/9a/da16a9b39c0523b7d617158e8171741a4debd8d7e4c6b313526222533078/django-papertrail-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "b77c4b528f6c6fd586181d32caad9ed2", "sha256": "a9d3d09492788e096d96b6c922fb6ddb9fff2c838060729a7ff17782ec4ca956" }, "downloads": -1, "filename": "django-papertrail-1.1.4.tar.gz", "has_sig": false, "md5_digest": "b77c4b528f6c6fd586181d32caad9ed2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17886, "upload_time": "2017-04-10T20:17:47", "url": "https://files.pythonhosted.org/packages/bc/ac/6e642f0eeaa1e0138de59c367a85b20ef87dc8be3bae145ac5f00b82b9ec/django-papertrail-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "4264cbb1be01c8dba3dbfdfa5f17e44a", "sha256": "d20617846d051a30bc69dc3e6869e00a5213b2d3f5c50be067910fdc1219337d" }, "downloads": -1, "filename": "django-papertrail-1.1.5.tar.gz", "has_sig": false, "md5_digest": "4264cbb1be01c8dba3dbfdfa5f17e44a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17881, "upload_time": "2017-11-02T00:39:28", "url": "https://files.pythonhosted.org/packages/51/85/c06287e468da31a7f6fff0d0e09e8089c3cc7c7c71a42c7693bd5ef25b3b/django-papertrail-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "a1be34bbc98edce663b1b89dd1ac5c20", "sha256": "e73630c2711900e65e285045bdec669518de8b8a99fbb60647e3ca3b14cd99ba" }, "downloads": -1, "filename": "django-papertrail-1.1.6.tar.gz", "has_sig": false, "md5_digest": "a1be34bbc98edce663b1b89dd1ac5c20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17894, "upload_time": "2017-11-28T19:28:16", "url": "https://files.pythonhosted.org/packages/2e/91/627e4759bdc8b1d20000ab7a44dbec0fb96bc66cf16a7ced4edbf1806348/django-papertrail-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "47c293a0acb903b168ac9f7af9fce4bb", "sha256": "84a16c68012354d1628d0e43a68b1341deaec2fad3414569efcee96d7ab2af8a" }, "downloads": -1, "filename": "django-papertrail-1.1.7.tar.gz", "has_sig": false, "md5_digest": "47c293a0acb903b168ac9f7af9fce4bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19877, "upload_time": "2017-12-21T22:48:00", "url": "https://files.pythonhosted.org/packages/2f/4c/d07c241a55f13982a442f7644c5e3f1354c926d4cff7ae7f27a4cecdc60e/django-papertrail-1.1.7.tar.gz" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "7c0889e6edcaf50f36a79d9ec9920e34", "sha256": "1dfa49558068cb90cb166905533e5790afddd1bc327fdcea031196ceec4a77d5" }, "downloads": -1, "filename": "django-papertrail-1.1.8.tar.gz", "has_sig": false, "md5_digest": "7c0889e6edcaf50f36a79d9ec9920e34", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17880, "upload_time": "2018-04-18T18:00:10", "url": "https://files.pythonhosted.org/packages/f6/97/c1c69c6893e28dd90cf45df46586ea885b65c7bc4768bd920e63479bab6e/django-papertrail-1.1.8.tar.gz" } ], "1.1.9": [ { "comment_text": "", "digests": { "md5": "089a3fc37dc8f8d47d601f7c0143661b", "sha256": "632518456966a9e9d48b59c16e82ade96a59f48b24974087957119c705e053a3" }, "downloads": -1, "filename": "django-papertrail-1.1.9.tar.gz", "has_sig": false, "md5_digest": "089a3fc37dc8f8d47d601f7c0143661b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14288, "upload_time": "2018-08-17T20:31:13", "url": "https://files.pythonhosted.org/packages/8a/d2/8b862dbd01e149d66099aa81f37d4ffb213fa532d2507da3e2980ce63929/django-papertrail-1.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "089a3fc37dc8f8d47d601f7c0143661b", "sha256": "632518456966a9e9d48b59c16e82ade96a59f48b24974087957119c705e053a3" }, "downloads": -1, "filename": "django-papertrail-1.1.9.tar.gz", "has_sig": false, "md5_digest": "089a3fc37dc8f8d47d601f7c0143661b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14288, "upload_time": "2018-08-17T20:31:13", "url": "https://files.pythonhosted.org/packages/8a/d2/8b862dbd01e149d66099aa81f37d4ffb213fa532d2507da3e2980ce63929/django-papertrail-1.1.9.tar.gz" } ] }