{ "info": { "author": "Zachary Voase", "author_email": "z@zacharyvoase.com", "bugtrack_url": null, "classifiers": [], "description": "# Dagny\n\nDagny is a [Django][] adaptation of [Ruby on Rails][]\u2019s Resource-Oriented\nArchitecture (a.k.a. \u2018RESTful Rails\u2019). \nDagny makes it *really easy* to build **resourceful** web applications.\n\n [django]: http://djangoproject.com/\n [ruby on rails]: http://rubyonrails.org/\n\nYou can read the full documentation [here](http://zacharyvoase.github.com/dagny/).\n\nAt present, this project is in an experimental phase, so APIs are very liable to\nchange. **You have been warned.**\n\nP.S.: the name is [a reference][dagny taggart].\n\n [dagny taggart]: http://en.wikipedia.org/wiki/List_of_characters_in_Atlas_Shrugged#Dagny_Taggart\n\n\n## Motivation\n\nRails makes building RESTful web applications incredibly easy, because\nresource-orientation is baked into the framework\u2014it\u2019s actually harder to make\nyour app *un*RESTful.\n\nI wanted to build a similar system for Django; one that made it incredibly\nsimple to model my resources and serve them up with the minimum possible code.\n\nOne of the most important requirements was powerful yet simple content\nnegotiation: separating application logic from the rendering of responses makes\nwriting an API an effortless task.\n\nFinally, as strong as Rails\u2019s inspiration was, it still needed to be consistent\nwith the practices and idioms of the Django and Python ecosystems. Dagny doesn\u2019t\nuse any metaclasses (yet), and the code is well-documented and readable by most\nPythonista\u2019s standards.\n\n\n## Appetizer\n\nDefine a resource:\n\n from dagny import Resource, action\n from django.shortcuts import get_object_or_404, redirect\n from polls import forms, models\n \n class Poll(Resource):\n \n @action\n def index(self):\n self.polls = models.Poll.objects.all()\n \n @action\n def new(self):\n self.form = forms.PollForm()\n \n @action\n def create(self):\n self.form = forms.PollForm(self.request.POST)\n if self.form.is_valid():\n self.poll = self.form.save()\n return redirect(\"Poll#show\", self.poll.id)\n \n return self.new.render()\n \n @action\n def edit(self, poll_id):\n self.poll = get_object_or_404(models.Poll, id=int(poll_id))\n self.form = forms.PollForm(instance=self.poll)\n \n @action\n def update(self, poll_id):\n self.poll = get_object_or_404(models.Poll, id=int(poll_id))\n self.form = forms.PollForm(self.request.POST, instance=self.poll)\n if self.form.is_valid():\n self.form.save()\n return redirect(\"Poll#show\", self.poll.id)\n \n return self.edit.render()\n \n @action\n def destroy(self, poll_id):\n self.poll = get_object_or_404(models.Poll, id=int(poll_id))\n self.poll.delete()\n return redirect(\"Poll#index\")\n\nCreate the templates:\n\n \n
    \n {% for poll in self.polls %}\n
  1. {{ poll.name }}
  2. \n {% endfor %}\n
\n

Create a poll

\n \n \n
\n {% csrf_token %}\n {{ self.form.as_p }}\n \n
\n \n \n

Name: {{ self.poll.name }}

\n

Edit this poll

\n \n \n
\n {% csrf_token %}\n {{ self.form.as_p }}\n \n
\n\nSet up the URLs:\n\n from django.conf.urls.defaults import *\n from dagny.urls import resources\n \n urlpatterns = patterns('',\n (r'^polls/', resources('polls.resources.Poll', name='Poll')),\n )\n\nDone.\n\n\n## Example Project\n\nThere\u2019s a more comprehensive [example project][] which showcases a user\nmanagement app, built in very few lines of code on top of the standard\n`django.contrib.auth` app.\n\n [example project]: http://github.com/zacharyvoase/dagny/tree/master/example/\n\nTo get it running:\n\n git clone 'git://github.com/zacharyvoase/dagny.git'\n cd dagny/\n pip install -r REQUIREMENTS # Installs runtime requirements\n pip install -r REQUIREMENTS.test # Installs testing requirements\n cd example/\n ./manage.py syncdb # Creates db/development.sqlite3\n ./manage.py test users # Runs all the tests\n ./manage.py runserver\n\nThen just visit to see it in action!\n\n\n## License\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\n\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\nCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to \n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/zacharyvoase/dagny", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "dagny", "package_url": "https://pypi.org/project/dagny/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/dagny/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/zacharyvoase/dagny" }, "release_url": "https://pypi.org/project/dagny/0.3.0/", "requires_dist": null, "requires_python": null, "summary": "Rails-style Resource-Oriented Architecture for Django.", "version": "0.3.0" }, "last_serial": 788757, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "160f601ca41c0714253f57b9d083dcc5", "sha256": "b8aa5d1cee19b2429d81e668042f030b45398e89ae1ca40a5934afc0d066e67f" }, "downloads": -1, "filename": "dagny-0.0.1.tar.gz", "has_sig": false, "md5_digest": "160f601ca41c0714253f57b9d083dcc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19563, "upload_time": "2010-06-17T01:50:33", "url": "https://files.pythonhosted.org/packages/7b/38/9e261fb8b32b31076530b8f9330ec4e24ab2be8689ea7de0f748a2d7f8fe/dagny-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "c8d8b39ba190898e3bfafd693465f881", "sha256": "7de3da6caf56dffb947b7fdc0d06a0ab48a77e7791c6904728ab92ad77032b1a" }, "downloads": -1, "filename": "dagny-0.0.2.tar.gz", "has_sig": false, "md5_digest": "c8d8b39ba190898e3bfafd693465f881", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16703, "upload_time": "2010-06-24T10:45:22", "url": "https://files.pythonhosted.org/packages/81/08/30398a292b47fb0f5181fa73e36742a4423f8f80e90f3a53dde3f6f931e5/dagny-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "7d5d4d973f6f05d1c2703cd827168ffb", "sha256": "254151a1dfd90d56646e89a8ce49105024b618bb90cfb501631402eb11993ab3" }, "downloads": -1, "filename": "dagny-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7d5d4d973f6f05d1c2703cd827168ffb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17079, "upload_time": "2010-07-07T11:52:55", "url": "https://files.pythonhosted.org/packages/4a/56/796f4aa11e1b684a7d8a1614d87ac112409268a58c31128e075d6dd6d049/dagny-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "daabef9889486038287badce0eadbf6b", "sha256": "64dcbcd4ea721000391bfce0d102bafc769521371a2ca1ab1cb04819f65f90d0" }, "downloads": -1, "filename": "dagny-0.0.4.tar.gz", "has_sig": false, "md5_digest": "daabef9889486038287badce0eadbf6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17219, "upload_time": "2010-07-08T12:54:25", "url": "https://files.pythonhosted.org/packages/ab/05/a3814eb57e1fedd0bb40bae0cfb87c54587c248b34229a14d385ff7a41c2/dagny-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "ce31b05e4c495c1c7360883edf5c4e28", "sha256": "cb8bada7c907051d59d38250e06aa6fbd9b90b15b04df42bc730f66a3a6adfe2" }, "downloads": -1, "filename": "dagny-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ce31b05e4c495c1c7360883edf5c4e28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17214, "upload_time": "2010-07-21T14:48:31", "url": "https://files.pythonhosted.org/packages/4c/60/aaca1654b2e040435d6526f17a2520e0fc5af3185795b37d1be2820b3acb/dagny-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "54aa259b98b49e1a5fe33cce7824e2bb", "sha256": "e289884da3e51dad41ccf031fb170f7d7dc132aff5d95e82756346fa79123170" }, "downloads": -1, "filename": "dagny-0.0.6.tar.gz", "has_sig": false, "md5_digest": "54aa259b98b49e1a5fe33cce7824e2bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17937, "upload_time": "2011-02-09T11:02:32", "url": "https://files.pythonhosted.org/packages/ef/77/c0befb2a60d65c5f6eaef4ab6e5cd1d8257ee0fa88e0428bfbe9276e2326/dagny-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "c8d056e01b54595a61b9655529560af6", "sha256": "1793b5aff77245bbb571e9c31364d74a868d270ad443647c5ca015f6ab33e0b3" }, "downloads": -1, "filename": "dagny-0.0.7.tar.gz", "has_sig": false, "md5_digest": "c8d056e01b54595a61b9655529560af6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17988, "upload_time": "2011-02-15T13:43:22", "url": "https://files.pythonhosted.org/packages/52/dc/274bb28ce17add2242681da09eaffcf46112d45a6e5a4e8dae98f3247dbd/dagny-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "88703984025d656a095ef10479e755e2", "sha256": "070cb477cfe299c4fd30a9f73002bf481b9731877772fd60a808213b81154e9a" }, "downloads": -1, "filename": "dagny-0.0.8.tar.gz", "has_sig": false, "md5_digest": "88703984025d656a095ef10479e755e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17067, "upload_time": "2011-04-15T23:30:10", "url": "https://files.pythonhosted.org/packages/4e/c8/f782c66208023451f363d8e8f11c452503859ffa5677d007402e7cdcdd77/dagny-0.0.8.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "8e637f09bddc693f8ed1f71ebeea7a84", "sha256": "04ab448dba4069b2aaf6fd5ecf3ec639063edef91e86e1d705497e6c16110c8f" }, "downloads": -1, "filename": "dagny-0.1.0.tar.gz", "has_sig": false, "md5_digest": "8e637f09bddc693f8ed1f71ebeea7a84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17913, "upload_time": "2011-05-15T07:37:19", "url": "https://files.pythonhosted.org/packages/6d/f4/ec7b0794e3782697765944c71ef8c3aa54fa8d7adaca5020cdeb52be970b/dagny-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "949567a608f723e461c3088a5ba8dad9", "sha256": "3a47609d811663dfe233333d16a687bdbca1e3d8e2eb99aa15700250dad451f3" }, "downloads": -1, "filename": "dagny-0.1.1.tar.gz", "has_sig": false, "md5_digest": "949567a608f723e461c3088a5ba8dad9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17908, "upload_time": "2011-05-15T09:52:10", "url": "https://files.pythonhosted.org/packages/1e/5d/ca27b7c3f65caaf8f2a200e2a9cd26c1af126a9291989dc1adc391fa748a/dagny-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "e653df012391827262a4307bb39d05cb", "sha256": "b9ff4fdaef95cefb7c4dc78d5c3df7729b5c70ffcd9fb9cc453d84b569bc1b7a" }, "downloads": -1, "filename": "dagny-0.1.2.tar.gz", "has_sig": false, "md5_digest": "e653df012391827262a4307bb39d05cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18066, "upload_time": "2011-05-15T15:48:21", "url": "https://files.pythonhosted.org/packages/3b/bd/966798e3224a803c9ca86c8db402ea8aa81749aa9656ec0f55be3df035b9/dagny-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "4f048841e2051d45357ef8f9f857406e", "sha256": "193b01434b710d05d47791151f66d2c5b6768067a196e131c6f7329ef52d4619" }, "downloads": -1, "filename": "dagny-0.2.0.tar.gz", "has_sig": false, "md5_digest": "4f048841e2051d45357ef8f9f857406e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18355, "upload_time": "2011-06-04T23:28:51", "url": "https://files.pythonhosted.org/packages/b5/7f/647af2b5b7fea053fce8ea422f955eec09a46893b44d26c3e3c83f3d8bda/dagny-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "0b8840c72af4101c9f88b21b53f7713c", "sha256": "2360e3fc93641a032b41d4ff5a255d8897272cdd27cdef53f50cbea6d18913b5" }, "downloads": -1, "filename": "dagny-0.2.1.tar.gz", "has_sig": false, "md5_digest": "0b8840c72af4101c9f88b21b53f7713c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18356, "upload_time": "2011-06-05T07:14:51", "url": "https://files.pythonhosted.org/packages/69/e6/df05f7e8771123b7f7575bb731832045dccf236177bd7d50f4c57fb84822/dagny-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "59a7b8f36f2adde26bd2fd013fed2b3d", "sha256": "c37f2dc89040ffd5c6c835dc72adc9d9ce9fea69d1dceee1d0f45d42f33f06b2" }, "downloads": -1, "filename": "dagny-0.2.2.tar.gz", "has_sig": false, "md5_digest": "59a7b8f36f2adde26bd2fd013fed2b3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18389, "upload_time": "2011-06-05T07:30:18", "url": "https://files.pythonhosted.org/packages/73/2e/c9ec88c2379e8ce03d3d8cbd7cd20935e17326529be170604e40b6d35742/dagny-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "a687544ab07d951046e866de57b1ddac", "sha256": "c34d6cb4aa3fd03858b4d920c839d7030c860fcb3ca6e205e5e73d74b7156b18" }, "downloads": -1, "filename": "dagny-0.2.3.tar.gz", "has_sig": false, "md5_digest": "a687544ab07d951046e866de57b1ddac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19062, "upload_time": "2011-09-26T00:24:17", "url": "https://files.pythonhosted.org/packages/ba/e2/5635f62f4a544b2fd47d52c41c898b4ca421d58eeb8a7086ae59c0c3815f/dagny-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "42adb4d596e253a765a8213c68e07cb8", "sha256": "f4657cb2a4a98dfe59c81066de6972d0ba4a4128abf14cddad0da670e71e6f23" }, "downloads": -1, "filename": "dagny-0.2.4.tar.gz", "has_sig": false, "md5_digest": "42adb4d596e253a765a8213c68e07cb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18215, "upload_time": "2011-11-10T13:18:30", "url": "https://files.pythonhosted.org/packages/84/1d/cbdab7dc7c343e18b31faf3a1ff371aa2f2b148f965fbfa2d1f9a211d71b/dagny-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "919a9d40174951dd711bd397dbddefcb", "sha256": "83f820f78163d8b5ea11ebd40c230f397dd8f0f1993e176a56358f080e601964" }, "downloads": -1, "filename": "dagny-0.3.0.tar.gz", "has_sig": false, "md5_digest": "919a9d40174951dd711bd397dbddefcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19034, "upload_time": "2012-09-14T11:19:38", "url": "https://files.pythonhosted.org/packages/07/c4/f4ea09135d77d4865fa807d80e7bee1191ee3f3d7d943060e386458595af/dagny-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "919a9d40174951dd711bd397dbddefcb", "sha256": "83f820f78163d8b5ea11ebd40c230f397dd8f0f1993e176a56358f080e601964" }, "downloads": -1, "filename": "dagny-0.3.0.tar.gz", "has_sig": false, "md5_digest": "919a9d40174951dd711bd397dbddefcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19034, "upload_time": "2012-09-14T11:19:38", "url": "https://files.pythonhosted.org/packages/07/c4/f4ea09135d77d4865fa807d80e7bee1191ee3f3d7d943060e386458595af/dagny-0.3.0.tar.gz" } ] }