{ "info": { "author": "Terry Yanchynskyy", "author_email": "tarasics@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Framework :: Django", "Framework :: Django :: 1.7", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "django-loadjson\n===============\n\n|Codeship Status for onebit0fme/django-loadjson|\n\nDjango management command to load json data of any shape by defining\n\"manifest\" that describes mapping instructions.\n\nRequirements\n------------\n\nPython 2.7, 3.4, 3.5 Django >= 1.7\n\nInstallation\n------------\n\n``pip install django-loadjson``\n\nQuick setup\n-----------\n\nInclude loadjson in settings.py\n\n::\n\n INSTALLED_APPS = [\n ... ,\n 'loadjson',\n ...\n ]\n\nDefine loadjson data directories - a place loadjson will look for data\n(.json) files.\n\n::\n\n LOAD_JSON = {\n 'DATA_DIRS': [os.path.join(BASE_DIR, 'dumpdata')],\n }\n\nDump all your .json files inside the specified directory(ies).\n\nEach ``*.json`` file must also have corresponding ``*.manifest.json``\nthat describes how the data should be handled. For \"manifest\" reference,\nsee ``Manifest`` section.\n\nOnce the data and manifest is in place, run\n\n``python manage.py loadjson ``, where \ncorresponds to the filename of the data (with or without the .json\npart).\n\nNote, loadjson will look in all specified directories for the requested\n and will use the first file it will find. Same goes for the\nmanifest file. Data file and manifest do not have to live in the same\ndirectory, but both must be in a path of defined \"DATA\\_DIRS\".\n\nIt is also possible to handle data and manifest in other ways by\nproviding custom \"finder\\_classes\". See ``Advanced Usage`` for\ninstructions.\n\nManifest\n--------\n\n- model (required) - a string in format \".\"\n- mapping (required) - an object representing the model - data mapping.\n- parsers (optional) - an object the describes how to parse the data.\n Supported types:\n\n - ``string`` - convert to string\n - ``integer`` - convert to integer\n - ``boolean`` - convert to boolean. Optional, define\n ``\"invert\": true`` to invert.\n - ``datetime`` - parse datetime string\n - ``relative_key`` - lookup the relative key by the field value in\n another dataset. Required:\n\n - ``data_name`` - is a data name where related object should be\n looked up.\n - ``rk_lookup`` - the field for the lookup in the related dataset\n using one key. Ex., \"email\".\n - ``lookup`` - overwrite the related data lookup field(s). By\n default will use the lookup fields that are defined in data\n manifest.\n - ``many`` (optional) - for many-to-many relationship.\n\n - ``relative_object`` - get/create/update a related object.\n ``data_name`` or ``manifest`` required\n\n - ``data_name`` - for regular manifest lookup\n - ``manifest`` - define manifest right on the spot\n - ``many`` - one related object or many-to-many relationship.\n\n- lookup (required for updates are relative lookups) - a string or a\n list of fields to use when looking up an object. Ex., ``id``,\n ``email``, ``[\"username\", \"email\"]``. Note, lookup fields are used to\n lookup an object. The result of a lookup must be one object, so\n choose accordingly.\n- nullable (optional) - a list of fields that are nullable.\n- m2m\\_fields (optional) - a list of many-to-many fields. Note, if data\n contains many-to-many field, this field should include it, or\n alternatively use custom adaptors to handle it, otherwise Django will\n throw an error when saving.\n\nExample:\n~~~~~~~~\n\nusers.json\n\n::\n\n [\n {\n \"username\": \"PinkRabbit\",\n \"email\": \"pink.rabbit@example.com\"\n \"member_since\": \"\",\n \"active\": true,\n \"not_superuser\": true,\n \"preferences\": {\n \"email_notifications: true,\n \"number_of_friends\": \"2\"\n },\n \"friends\": [\"blue.hippo@example.com\", \"funny.tiger@example.com\"],\n \"badges\": [\n {\n \"name\": \"For being pink\",\n \"date_awarded\": \"\"\n },\n {\n \"name\": \"For being there for friends\",\n \"date_awarded\": \"\"\n }\n ]\n },\n ...\n ]\n\nusers.manifest.json\n\n::\n\n {\n \"model\": \"account.User\",\n \"lookup\": \"pk\",\n \"mapping\": {\n \"username\": \"username\",\n \"email\": \"email\",\n \"date_joined\": \"member_since\",\n \"active\": \"active\",\n \"is_superuser\": \"not_superuser\",\n \"email_notifications\": \"preferences.email_notifications\",\n \"friends_number\": \"preferences.number_of_friends\",\n \"friends\": \"friends\",\n \"badges\": \"badges\"\n },\n \"parsers\": {\n \"is_superuser: {\n \"type\": \"boolean\",\n \"invert\": true\n },\n \"date_joined\": {\n \"type\": \"datetime\"\n },\n \"friends\": {\n \"type\": \"relative_key\",\n \"data_name\": \"users\",\n \"rk_lookup\": \"email\",\n \"lookup\": \"username\",\n \"many\": true\n },\n \"badges\": {\n \"type\": \"relative_object\",\n \"many\": true,\n \"manifest\" {\n \"model\": \"account.Badge\"\n \"mapping\": {\n \"name\": \"name\",\n \"awarded\": \"date_awarded\"\n },\n \"parsers\": {\n \"awarded\": {\n \"type\": \"datetime\"\n }\n },\n \"lookup\": \"name\"\n }\n }\n }\n }\n\nLOAD\\_JSON settings\n-------------------\n\nAll loadjson-related settings should go into ``LOAD_JSON`` var inside\nproject's settings.py.\n\nPossible LOAD\\_JSON settings:\n\n- ``DATA_DIRS`` (required) - a list of absolute paths to use by the\n default finder to find data and manifest.\n- ``ADAPTOR_CLASSES`` (optional) - a list of classes that are used to\n customize the import. Extend ``loadjson.adaptors.BaseAdaptor`` to\n define your custom adaptors. Defaults to None.\n- ``MODEL_HANDLER`` (optional) - a string that references a class that\n handles model lookups. Defaults to ``loadjson.adaptors.ModelHandler``\n- ``FINDER_CLASSES`` (optional) - a list of classes that are used to\n find data. By default loadjson uses\n ``loadjson.finders.DefaultDataFinder`` that uses defined\n ``DATA_DIRS`` to find data and manifest.\n- ``MANIFEST_DEFAULTS`` (optional) - a dictionary of default manifest\n values to use.\n\nDefining ADAPTOR\\_CLASSES\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``ADAPTOR_CLASSES`` are used to further massage the data before saving.\nTo define Adaptor Class, extend ``loadjson.adaptors.BaseAdaptor`` and\noverwrite ``adapt`` and/or ``adapt_post_save`` methods like so:\n\n::\n\n from loadjson.adaptors import BaseAdaptor\n\n\n class MyCusomAdaptor(BaseAdaptor):\n \"\"\"\n Available attributes:\n - model - model class\n - app_model - a string in format .\n - manifest - a dictionary with defined manifest values\n \"\"\"\n\n def adapt(self, data):\n \"\"\"\n Method provides a base hook to provide additional data, set defaults,\n or modify the data before saving.\n\n Usage: what returned gets saved\n \"\"\"\n return data\n\n def adapt_post_save(self, obj, data, m2m_data):\n \"\"\"\n In some cases (like saving many-to-many relations) data might require\n some additional tweaks. That is done here.\n Note: Many-to-Many objects are attached by default, however in case if many-to-many relationship\n is done through a custom model, this method provides a hook to process such customization.\n \"\"\"\n pass\n\nDon't forget to include your custom adaptors in\nLOAD\\_JSON.ADAPTOR\\_CLASSES.\n\nAdvanced usage\n--------------\n\nMODEL\\_HANDLER\n~~~~~~~~~~~~~~\n\nDefine custom ModelHandle if you want to use custom model manager, or\nyour same method has any customization. ``get``, ``create``,\n``get_or_create``, ``update_or_create`` methods are available for\noverwrite.\n\nFINDER\\_CLASSES\n~~~~~~~~~~~~~~~\n\nIt is also possible to overwrite or extend the default finder classes.\nThe purpose of the finder class is to lookup the data by data\\_name.\n``DefaultDataFinder`` is a default finder, but can be extended by\ndefining ``FINDER_CLASSES`` in LOAD\\_JSON settings. Note, if you define\nthis setting and not include ``DefaultDataFinder``, then it will not be\nused, unless you add it explicitly as well.\n\nIt is possible to define as many finders as you will, but be aware that\nonly the first occurrence found will be used.\n\n.. |Codeship Status for onebit0fme/django-loadjson| image:: https://codeship.com/projects/6e3309b0-d07e-0133-fd7c-1e2b23aa142a/status?branch=master\n :target: https://codeship.com/projects/141380", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/onebit0fme/django-loadjson", "keywords": "django management json", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-loadjson", "package_url": "https://pypi.org/project/django-loadjson/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-loadjson/", "project_urls": { "Homepage": "https://github.com/onebit0fme/django-loadjson" }, "release_url": "https://pypi.org/project/django-loadjson/0.1.2/", "requires_dist": null, "requires_python": "", "summary": "Loadjson management command for Django", "version": "0.1.2" }, "last_serial": 2054492, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "1c55ccee3402872978c3ea3b4883e05a", "sha256": "63d80578f9e9d57ccb77e7790d29cc8aac4687c80ad3265ffad7e84d15df1927" }, "downloads": -1, "filename": "django_loadjson-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1c55ccee3402872978c3ea3b4883e05a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19049, "upload_time": "2016-03-20T17:18:18", "url": "https://files.pythonhosted.org/packages/3f/c8/a9eb99fc9bbf4cf36cb2e35b88b8edeb0350d313f97750944e265f04b32f/django_loadjson-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3ceefb67b83165985abb812af81c6c0", "sha256": "8481fcb50fe89d6e6f3e31acebabe8cd1999cf5a13b8eb7f448d097ce7665468" }, "downloads": -1, "filename": "django-loadjson-0.1.0.tar.gz", "has_sig": false, "md5_digest": "a3ceefb67b83165985abb812af81c6c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12789, "upload_time": "2016-03-20T17:18:22", "url": "https://files.pythonhosted.org/packages/10/ff/0d4248a03454d957737512c02a4ade268005ae74671f79e0bf295c8f3dd3/django-loadjson-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ba0f815df07a26533018f4496fe11052", "sha256": "af6c6b56089f3cef55e6926924b89d43fc0d8a6e25aff40d24508bf95343ed98" }, "downloads": -1, "filename": "django-loadjson-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ba0f815df07a26533018f4496fe11052", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13768, "upload_time": "2016-03-22T19:50:41", "url": "https://files.pythonhosted.org/packages/67/41/2a8d385d64591110d05157194c69930f642cb33dcc74c16e048aeaafa5a0/django-loadjson-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "adab719407eeb9c38b08074584cf4aa5", "sha256": "955f73ba2b5673762de560bda17f4b272af8dd11348a0b32df441ecc8179b283" }, "downloads": -1, "filename": "django-loadjson-0.1.2.tar.gz", "has_sig": false, "md5_digest": "adab719407eeb9c38b08074584cf4aa5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13801, "upload_time": "2016-04-08T23:48:17", "url": "https://files.pythonhosted.org/packages/ae/68/5e5dfbca18311712e98c4c9281a8b7a9231627c523b1f974a5769e823903/django-loadjson-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "adab719407eeb9c38b08074584cf4aa5", "sha256": "955f73ba2b5673762de560bda17f4b272af8dd11348a0b32df441ecc8179b283" }, "downloads": -1, "filename": "django-loadjson-0.1.2.tar.gz", "has_sig": false, "md5_digest": "adab719407eeb9c38b08074584cf4aa5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13801, "upload_time": "2016-04-08T23:48:17", "url": "https://files.pythonhosted.org/packages/ae/68/5e5dfbca18311712e98c4c9281a8b7a9231627c523b1f974a5769e823903/django-loadjson-0.1.2.tar.gz" } ] }