{ "info": { "author": "Jakob Gerhard Martinussen", "author_email": "jakobgm@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware" ], "description": "=================\nDjango-dataporten\n=================\n\nDjango-dataporten is a simple Django app which fetches data from dataporten and\nattaches it to your Django user objects. It implements the dataporten groups\nAPI, allowing you to easily access group memberships through a pythonic API, without\nworrying about parsing raw JSON content.\n\nSetup\n=====\n\n1. Add \"dataporten\" to your :code:`INSTALLED_APPS` setting like this\n\n.. code:: python\n\n INSTALLED_APPS = [\n ...\n 'dataporten',\n ...\n ]\n\n\n2. Run `python manage.py migrate` to create the dataporten proxy models.\n\n3. In your `settings.py` file, add the variable :code:`DATAPORTEN_TOKEN_FUNCTION`,\nwhich should be a dotted path to the function that will retrieve user tokens.\nDataporten uses this \"importable string\" in order to retrieve the OAuth2\nauthentication token for a given user. For instance,\n\n.. code:: python\n\n DATAPORTEN_TOKEN_FUNCTION = 'myapp.oauth.allauth_token'\n\nThe function should accept a :code:`User` and return a :code:`str`, if the\ntoken exists, else :code:`None`.\nHere is a python3.6/3.7 example that will work if you use `django-allauth`_:\n\n.. code:: python\n\n def allauth_token(user: User) -> Optional[str]:\n try:\n return SocialToken.objects.get(\n account__user=user,\n account__provider='dataporten',\n ).token\n except SocialToken.DoesNotExist:\n return None\n\n4. Add the dataporten middleware. This middleware adds a :code:`dataporten`\nattribute to :code:`request.user` for users with an associated\ndataporten token. Take care to place it after\n:code:`django.contrib.auth.middleware.AuthenticationMiddleware`.\n\n.. code:: python\n\n MIDDLEWARE = (\n ...\n 'django.contrib.auth.middleware.AuthenticationMiddleware',\n ...\n 'dataporten.middleware.DataportenGroupsMiddleware',\n ...\n )\n\n5. Optionally, enable caching for API queries. Take care to create the directory\nset in :code:`DATAPORTEN_CACHE_PATH` before starting the Django server.\n\n.. code:: python\n\n # Cache requests to the dataporten API\n DATAPORTEN_CACHE_REQUESTS = True\n\n # Where to save the sqlite3 cache backend\n DATAPORTEN_CACHE_PATH = 'tmp/'\n\n.. _django-allauth: https://github.com/pennersr/django-allauth:\n\n\nUsage\n=====\n\nThe :code:`DataportenGroupsMiddleware` adds an instance of\n:code:`DataportenGroupsManager` assigned to :code:`request.user.dataporten` for\nevery valid dataporten user making a request. This object contains attributes\nfor accessing different types of group memberships, such as courses, organization\nunits, study programmes, main profiles, generic groups, and *all* groups.\n\n\nGroups\n------\n\n*All* groups are accessible through :code:`request.user.dataporten.groups`.\nThis is a dictionary keyed by group ids, with :code:`Group` objects as values.\nLet's use the Applied Physics and Mathematics master degree at NTNU as an example\nfor common attributes available for all group types\n\n.. code:: python\n\n uid = 'fc:fs:fs:prg:ntnu.no:MTFYMA'\n group = request.user.dataporten.groups[uid]\n assert group.uid == uid\n assert group.name == 'Fysikk og matematikk - masterstudium (5-\\u00e5rig)'\n assert group.url == 'http://www.ntnu.no/studier/mtfyma'\n assert group.group_type == 'fc:fs:prg'\n\nMembership objects\n------------------\n\nAll groups have an associated :code:`Membership` object which can be used for\nfurther querying of membership properties for that particular group.\nThe original membership JSON can be accessed from the :code:`Membership.json`\nattribute:\n\n.. code:: python\n\n group = request.user.dataporten.groups[uid]\n membership = group.membership\n\n print(membership.json)\n >>> {\n >>> 'title': ['fast ansatt'],\n >>> 'affiliation': ['employee', 'member', 'affiliate', 'student'],\n >>> 'primaryAffiliation': 'employee',\n >>> 'basic': 'admin',\n >>> 'displayName': 'Ansatt',\n >>> }\n\n\nSome additional, common properties are available:\n\n.. code:: python\n\n # Membership objects are \"truthy\" if they are considered active\n assert membership\n\n # Not all group memberships have a set end time\n assert isinstance(membership.end_time, [datetime.datetime, None])\n\n # The displayName value is used as the membership string representation\n assert str(membership) == 'Ansatt'\n\n # Primary affiliation to the group\n assert membership.primary_affiliation == 'employee'\n\n # And all affiliations to the group\n assert membership.affiliations == [\n 'employee',\n 'member',\n 'affiliate',\n 'student',\n ]\n\n\nGroup membership checks\n~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can also check if a user is an **active** member of a specific dataporten group\nby providing the group :code:`id` to the :code:`DataportenGroupsManager.is_member_of`\nmethod. This is offered as a more ergonomic alternative to\n:code:`bool(request.user.dataporten.groups[uid].membership)`. For instance,\n\n.. code:: python\n\n assert request.user.dataporten.is_member_of(\n uid='fc:org:ntnu.no:unit:167500',\n active=True,\n )\n\nIf :code:`active` is set to :code:`False`, the method only checks if the user\nhas been a member of the group at any time, not necessarily if the user is\nan **active** member.\n\nSemester objects\n----------------\n\nMembership objects also have an associated :code:`Semester` object which\ncan be used to determine the year and season of the membership.\n\n.. code:: python\n\n from dataporten.parsers import Semester\n\n semester = request.user.groups[uid].membership.semester\n assert semester.year == 2019\n assert semester.season in (Semester.SPRING, Semester.AUTUMN)\n\nThe :code:`Semester` class also implements :code:`__sub__`, which\nreturns \"semester delta\" between two semesters. For instance,\nthe spring semester of 2019 minus the autumn semester of 2017 would\nreturn :code:`3`.\n\nCourses\n-------\n\nCourse enrollment can be queryed from the :code:`CourseManager` object, attributed to\n:code:`request.user.dataporten.course`.\n\nYou can check if a user has an affiliation to a course, only given\nits course code, and not its dataporten ID,\n\n.. code:: python\n\n # Already finished the course\n assert 'TMA4150' in request.user.dataporten.courses.finished\n\n # Currently enrolled in the course\n assert 'TMA4150' in request.user.dataporten.courses.active\n\n # Either\n assert 'TMA4150' in request.user.dataporten.courses.all\n\n\nMore\n----\n\nThere is still lots of more undocumented (but well tested!) attributes of\n:code:`DataportenGroupsManager`. Take a look at :code:`dataporten/parsers.py`.\nEach parser has a class variable :code:`NAME`, and they are attached to\nthe user as :code:`request.user.dataporten.NAME`.\n\nIf you have a specific usecase, please open a GitHub issue, and I will\ndocument and/or implement it for you.\n\nRun tests\n=========\n\n.. code:: bash\n\n export DJANGO_SETTINGS_MODULE=dataporten.settings\n pytest\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/JakobGM/django-dataporten", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "django-dataporten", "package_url": "https://pypi.org/project/django-dataporten/", "platform": "", "project_url": "https://pypi.org/project/django-dataporten/", "project_urls": { "Homepage": "https://github.com/JakobGM/django-dataporten" }, "release_url": "https://pypi.org/project/django-dataporten/0.4.0/", "requires_dist": null, "requires_python": "", "summary": "A simple Django app to fetch and parse data from Dataporten.", "version": "0.4.0" }, "last_serial": 5109599, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "f0a31c1688d903b91eb799955ad19705", "sha256": "31123e704b00938edf9d2aefc8d59d92a79e193f0a59c224dc8dbac868e389e5" }, "downloads": -1, "filename": "django-dataporten-0.1.tar.gz", "has_sig": true, "md5_digest": "f0a31c1688d903b91eb799955ad19705", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12331, "upload_time": "2017-10-20T15:14:50", "url": "https://files.pythonhosted.org/packages/75/19/72abcaf2dc91bb4c2e21a0e2644194a9922791f6d48fa80351b46963944c/django-dataporten-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9205a0d2ca889956245fc1e2ec6500fb", "sha256": "316f2ee03f57be1b24c051333e640d460f194c781d64008aed4f5a1e24cc7837" }, "downloads": -1, "filename": "django-dataporten-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9205a0d2ca889956245fc1e2ec6500fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12363, "upload_time": "2017-10-25T16:02:21", "url": "https://files.pythonhosted.org/packages/3b/d2/0eb101c25ffc6e1345a046426a37c4820ebab51d99da5ac1b1a6a93a5cec/django-dataporten-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "f5cc86b5d8111e9f67adbebea14039a6", "sha256": "13754c4155aaf684fa27512415aaa0630fabd1f4388312df0cbe2689b1748a69" }, "downloads": -1, "filename": "django-dataporten-0.1.2.tar.gz", "has_sig": false, "md5_digest": "f5cc86b5d8111e9f67adbebea14039a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12419, "upload_time": "2018-01-23T09:49:54", "url": "https://files.pythonhosted.org/packages/de/ab/ed124ae03e203b40085a053cf0ab1ea83125b009bfaff5102d36eb0e1282/django-dataporten-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0a638e18933183f03332b3647c56edab", "sha256": "2db76dda51989512009aa9a4e0bea00f05343d331918b9db4fd6b3f062015892" }, "downloads": -1, "filename": "django_dataporten-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0a638e18933183f03332b3647c56edab", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16704, "upload_time": "2019-01-06T15:57:21", "url": "https://files.pythonhosted.org/packages/56/d7/af8c58ae6cce97a55480f86b0b9d9eb43b9861d5d8245ba2801240d2a76a/django_dataporten-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "70481426a1a4a0dbeb189bb1ae1de645", "sha256": "2d0b2653038e47c1bb484b68642d76273a962a6152caf23ac5f6dad59a95d1e6" }, "downloads": -1, "filename": "django-dataporten-0.2.0.tar.gz", "has_sig": false, "md5_digest": "70481426a1a4a0dbeb189bb1ae1de645", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12836, "upload_time": "2019-01-06T15:57:19", "url": "https://files.pythonhosted.org/packages/74/e3/9568534c2e933b4d04ed288eb791cb1e7f2abb80df57269545ce710d62fa/django-dataporten-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "576763176c8badf487a77366ff6c74b0", "sha256": "048fd358b46332416e7356ba06a366fcc4223bd3c9971c6456238f84ba5832fc" }, "downloads": -1, "filename": "django_dataporten-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "576763176c8badf487a77366ff6c74b0", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16700, "upload_time": "2019-01-06T16:08:59", "url": "https://files.pythonhosted.org/packages/eb/02/414c2c4e43e145daf73122b2a79a02690fcaf5f47ab5dd1ce92dc6802ee0/django_dataporten-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4e0d75d3a8b1409d06392a3de60949f", "sha256": "e64bb1a34835931af2d2f9612810dc66d69cff2db3cee343fe07bc0baab1f807" }, "downloads": -1, "filename": "django-dataporten-0.2.1.tar.gz", "has_sig": false, "md5_digest": "d4e0d75d3a8b1409d06392a3de60949f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12843, "upload_time": "2019-01-06T16:08:57", "url": "https://files.pythonhosted.org/packages/51/5f/45b9bfd789f593ed9bb5ff360106e90350ba51f0729169bccb05e922c415/django-dataporten-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "c24e137debbe018d0bb568b58b3ffe14", "sha256": "e58991d5ae9fc8f12b9e6fdfb21b6308a070de34a97ab4a30c1a37a65c690e0b" }, "downloads": -1, "filename": "django_dataporten-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c24e137debbe018d0bb568b58b3ffe14", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 17080, "upload_time": "2019-01-06T16:33:46", "url": "https://files.pythonhosted.org/packages/3b/67/19de120cafaf59e041f1bec5a0869a2a021fde39446b22845b64c3688727/django_dataporten-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0046c609368b65804f83ca27dc3419ac", "sha256": "55b0fc8a17d9d952ebcd1b1a7368af233307a20e4fa9ee268064cb3d9610636c" }, "downloads": -1, "filename": "django-dataporten-0.2.2.tar.gz", "has_sig": false, "md5_digest": "0046c609368b65804f83ca27dc3419ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13467, "upload_time": "2019-01-06T16:33:44", "url": "https://files.pythonhosted.org/packages/ce/13/11ff3aabd2da08a2ec48f47bd409a1a0a816588a52ababdfda274a02c44f/django-dataporten-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "e3445fc01191d479e3db961b45c8ff68", "sha256": "242ab5a10d035c049591a313e0fa7761bdc3b8395b6c465ebfb7ac1876864ab8" }, "downloads": -1, "filename": "django_dataporten-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e3445fc01191d479e3db961b45c8ff68", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 18062, "upload_time": "2019-01-06T17:51:32", "url": "https://files.pythonhosted.org/packages/ef/e2/f81f01e055b2f0d775427f76004d0685d8e952ef844087c573bb40336323/django_dataporten-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b6fc17bda2851c4ed0a906d0bfe13d9", "sha256": "356992c15a1def40e35a30de43c302fdfed7b274050f7d972de1111c4f9c657b" }, "downloads": -1, "filename": "django-dataporten-0.3.0.tar.gz", "has_sig": false, "md5_digest": "9b6fc17bda2851c4ed0a906d0bfe13d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14853, "upload_time": "2019-01-06T17:51:30", "url": "https://files.pythonhosted.org/packages/a8/31/95858f080b4ef7d51ac0171869fe6a653337635a72dddf54731d18de0077/django-dataporten-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "15d82832ae8f9681867573694bac28c2", "sha256": "8cb9f8658e6263a97ed857e7b528d3c3b070e23c16b707ab8dd1ad65fa76c776" }, "downloads": -1, "filename": "django_dataporten-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "15d82832ae8f9681867573694bac28c2", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 19017, "upload_time": "2019-01-09T17:15:20", "url": "https://files.pythonhosted.org/packages/e8/ef/6d6e774b19b19b28ac5ed9ce369beeea9e4d63f03a9015f6a29bf7b7dd9d/django_dataporten-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99f9143df387b0f507a3fd88b322299c", "sha256": "97e1a00e80c6052503c1e42e3bb049b42186cd816297abba8c240ce63371c331" }, "downloads": -1, "filename": "django-dataporten-0.3.1.tar.gz", "has_sig": false, "md5_digest": "99f9143df387b0f507a3fd88b322299c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16602, "upload_time": "2019-01-09T17:15:17", "url": "https://files.pythonhosted.org/packages/f9/6d/82447ff06c1305e8e68964f1b4e7c949cec375be0e92325552b2d4a15787/django-dataporten-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "998041b8c9ec69bb360a48e1674bf681", "sha256": "0b774591c5d689c5e9493756ebab6ad70d843361c33fbb31f767c4993ada9326" }, "downloads": -1, "filename": "django_dataporten-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "998041b8c9ec69bb360a48e1674bf681", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 20052, "upload_time": "2019-04-07T10:42:32", "url": "https://files.pythonhosted.org/packages/6d/d6/594db6b1dc455a99958b3ebdbb9b9c01a133f8347d43879550f9eee47e99/django_dataporten-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b84ee00a43144764e9f232e8c49b5ff9", "sha256": "c0aa75951885eff38876c8f3697bb052022e299a8a4372ac06b954c6983ba8f1" }, "downloads": -1, "filename": "django-dataporten-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b84ee00a43144764e9f232e8c49b5ff9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17806, "upload_time": "2019-04-07T10:42:29", "url": "https://files.pythonhosted.org/packages/69/5d/48f8265890504e7a41622bf5213a9f9a27cc388f4551eefbb6ad166ec774/django-dataporten-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "998041b8c9ec69bb360a48e1674bf681", "sha256": "0b774591c5d689c5e9493756ebab6ad70d843361c33fbb31f767c4993ada9326" }, "downloads": -1, "filename": "django_dataporten-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "998041b8c9ec69bb360a48e1674bf681", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 20052, "upload_time": "2019-04-07T10:42:32", "url": "https://files.pythonhosted.org/packages/6d/d6/594db6b1dc455a99958b3ebdbb9b9c01a133f8347d43879550f9eee47e99/django_dataporten-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b84ee00a43144764e9f232e8c49b5ff9", "sha256": "c0aa75951885eff38876c8f3697bb052022e299a8a4372ac06b954c6983ba8f1" }, "downloads": -1, "filename": "django-dataporten-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b84ee00a43144764e9f232e8c49b5ff9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17806, "upload_time": "2019-04-07T10:42:29", "url": "https://files.pythonhosted.org/packages/69/5d/48f8265890504e7a41622bf5213a9f9a27cc388f4551eefbb6ad166ec774/django-dataporten-0.4.0.tar.gz" } ] }