{ "info": { "author": "Alen Mujezinovic", "author_email": "alen@caffeinehit.com", "bugtrack_url": null, "classifiers": [], "description": "django-follow\n=============\n\n.. figure:: https://secure.travis-ci.org/caffeinehit/django-follow.png\n :align: center\n :alt: \n\ndjango-follow enables your users to follow any model in your Django\napplication.\n\nInstallation:\n-------------\n\n::\n\n pip install django-follow\n\nUsage:\n------\n\n- Add ``follow`` to your ``INSTALLED_APPS``\n- Include ``follow.urls`` into your URLs if you plan on using the\n views:\n\n ::\n\n urlpatterns = patterns('',\n url('^', include('follow.urls')),\n )\n\n- Register the models you want to be able to follow in your\n ``models.py`` files:\n\n ::\n\n from django.db import models\n from follow import utils\n\n class MyModel(models.Model):\n field = models.CharField(max_length = 255)\n\n\n utils.register(MyModel)\n\n**NOTE** You must register your models before running ``syncdb`` or you\nwill run into the issue described in\n`django-follow/issues/16 `_\n\nTest\n----\n\nThe repository includes a sample project and application that is\nconfigured to test ``django-follow``.\n\nClone the repository and cd into the project folder:\n\n::\n\n cd example/\n python manage.py test follow\n\nAPI\n---\n\nManager\n~~~~~~~\n\n- ``Follow.objects.create(user, obj, **kwargs)``:\n Makes ``user`` follow ``obj``\n\n- ``Follow.objects.get_or_create(user, obj, **kwargs)``:\n Returns a tuple ``(Follow, bool)``\n\n- ``Follow.objects.is_following(user, obj)``:\n Returns ``bool``\n\n- ``Follow.objects.get_follows(model_or_object_or_queryset)``:\n Returns all the ``Follow`` objects associated with a certain model,\n object or queryset.\n\n**Note on performance**\n\nI advise against against using ``Follow.objects.is_following`` too often\nin one request / response cycle on single objects. Use it on querysets\nto avoid stacking up too many queries.\n\nUtils\n~~~~~\n\n- ``follow.utils.register(model, field_name, related_name, lookup_method_name)``:\n Registers ``model`` to django-follow.\n\n- ``follow.utils.follow(user, object)``:\n Makes ``user`` follow ``object``\n\n- ``follow.utils.unfollow(user, object)``:\n Makes ``user`` unfollow ``object``\n\n- ``follow.utils.toggle(user, object)``:\n Toggles ``user``'s follow status of ``object``\n\n- ``follow.utils.follow_url(user, object)``:\n Returns the right follow/unfollow URL for ``user`` and ``object``\n\n- ``follow.utils.follow_link(object)``:\n Returns the following URL for ``object``\n\n- ``follow.utils.unfollow_link(object)``:\n Returns the unfollowing URL for ``object``\n\nTemplate Tags\n~~~~~~~~~~~~~\n\ndjango-follow ships a template tag that creates urls, a filter to check\nif a user follows an object and a template tag to render the follow\nform.\n\n::\n\n {% load follow_tags %}\n {% follow_url object %}\n {% request.user|is_following:object %}\n {% follow_form object %}\n {% follow_form object \"your/custom/template.html\" %}\n\n- ``{% follow_url object %}``:\n Returns the URL to either follow or unfollow the object, depending\n on whether ``request.user`` is already following the object.\n\n- ``{% follow_url object other_user %}``:\n Same as above - but instead of resolving for ``request.user`` it\n resolves for any user you pass in.\n\n- ``{% request.user|is_following:object %}``:\n Returns ``True``/``False`` if the user follows / does not follow the\n object.\n\n- ``{% follow_form object %}``:\n Renders a form to follow a given object.\n\n- \\`{% follow\\_form object \"your/custom/template.html\" %}:\n Renders the form with a custom template.\n\nSignals\n~~~~~~~\n\ndjango-follow provides two signals:\n\n- ``follow.signals.followed(sender, user, target, instance)``\n- ``follow.signals.unfollowed(sender, user, target, instance)``\n\nTo invoke a handler every time a ``User`` or ``Group`` object is\nfollowed, do something along these lines:\n\n::\n\n from django.contrib.auth.models import User\n from follow import signals\n\n def user_follow_handler(user, target, instance, **kwargs):\n send_mail(\"You were followed\", \"You have been followed\", \"no-reply@localhost\", [target.email])\n\n def group_follow_handler(user, target, instance, **kwargs):\n send_mail(\"Group followed\", \"%s has followed your group\" % user, \"no-reply@localhost\", [[u.email for u in target.user_set.all()]])\n\n signals.followed.connect(user_follow_handler, sender = User, dispatch_uid = 'follow.user')\n signals.followed.connect(group_follow_handler, sender = Group, dispatch_uid = 'follow.group')\n\nThis works vica versa with the unfollowed handler too.\n\n**NOTE**\n\nWhen handling ``follow.signals.unfollowed`` both ``user`` and/or\n``target`` can be ``None``. Django's admin for example will first delete\nthe user resulting in ``instance.user`` to throw ``DoesNotExist``.\nBeware.\n\nRelease Notes\n-------------\n\nv0.5 - *BACKWARDS INCOMPATIBLE*\n\n- The follow and unfollow views now only accept POST requests\n\nv0.4 - *BACKWARDS INCOMPATIBLE*\n\n- Made the manager *a lot* lighter.\n- Removed ``Model.followers`` method\n- Added ``Model.get_follows`` method returning all the ``Follow``\n objects\n- Moved ``Follow.follower`` to ``Follow.user``\n- Replaced ``Follow.get_object`` method with read/writable\n ``Follow.target`` property\n- ``follow.util`` moved to ``follow.utils``\n- No more M2M following\n\n--------------\n\n`@flashingpumpkin `_", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/caffeinehit/django-follow", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "django-follow", "package_url": "https://pypi.org/project/django-follow/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-follow/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/caffeinehit/django-follow" }, "release_url": "https://pypi.org/project/django-follow/0.6.1/", "requires_dist": null, "requires_python": null, "summary": "Application which enables following features for users. Can be used for contact books or whatnot", "version": "0.6.1" }, "last_serial": 789676, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b723e2c480959e9f86aa9b8e307293c9", "sha256": "ba0df0c789012c5b33aa3678b7534af4c2d315ed1698766cc9b5287c1f8b6d73" }, "downloads": -1, "filename": "django-follow-0.1.tar.gz", "has_sig": false, "md5_digest": "b723e2c480959e9f86aa9b8e307293c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4178, "upload_time": "2011-01-05T17:05:12", "url": "https://files.pythonhosted.org/packages/7e/3e/bb7c5939f500c168da2bc0c9d50fabecf708e85f8a2a72ae2598a75abae8/django-follow-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "1a6fc6e8ca5ab2df5718993d013d8124", "sha256": "ca4901717452722833da7ffbe1d736633fa73d95574f867c2b3f3ef273075cc7" }, "downloads": -1, "filename": "django-follow-0.2.tar.gz", "has_sig": false, "md5_digest": "1a6fc6e8ca5ab2df5718993d013d8124", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4185, "upload_time": "2011-01-11T13:26:05", "url": "https://files.pythonhosted.org/packages/62/8d/6f930709e4b482d1a0ea0ef9368e5fad4e2eb4bcf680480b5cfad921e85a/django-follow-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "2abef7a6f8765097ac8fa7fe260ecc5b", "sha256": "024a74aa414b99cd9ea952a48338759a4056f4567d0b5037b2927a4aa80326e2" }, "downloads": -1, "filename": "django-follow-0.3.tar.gz", "has_sig": false, "md5_digest": "2abef7a6f8765097ac8fa7fe260ecc5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8308, "upload_time": "2011-05-02T16:01:48", "url": "https://files.pythonhosted.org/packages/8e/ff/a7d728a29d9c87ce02ab467f53a0c8f929a013d2349fc1d27a3da1d4e8ad/django-follow-0.3.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "fd9d8a85c6051cf219b487d6452c9f96", "sha256": "8aa7e9e136b8f4e93ade4b67277ef791d140eff4c78ad51435eda0f533051273" }, "downloads": -1, "filename": "django-follow-0.4.2.tar.gz", "has_sig": false, "md5_digest": "fd9d8a85c6051cf219b487d6452c9f96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7809, "upload_time": "2011-07-22T18:48:20", "url": "https://files.pythonhosted.org/packages/f8/4d/f8f4cd526f802c5b9a6090ce0e1f71a09bc2f9a0909ac6c652952f5ea7d4/django-follow-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "33e9b696d97816164545f2b654dcd16d", "sha256": "c7c131e283f1d968442bdd3ef4f68f20463913449a96157bfab48a75f941a530" }, "downloads": -1, "filename": "django-follow-0.4.3.tar.gz", "has_sig": false, "md5_digest": "33e9b696d97816164545f2b654dcd16d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7830, "upload_time": "2011-07-25T14:49:40", "url": "https://files.pythonhosted.org/packages/77/55/c3627d6e308a56db4ddcee0a80f440b4e792615709cc50b5abe2daa362f3/django-follow-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "6eddf211714879618539fbb058ff8f2a", "sha256": "6cd5e203d4614a30635cfb5f8cd6e471defe762008da7bcfa789c1ccfd2d7d8f" }, "downloads": -1, "filename": "django-follow-0.4.4.tar.gz", "has_sig": false, "md5_digest": "6eddf211714879618539fbb058ff8f2a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8937, "upload_time": "2011-07-25T15:41:15", "url": "https://files.pythonhosted.org/packages/56/aa/082585f2710dab03d7f22bdececc9de105dab0acc4f6a7dc8ae9f4fe12d4/django-follow-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "8334750fccb33da1356a03e46dfa139e", "sha256": "4574034f13aadc1c7e671dc9f1e895be2a6ce7c7dc60487c5477d66d910cd302" }, "downloads": -1, "filename": "django-follow-0.4.5.tar.gz", "has_sig": false, "md5_digest": "8334750fccb33da1356a03e46dfa139e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9057, "upload_time": "2011-07-29T15:53:48", "url": "https://files.pythonhosted.org/packages/aa/47/475580cdbc6f242c2b66050c6a73eff160bcf8ebe37ab86bc2c8e6413ba7/django-follow-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "8cb0d982bcfa85aeb1312355926c14b5", "sha256": "90265ad57febb9995d58e5221061de7f6d19108f1597c8c324070f9790f1da1f" }, "downloads": -1, "filename": "django-follow-0.4.6.tar.gz", "has_sig": false, "md5_digest": "8cb0d982bcfa85aeb1312355926c14b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9125, "upload_time": "2011-07-29T16:05:32", "url": "https://files.pythonhosted.org/packages/e2/f2/91b19110a4758eb8ee5149c00d77e18009b58da56360fab7782da9b4eea0/django-follow-0.4.6.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "398da213e3a834a63c829de5e2a6b08a", "sha256": "27b517e6a6ad24a490a185899619f7925be10e49c49fa6bb3dbcd061c2bcdd22" }, "downloads": -1, "filename": "django-follow-0.5.0.tar.gz", "has_sig": false, "md5_digest": "398da213e3a834a63c829de5e2a6b08a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9794, "upload_time": "2011-08-03T18:25:03", "url": "https://files.pythonhosted.org/packages/7d/e8/403ceeb869ff33c41d6bac4291be28c51952e9392ae471397bb0935a123c/django-follow-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "650f860da47f81357ad89dbc821b56e2", "sha256": "8ab2f553d3008b29ea3fd08e06a27d6c05962a5cbabd7b923679258378c0c8b9" }, "downloads": -1, "filename": "django-follow-0.5.1.tar.gz", "has_sig": false, "md5_digest": "650f860da47f81357ad89dbc821b56e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9967, "upload_time": "2011-08-03T18:39:15", "url": "https://files.pythonhosted.org/packages/59/05/b63c27165e2cda63030676daeafe7b05adbc5cb2aa007bed2deaf3a3d277/django-follow-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "17d13e9ce29d4d30f32bfc0d3e5365ac", "sha256": "7a76f6364018ff0376bbc9da38f3c56372b8b7654aa987e7402bbd60cb26b6d5" }, "downloads": -1, "filename": "django-follow-0.5.2.tar.gz", "has_sig": false, "md5_digest": "17d13e9ce29d4d30f32bfc0d3e5365ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10007, "upload_time": "2011-09-07T16:39:36", "url": "https://files.pythonhosted.org/packages/7b/00/0f27831f2525c0f178ed61017c54d5e29369eea5d1d1108d35abba576007/django-follow-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "a0a056545c0e504784ccebbcf67f8652", "sha256": "5cdc5efe7dbc8c7b80d7979f9918cef32c74876614788744764edf27e6a091ca" }, "downloads": -1, "filename": "django-follow-0.5.3.tar.gz", "has_sig": false, "md5_digest": "a0a056545c0e504784ccebbcf67f8652", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10423, "upload_time": "2011-12-15T17:11:57", "url": "https://files.pythonhosted.org/packages/0c/26/0982dda58668e644736ed780d6111e6ac8ea92f23ba865fd3d095865a20b/django-follow-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "c0a458152a9bce6464ce83a47d214281", "sha256": "e4d20d4e8d0bf9dc94b67ef357a93decaa531e180bb1384784db5814709ca2a4" }, "downloads": -1, "filename": "django-follow-0.5.4.tar.gz", "has_sig": false, "md5_digest": "c0a458152a9bce6464ce83a47d214281", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13634, "upload_time": "2012-03-09T12:09:10", "url": "https://files.pythonhosted.org/packages/48/99/b0ce9759d7beadb86830213579fe886cc6aae9bf24aafcb3b5e10b141e5c/django-follow-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "4d9368cbc58fff44089008ec0428d032", "sha256": "3fe66a5533efc8b14af926f58543e90d9c13964a854e0ad271ebe07001690843" }, "downloads": -1, "filename": "django-follow-0.5.5.tar.gz", "has_sig": false, "md5_digest": "4d9368cbc58fff44089008ec0428d032", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13629, "upload_time": "2012-03-09T12:10:32", "url": "https://files.pythonhosted.org/packages/f0/f7/1d1ea2d8f7f97266c6eb2e074ae613c8ddb3907ec0e00eb22572b3553457/django-follow-0.5.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "df00d4c6f4cc88d7d6dadfa4ff1de4ec", "sha256": "892638e8d9b33820ce70c961dc1988670136dee20aebf7654b1a46e134028e3d" }, "downloads": -1, "filename": "django-follow-0.6.tar.gz", "has_sig": false, "md5_digest": "df00d4c6f4cc88d7d6dadfa4ff1de4ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14143, "upload_time": "2012-03-09T12:42:56", "url": "https://files.pythonhosted.org/packages/85/24/93723e22bbcba3ca4be1f264a4790cf2566ee7681c842fe09822a6ad4d5b/django-follow-0.6.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "fb15bf1f9a834d432dfc480f57f54c5a", "sha256": "7c1b3b90c010e37fbc3eed3c10377b57a36e8e9c67d9574f04cf4690c2beca37" }, "downloads": -1, "filename": "django-follow-0.6.1.tar.gz", "has_sig": false, "md5_digest": "fb15bf1f9a834d432dfc480f57f54c5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14312, "upload_time": "2013-01-16T11:41:01", "url": "https://files.pythonhosted.org/packages/37/6c/4641350c2a95b582d5a56d757815973607eea558d3b5c0a5b4f80e4b53cf/django-follow-0.6.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fb15bf1f9a834d432dfc480f57f54c5a", "sha256": "7c1b3b90c010e37fbc3eed3c10377b57a36e8e9c67d9574f04cf4690c2beca37" }, "downloads": -1, "filename": "django-follow-0.6.1.tar.gz", "has_sig": false, "md5_digest": "fb15bf1f9a834d432dfc480f57f54c5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14312, "upload_time": "2013-01-16T11:41:01", "url": "https://files.pythonhosted.org/packages/37/6c/4641350c2a95b582d5a56d757815973607eea558d3b5c0a5b4f80e4b53cf/django-follow-0.6.1.tar.gz" } ] }