{ "info": { "author": "Alexey Kinyov", "author_email": "rudy@05bit.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7" ], "description": "Rango\r\n=====\r\n\r\nRango is a bit of spice for Django.\r\n\r\nWhy?\r\n----\r\n\r\nI beleive that short and plain imports are better than long\r\nnested ones.\r\n\r\nIn Django you should write in your ``views.py``:\r\n\r\n from django.core.urlresolvers import reverse\r\n from django.shortcuts import get_object_or_404, redirect\r\n from django.contrib.auth.decorators import login_required\r\n\r\nIn Rango:\r\n\r\n from rango.urls import reverse\r\n from rango.views import get_object_or_404, login_required\r\n\r\nActually that is experimental project tending to build cleaner\r\nAPI for Django.\r\n\r\nCore features\r\n-------------\r\n\r\n### New ``reverse`` method\r\n\r\nIt works like that:\r\n\r\n from rango.urls import reverse\r\n reverse('url_name', pk=8)\r\n\r\nDjango ``reverse`` works so:\r\n\r\n from django.core.urlresolvers import reverse\r\n reverse('url_name', kwargs={'pk': 8})\r\n\r\n### Base model class\r\n\r\nIt has shorcuts for ``all``, ``get``, ``filter`` and ``exclude``\r\nmethods and some extra magic:\r\n\r\n from rango import models\r\n\r\n class MyModel(models.RangoModel):\r\n class MyModel(RangoModel):\r\n title = models.CharField(max_length=100)\r\n is_active = models.BooleanField()\r\n\r\n @classmethod\r\n def active(cls, _queryset=None):\r\n return cls.filter(_queryset, is_active=True)\r\n\r\n all_objects = MyModel.all()\r\n start_with_a = MyModel.filter(title__startswith=\"a\")\r\n active_objects = start_with_a.active()\r\n\r\n**Note!** Now you can define filter methods in model class\r\nand chain them in queries. Magic!\r\n\r\n### Shortcuts ``rango.views``\r\n\r\n from rango.views import render_to, ajax_request, render_to_response, \\\r\n render, redirect, get_object_or_404, login_required\r\n\r\n### Mailing shortcut\r\n\r\nIf you need to compose E-mail message body from template and\r\nsend it you may use a shortcut:\r\n\r\n from rango.mail import send_template\r\n\r\n send_template(subject='Subject', template='mail.html',\r\n recipient_list=[to@example.com],\r\n context={})\r\n\r\nFull method signature:\r\n\r\n def send_template(subject=None, template=None, recipient_list=[],\r\n context={}, from_email=None, **kwargs)\r\n\r\n### Other shortcuts and stuff\r\n\r\n from rango.crypto import random_token\r\n random_token(20) # creates rangom string\r\n\r\n # Yes! that's replacement for\r\n # from django.conf import settings\r\n from rango import settings\r\n settings.has_setting('CUSTOM_SETTINGS')\r\n settings.get_setting('CUSTOM_SETTINGS', default='Some value')\r\n\r\n from rango.utils import safe_upload_to\r\n from rango import models\r\n class MyFile(models.Model):\r\n file = models.FileField(upload_to=safe_upload_to('files'))\r\n # files will be uploaded to\r\n # files//_\r\n\r\n\r\nDocumentation\r\n-------------\r\n\r\nIt's not ready yet, I'm working on it.\r\n\r\nIf you're brave, watch in the source :)", "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/05bit/python-rango", "keywords": "django,utils,sugar", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rango", "package_url": "https://pypi.org/project/rango/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/rango/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/05bit/python-rango" }, "release_url": "https://pypi.org/project/rango/0.0.2a/", "requires_dist": null, "requires_python": null, "summary": "Rango is a spicey API to Django with some extras.", "version": "0.0.2a" }, "last_serial": 1046195, "releases": { "0.0.2a": [ { "comment_text": "", "digests": { "md5": "7a753e4a84fbfc9dda3f267fa1c9a5c3", "sha256": "31263868e7c28ae68dfae9ac13bf3c4c013f01790a63b6ed09ba22d0fa67ea08" }, "downloads": -1, "filename": "rango-0.0.2a.tar.gz", "has_sig": false, "md5_digest": "7a753e4a84fbfc9dda3f267fa1c9a5c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8802, "upload_time": "2013-01-21T10:34:31", "url": "https://files.pythonhosted.org/packages/ce/04/c88e97784c199d22df3362ff6e2722f35b74830926c7c278c5f448aadcb5/rango-0.0.2a.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7a753e4a84fbfc9dda3f267fa1c9a5c3", "sha256": "31263868e7c28ae68dfae9ac13bf3c4c013f01790a63b6ed09ba22d0fa67ea08" }, "downloads": -1, "filename": "rango-0.0.2a.tar.gz", "has_sig": false, "md5_digest": "7a753e4a84fbfc9dda3f267fa1c9a5c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8802, "upload_time": "2013-01-21T10:34:31", "url": "https://files.pythonhosted.org/packages/ce/04/c88e97784c199d22df3362ff6e2722f35b74830926c7c278c5f448aadcb5/rango-0.0.2a.tar.gz" } ] }