{ "info": { "author": "Alexander Schepanovski", "author_email": "suor.web@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 1.7", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD 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.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Handy\n=====\n\nA collection of different tools, shortcuts, decorators, form and model fields\nto make your django life easier.\n\n\nInstallation\n-------------\n\n::\n\n pip install handy\n\n\nOverview\n--------\n\nHere are quick overview of what you can do with handy.\nYou can also read `full docs `_.\n\nAvoid ``HttpResponse`` and ``render_to_response()`` biolerplate with ``@render_to()`` decorator.\nThis one will render result dict to ``'app_name/foo.html'``:\n\n.. code:: python\n\n @render_to()\n def foo(request):\n return {\n 'bar': Bar.objects.all()\n # You can easily override default template, content type,\n # status code and add cookies to response:\n 'STATUS': 410,\n 'CONTENT_TYPE': 'text/plain'\n }\n\n\nEasy JSON responders with ``@render_to_json()`` decorator:\n\n.. code:: python\n\n @render_to_json()\n def posts_by_tag(request, tag=None):\n posts = Post.object.values().filter(tag=tag)\n return list(posts)\n\n\nAnd higher order ``@ajax`` decorator to handle more complex asynchronous actions:\n\n.. code:: python\n\n @ajax\n @ajax.login_required\n @ajax.catch(Post.DoesNotExist)\n def enable_post(request):\n post = Post.objects.get(pk=request.GET['id'])\n\n if post.author != request.user:\n raise ajax.error('permission_denied')\n\n post.enabled = True\n post.save()\n\n\nSend emails rendered from templates:\n\n.. code:: python\n\n render_to_email(article.author.email, 'approved.html', {'article': article})\n\n\nA collection of model fields with accompanying form fields and widgets. Most notably different array fields to store array of values or choices:\n\n.. code:: python\n\n DAYS = zip(range(7), 'Sun Mon Tue Wed Thu Fri Sat'.split())\n\n class Company(models.Model):\n phones = StringArrayField('Phone numbers', blank=True, default=lambda: [])\n workdays = IntegerArrayField('Work days', choices=DAYS)\n\n company = Company(phones=['234-5016', '516-2314'], workdays=[1,2,3,4])\n company.save()\n\nIn model form ``phones`` field would be represented as ``CommaSeparatedInput`` and\n``workdays`` as multiple checkboxes:\n\n.. code:: python\n\n class CompanyForm(forms.ModelForm):\n class Meta:\n model = Company\n\n\nA handy ``@cached_property`` utility:\n\n.. code:: python\n\n class UserProfile(models.Model):\n phones = models.ManyToManyField(Phone)\n\n ...\n\n @cached_property\n def public_phones(self):\n # this queryset will be constructed only once, thanks to @cached_property\n return self.phones.filter(public=True)\n\n\nA bunch of database querying utilities to not tinker with ``cursor()`` anymore:\n\n.. code:: python\n\n best_offer = fetch_val('select max(value) from offers where ...')\n\n for row in fetch_named('select * from blog_post'):\n print row.id, row.title\n\n\nAnd a middleware to make your html output slimmer by stripping out unnecessary spaces:\n\n.. code:: python\n\n MIDDLEWARE_CLASSES = (\n ...\n 'handy.middleware.StripWhitespace',\n )\n\n\nAnd more:\n\n- simple logger wrap up\n- ``CommaSeparatedInput`` and ``MultilineInput`` widgets for array fields\n- ``JSONField``, ``AdditionalAutoField`` and ``BigAutoField``\n- and a bunch of database, email, text and debugging utilities\n\nNOTE: functional tools, namely ``@memoize`` and ``@cache``, moved to\n`funcy `_\n\n\nHow you can help\n----------------\n\n- give me any feedback. What bits are most useful? What can be added or changed?\n- bring your ideas and/or code that can make all our django experience more fun\n\n\nTODO\n----\n\n- docs for text and just utils\n- add support for querysets and models in JSON decorators\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/Suor/handy", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "handy", "package_url": "https://pypi.org/project/handy/", "platform": "", "project_url": "https://pypi.org/project/handy/", "project_urls": { "Homepage": "http://github.com/Suor/handy" }, "release_url": "https://pypi.org/project/handy/0.7/", "requires_dist": null, "requires_python": "", "summary": "A collection of tools to make your django life easier.", "version": "0.7" }, "last_serial": 3453008, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b6208b62a70a8cea1943035e62ee8be5", "sha256": "fb9728383bf726fad08081d2aa1f71f33b4ef78b98a79b09e1fe8755cc1ff00f" }, "downloads": -1, "filename": "handy-0.1.tar.gz", "has_sig": false, "md5_digest": "b6208b62a70a8cea1943035e62ee8be5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7015, "upload_time": "2012-05-19T17:56:17", "url": "https://files.pythonhosted.org/packages/d4/73/3add98d14abe2aa08ac2c166918f4a864b157d6c03a1ee63328e65e3e5ce/handy-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "7eda0409570d5f6b88413ef6038f7821", "sha256": "94c4cee873ffc393f630cf21565a750c85ee95c5a9efc6561096bbefea011f96" }, "downloads": -1, "filename": "handy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "7eda0409570d5f6b88413ef6038f7821", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8527, "upload_time": "2012-06-09T15:06:23", "url": "https://files.pythonhosted.org/packages/66/e5/248a95117abf1ce6fd7ab65e0ff1ceb1adb7d5a6858a21fb8dd103f78f10/handy-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "2814bc1e2d86bbdfb7e866cedf06ed52", "sha256": "eb0bfca586b83d023504a537ed116e78475e04ae012957facecbd0b676267809" }, "downloads": -1, "filename": "handy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "2814bc1e2d86bbdfb7e866cedf06ed52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9148, "upload_time": "2012-09-12T13:51:01", "url": "https://files.pythonhosted.org/packages/8a/f9/e49a3dc95d33dfed88067a20bbe05421f4079d4f3ed88452a6e474f87437/handy-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "b0e6c7ae700b423a23df46714d8a52ed", "sha256": "9eb9f7cda463d668be507c8378a9680a44a9c1540641b39ea3328f975a3c62a6" }, "downloads": -1, "filename": "handy-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b0e6c7ae700b423a23df46714d8a52ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12233, "upload_time": "2012-09-13T06:28:20", "url": "https://files.pythonhosted.org/packages/ee/29/8154335deccbe3c755650bfd73c6e59172861a4a61926c56ad43ee87538a/handy-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "bcb930de955a5701d84f963255b1dbf0", "sha256": "27085b0fc39d93f99eadca670abbd6eff96200db4364e7f2a9f8088869248dd5" }, "downloads": -1, "filename": "handy-0.1.4.tar.gz", "has_sig": false, "md5_digest": "bcb930de955a5701d84f963255b1dbf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13866, "upload_time": "2012-11-26T06:55:42", "url": "https://files.pythonhosted.org/packages/3b/a8/fa562f40d9bf52e9e75d0fb056110d2bd5a5fcb0544929f683aa8e46b613/handy-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "3339d1be2d97deddeaefe7e163d6b056", "sha256": "f26a44283b94a68319393b13a1c78f48d26353664685eedafc0d54217dab75ea" }, "downloads": -1, "filename": "handy-0.1.5.tar.gz", "has_sig": false, "md5_digest": "3339d1be2d97deddeaefe7e163d6b056", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14041, "upload_time": "2013-01-20T05:55:13", "url": "https://files.pythonhosted.org/packages/25/9a/003dcae0348040b980c14f32cf11e902717094f3426828caba95660b211d/handy-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "19539dbbb5c08cc86c752963b49558b1", "sha256": "89e7f2d12fda057451627e3ff27115d023e06c329f1be9bebc76595e66f82c1c" }, "downloads": -1, "filename": "handy-0.1.6.tar.gz", "has_sig": false, "md5_digest": "19539dbbb5c08cc86c752963b49558b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14192, "upload_time": "2013-02-27T03:03:04", "url": "https://files.pythonhosted.org/packages/da/0a/d4a5a9bdcea18a17118e038d5dccc653efc4510f33b987e1ed553fe6f9fb/handy-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "2eba4c50666c7233b06204722fd248b8", "sha256": "dc659e8a7a685157b2c5d8d5d65ef55402c293738423bd84dff755fa3f49ad1f" }, "downloads": -1, "filename": "handy-0.1.7.tar.gz", "has_sig": false, "md5_digest": "2eba4c50666c7233b06204722fd248b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14459, "upload_time": "2013-06-20T02:59:38", "url": "https://files.pythonhosted.org/packages/ea/23/aa55e0dfd3396e79031416036ab3909d85d55ba302a5840c4da6a0940783/handy-0.1.7.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "24cdf0e3c3441ba1157e3109190f5ab7", "sha256": "4993529ca284acd49084fe9779ccdfe38c0fc7d4c3a587fcea1487b1b4a35822" }, "downloads": -1, "filename": "handy-0.2.0.tar.gz", "has_sig": false, "md5_digest": "24cdf0e3c3441ba1157e3109190f5ab7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14532, "upload_time": "2013-09-12T05:04:34", "url": "https://files.pythonhosted.org/packages/48/6d/0b472c61ffe0204a5976e9a011556b42bb74871d37b16a048affb2c67291/handy-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "fbac14ea754a03c8f7daf22b8817a3a4", "sha256": "650070909800b04d0585d574bbfafc83ac13703a298ae72ab2bebb8563936819" }, "downloads": -1, "filename": "handy-0.2.1.tar.gz", "has_sig": false, "md5_digest": "fbac14ea754a03c8f7daf22b8817a3a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14128, "upload_time": "2013-09-12T05:20:42", "url": "https://files.pythonhosted.org/packages/f3/bd/4e87027ecb16683b79f4c2c530741719c8b84218c0ac86aa1a43ce7cf665/handy-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "da8051d00585360822043f5d2a967bc2", "sha256": "8b72f1b53bd3133444b1f14ffd05fbfc2c2d4da5673df2308a5e3a0955986c65" }, "downloads": -1, "filename": "handy-0.2.2.tar.gz", "has_sig": false, "md5_digest": "da8051d00585360822043f5d2a967bc2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14312, "upload_time": "2013-09-20T04:15:53", "url": "https://files.pythonhosted.org/packages/6f/b6/636cc9272a34cc8e06c4c724cb23b0c3f7765d1e5f610e3d857972b5457e/handy-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "a595e01d23dfe5368279e2be0b8f4dc8", "sha256": "9312270a99e361af09f3bb5501a1a039d004f60eec71fed92f5c020d776215a7" }, "downloads": -1, "filename": "handy-0.2.3.tar.gz", "has_sig": false, "md5_digest": "a595e01d23dfe5368279e2be0b8f4dc8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14433, "upload_time": "2013-11-21T13:58:28", "url": "https://files.pythonhosted.org/packages/4b/af/44c8ed56abb592cb68e75d051db02bb263831b10bc375b22564a010dd51e/handy-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "50919004e82865c27e6a12561184e225", "sha256": "45df6c6bd98733579ba40374fb49cbada2fe9966f302531a0b235bbd514b0d3f" }, "downloads": -1, "filename": "handy-0.2.4.tar.gz", "has_sig": false, "md5_digest": "50919004e82865c27e6a12561184e225", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14647, "upload_time": "2014-02-17T09:25:25", "url": "https://files.pythonhosted.org/packages/43/f2/2eacece7a365aad51b3e33c799a32e926b91dff3133521cc5a4e43997f4f/handy-0.2.4.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "e99235e49d70321effc07f3b3f3c5fcb", "sha256": "b3bf562a43d5c17af0b3f2333e5feed69a5e56193a89a045bfda558291231bf3" }, "downloads": -1, "filename": "handy-0.3.tar.gz", "has_sig": false, "md5_digest": "e99235e49d70321effc07f3b3f3c5fcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14319, "upload_time": "2014-08-13T10:08:44", "url": "https://files.pythonhosted.org/packages/77/fd/1f25d908df4db4476566b1d2f93157228df1bc46e8c20df3533fdf1994b0/handy-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "7164c4105ed45ed9e3db09526432f1ad", "sha256": "6f098d1ab768baee222d5d3251575e548a5d76d3e59f932f51938603c0a2d45d" }, "downloads": -1, "filename": "handy-0.4.tar.gz", "has_sig": false, "md5_digest": "7164c4105ed45ed9e3db09526432f1ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14558, "upload_time": "2015-03-12T05:28:08", "url": "https://files.pythonhosted.org/packages/90/63/3550fdcc7fe9ce5c475f206c39e5d9324ee26e11d57b69e4821469f260eb/handy-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "c2dbf1ab745a11ed97e22484ed404531", "sha256": "ae1bf7534773fbd8d96fddbe8859f317e843f4f74f5317d9a33302a3928aaffd" }, "downloads": -1, "filename": "handy-0.5.tar.gz", "has_sig": false, "md5_digest": "c2dbf1ab745a11ed97e22484ed404531", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14588, "upload_time": "2015-05-14T06:53:59", "url": "https://files.pythonhosted.org/packages/23/64/e1cdaefa7b32434a7924699bab864821caa5062b420f7929268f14bbcd58/handy-0.5.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "d03c5de37c811be9538ffeb739c62438", "sha256": "8a73fef56a72f473d1aa8c5eb54e7862b0632e01b5386b69a4a60c65682ec3e7" }, "downloads": -1, "filename": "handy-0.5.1.tar.gz", "has_sig": false, "md5_digest": "d03c5de37c811be9538ffeb739c62438", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14562, "upload_time": "2015-07-07T10:54:37", "url": "https://files.pythonhosted.org/packages/27/cd/1a8880bcde1435a6a875fa13d719ae8a596a46575314553ed7a77ec7d358/handy-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "373e921ee77f7cf518e2d1c4a66906e7", "sha256": "835ce4ddbf73ebf19f5952a3ef10d2ccc838951c745ab5be2360066606e121b7" }, "downloads": -1, "filename": "handy-0.5.2.tar.gz", "has_sig": false, "md5_digest": "373e921ee77f7cf518e2d1c4a66906e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14634, "upload_time": "2015-07-30T04:14:40", "url": "https://files.pythonhosted.org/packages/60/99/d57e1cffd8e8735e60c873f18b06798b5784278e35463fa521e1abcdc1f6/handy-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "b670c009bd85643b258302c5a887f7a6", "sha256": "d801188c427dc8b4167a0d7b60ec19dcc631289bc790b95747b2114b44732ade" }, "downloads": -1, "filename": "handy-0.5.3.tar.gz", "has_sig": false, "md5_digest": "b670c009bd85643b258302c5a887f7a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14655, "upload_time": "2015-10-13T08:23:44", "url": "https://files.pythonhosted.org/packages/e5/02/40bbd0f886aac50f9abec7cffe9d8f7b718329069848603977c6858b1990/handy-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "a092a16da42f259df9ab17bab7b4a65d", "sha256": "9bc6cd1d2c0fd81b6baead383ee611c0eb8f473ba2be51c494318dbc25c8c31d" }, "downloads": -1, "filename": "handy-0.5.4.tar.gz", "has_sig": false, "md5_digest": "a092a16da42f259df9ab17bab7b4a65d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14686, "upload_time": "2016-01-12T16:50:00", "url": "https://files.pythonhosted.org/packages/74/cf/10470fc17583602a8267940bbc84720e9efdfe8a0ec9c3ec1f6cad678e22/handy-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "8c86f7b900907605c53fd1aff06c83e9", "sha256": "9cf5cde1bddbd9abd32a10d26142224c2afb206ffc9855df72ca48eb172d1dae" }, "downloads": -1, "filename": "handy-0.5.5.tar.gz", "has_sig": false, "md5_digest": "8c86f7b900907605c53fd1aff06c83e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14911, "upload_time": "2016-11-12T03:55:36", "url": "https://files.pythonhosted.org/packages/5c/00/2559a5e7634fb2ee0ff88bbf5a146d25a202b3d90a92e7f9c9500542b53b/handy-0.5.5.tar.gz" } ], "0.5.6": [ { "comment_text": "", "digests": { "md5": "53a806cc819ea0bb4464ad11b301c42a", "sha256": "aafee05cdf522e1eefbf1a155a9d92c36749ccac30956c9e81c72467a0673e4b" }, "downloads": -1, "filename": "handy-0.5.6.tar.gz", "has_sig": false, "md5_digest": "53a806cc819ea0bb4464ad11b301c42a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14917, "upload_time": "2017-06-01T03:14:34", "url": "https://files.pythonhosted.org/packages/b9/53/b2a42d7c141a1fdec684752185271943102843eaff697685f291c591cd0f/handy-0.5.6.tar.gz" } ], "0.5.7": [ { "comment_text": "", "digests": { "md5": "0bd0da6d7b03030f2ed12542aca29be1", "sha256": "363257205540bca476960f1d1838cb34f994a29db42335d5e8987769b50b3a9b" }, "downloads": -1, "filename": "handy-0.5.7.tar.gz", "has_sig": false, "md5_digest": "0bd0da6d7b03030f2ed12542aca29be1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16838, "upload_time": "2017-08-05T03:39:05", "url": "https://files.pythonhosted.org/packages/a1/4d/bc6d097c435c92a60e27411433c9f3866510af57cfb7e249d8067489bc62/handy-0.5.7.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "b3196ffdc4bd50934e321c762bffac26", "sha256": "9e6dcf936ec6bdd572366436a2b7ed6cc178f0a41530f9aa6a89d1729ebf3f05" }, "downloads": -1, "filename": "handy-0.6.tar.gz", "has_sig": false, "md5_digest": "b3196ffdc4bd50934e321c762bffac26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16500, "upload_time": "2017-12-02T04:54:19", "url": "https://files.pythonhosted.org/packages/35/01/e8c1720c56449812b359f0cbfbb4e8fe357e500a1aa544d2bf1b3efcfbb3/handy-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "6f1b212ae536cfce014afb16efd2d024", "sha256": "453b65d8c348bc73e97baa44c1bc6793f4419b1aef301eb7e137af4c541bad8c" }, "downloads": -1, "filename": "handy-0.7.tar.gz", "has_sig": false, "md5_digest": "6f1b212ae536cfce014afb16efd2d024", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16946, "upload_time": "2017-12-31T10:41:06", "url": "https://files.pythonhosted.org/packages/22/0a/b7bd552d61559ff94f141bc9979677eb5c9281edaa9467f406922a224d2e/handy-0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6f1b212ae536cfce014afb16efd2d024", "sha256": "453b65d8c348bc73e97baa44c1bc6793f4419b1aef301eb7e137af4c541bad8c" }, "downloads": -1, "filename": "handy-0.7.tar.gz", "has_sig": false, "md5_digest": "6f1b212ae536cfce014afb16efd2d024", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16946, "upload_time": "2017-12-31T10:41:06", "url": "https://files.pythonhosted.org/packages/22/0a/b7bd552d61559ff94f141bc9979677eb5c9281edaa9467f406922a224d2e/handy-0.7.tar.gz" } ] }