{ "info": { "author": "Simon Welker", "author_email": "simon@serioese.gmbh", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "========================\nSerious Django: Services\n========================\n\nhttps://github.com/serioeseGmbH/serious-django-services\n\nserious-django-services defines a Service pattern for Django.\n\nWhat a Service does is abstracting operations (first and foremost: operations on models)\nand their business logic away from endpoints, so you can reuse business logic both for your\nAPI, your Graphene endpoints, and your classic HTML Django Views.\n\nEach Service also defines ``service_exceptions``, a list of exceptions that it specifically\ncan throw. If you don't have any of those for your serivce, make sure to just set ``service_exceptions = []``.\nOtherwise you'll get an error on the definition of the class, to enforce being explicit about which\nexceptions your Service can throw.\n\n--------------------------------------------------------------------------------\n\nIn this package, we just define a ``Service`` base class that you need to inherit to write your own\nservices. Here's a toy example::\n\n class WeAreClosedException(Exception):\n pass\n\n class OrderTakeoutService(Service):\n service_exceptions = (WeAreClosedException,)\n\n\t@classmethod\n\tdef create_order(cls, customer, item_no):\n\t if datetime.datetime.now().hour > 22:\n\t raise WeAreClosedException(\"Sorry, we're closed after 10pm.\")\n if not customer.has_perm(PermissionToOrder):\n raise PermissionDenied(\"Sorry, you can't order right now.\") # when someone was too rude\n order = Order.objects.create(customer=customer, item=item_no)\n\t return order\n\nNow you can keep this business logic local to this service, and use it anywhere you might need to\ncreate an order. For instance, in a Graphene mutation::\n\n class OrderTakeoutMutation(graphene.Mutation):\n class Arguments:\n item_no = graphene.String()\n\n success = graphene.NonNull(graphene.Boolean)\n\terror = graphene.String()\n order_no = graphene.ID()\n\n\tdef mutate(self, info, item_no):\n\t # get_user_from_info() is from `serious-django-graphene`\n\t customer = get_user_from_info(info)\n\t try:\n\t\torder = OrderTakeoutService.create_order(customer, item_no)\n except OrderTakeoutService.exceptions as e:\n\t return OrderTakeoutMutation(success=False, error=str(e))\n\n\t return OrderTakeoutMutation(success=True, order_no=order.pk)\n\nYou can then do something very similar for a REST API or a Django View. And none of your view-level\nlogic needs to ever know about your closing hours or that some customers can be banned from ordering.\n\n\nQuick start\n-----------\n\n1. Install the package with pip::\n\n pip install serious-django-services\n\n2. Add \"serious_django_services\" to your INSTALLED_APPS setting like this::\n\n INSTALLED_APPS = [\n ...\n 'serious_django_services',\n ]\n\n3. Import ``serious_django_services.Service`` and subclass it for each Service you want to define.\n\n4. Define the operations you need on your service, each as a ``@classmethod``.\n\n5. Use your Service's operations in your view-level code.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://serioese.gmbh/", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "serious-django-services", "package_url": "https://pypi.org/project/serious-django-services/", "platform": "", "project_url": "https://pypi.org/project/serious-django-services/", "project_urls": { "Homepage": "https://serioese.gmbh/" }, "release_url": "https://pypi.org/project/serious-django-services/0.5/", "requires_dist": null, "requires_python": "", "summary": "A Django extension that defines a Service pattern, to reuse business logic in different endpoints.", "version": "0.5" }, "last_serial": 5701926, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "4f7a6fc844ba236baba85938cbda87c1", "sha256": "fe9fc0144a575090ed9e4d55492feb6c245ab69004788e34f6785409344a38b8" }, "downloads": -1, "filename": "serious_django_services-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4f7a6fc844ba236baba85938cbda87c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4542, "upload_time": "2018-12-21T13:09:13", "url": "https://files.pythonhosted.org/packages/82/af/586aca368a8b95ed49aa687a679a1fde0ecb1c539d05eca046f3c5b709c8/serious_django_services-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "483accbfd9f53a19023bda017e196d2f", "sha256": "9c716278a3922e79a2737ef89fc8c057b605c9726321152a18f00cc073cf56f9" }, "downloads": -1, "filename": "serious-django-services-0.1.tar.gz", "has_sig": false, "md5_digest": "483accbfd9f53a19023bda017e196d2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4291, "upload_time": "2018-12-21T13:09:15", "url": "https://files.pythonhosted.org/packages/82/35/e53424886dc3a36994e7b48d5f05751b0251cac8e028d08d3ffee2edfeab/serious-django-services-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "d0b9bad1f9b76b64521558f8d0759cfa", "sha256": "edd354dd29760bff100d4abf3a2b916cd8dd4511ce41db99b27c5a2fffb3d530" }, "downloads": -1, "filename": "serious-django-services-0.2.tar.gz", "has_sig": false, "md5_digest": "d0b9bad1f9b76b64521558f8d0759cfa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4358, "upload_time": "2018-12-21T16:38:10", "url": "https://files.pythonhosted.org/packages/4a/c5/d736a05003e1f2c148345bd9f919dfd303ceeccb868f072d7fac0956f2c2/serious-django-services-0.2.tar.gz" } ], "0.2.post1": [ { "comment_text": "", "digests": { "md5": "0445be3b2982fa971953d412cf8f1fda", "sha256": "4817a288ab74227f541efdf2bc486c38062bfa4f5d8e47b89c80b1a1e545e4bb" }, "downloads": -1, "filename": "serious-django-services-0.2.post1.tar.gz", "has_sig": false, "md5_digest": "0445be3b2982fa971953d412cf8f1fda", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4385, "upload_time": "2018-12-21T16:44:46", "url": "https://files.pythonhosted.org/packages/dc/37/2fc46c5e8a136d156fe055a4b5ace674d33bb440a1cdfece35981da2f5c2/serious-django-services-0.2.post1.tar.gz" } ], "0.2.post2": [ { "comment_text": "", "digests": { "md5": "27359f2cd560b84b8a55e9fd4ee8bf9e", "sha256": "c5e05a076db2bef23260a7ef3ebe95eb15094c045150d4a7f573de533e7b72dd" }, "downloads": -1, "filename": "serious-django-services-0.2.post2.tar.gz", "has_sig": false, "md5_digest": "27359f2cd560b84b8a55e9fd4ee8bf9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4414, "upload_time": "2018-12-21T17:14:10", "url": "https://files.pythonhosted.org/packages/1e/ac/03e885333902b657475b86fc6cc7f3ad713d9e67078f46a7315f7de3e47d/serious-django-services-0.2.post2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "6733c1ea8578f1fc3b81bf82fad32907", "sha256": "a5c8336366d1712b679cdc8c9e8185cb8b2e4e4471fd4d848869045940cd9fd1" }, "downloads": -1, "filename": "serious-django-services-0.3.tar.gz", "has_sig": false, "md5_digest": "6733c1ea8578f1fc3b81bf82fad32907", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4510, "upload_time": "2019-02-08T09:44:27", "url": "https://files.pythonhosted.org/packages/f0/ec/2a3d127fc2434ef02189e620a83ae022296324e08da639929a2a88cdca62/serious-django-services-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "be54f1b8b3115575dfca6ec438481974", "sha256": "662aa27feee05ab93ada5c91853817c8c9d005294f816ad3698b32b3abe906d4" }, "downloads": -1, "filename": "serious-django-services-0.4.tar.gz", "has_sig": false, "md5_digest": "be54f1b8b3115575dfca6ec438481974", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6199, "upload_time": "2019-07-12T12:29:24", "url": "https://files.pythonhosted.org/packages/d7/ab/a6f37c6203b403b64925d45ccb535865d5ccb22e8cb8a20100a340c76478/serious-django-services-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "863428303bd33a07fdca80a147639d16", "sha256": "8f5f6b1dc16d5a3a816c494350e10c9a180d871643692eb8ce92c51c66fd4df9" }, "downloads": -1, "filename": "serious-django-services-0.5.tar.gz", "has_sig": false, "md5_digest": "863428303bd33a07fdca80a147639d16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6240, "upload_time": "2019-08-20T07:39:32", "url": "https://files.pythonhosted.org/packages/d9/25/d2c88061849b79506898cf4eff2b75f7cfa367f150789a644819255732bb/serious-django-services-0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "863428303bd33a07fdca80a147639d16", "sha256": "8f5f6b1dc16d5a3a816c494350e10c9a180d871643692eb8ce92c51c66fd4df9" }, "downloads": -1, "filename": "serious-django-services-0.5.tar.gz", "has_sig": false, "md5_digest": "863428303bd33a07fdca80a147639d16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6240, "upload_time": "2019-08-20T07:39:32", "url": "https://files.pythonhosted.org/packages/d9/25/d2c88061849b79506898cf4eff2b75f7cfa367f150789a644819255732bb/serious-django-services-0.5.tar.gz" } ] }