跳转到主要内容

一个简单的Django应用程序,用于从Dataporten获取和解析数据。

项目描述

Django-dataporten是一个简单的Django应用程序,可以从dataporten获取数据并将其附加到您的Django用户对象上。它实现了dataporten组API,允许您通过Pythonic API轻松访问组成员资格,无需担心解析原始JSON内容。

设置

  1. 将“dataporten”添加到您的INSTALLED_APPS设置中,如下所示

INSTALLED_APPS = [
    ...
    'dataporten',
    ...
]
  1. 运行python manage.py migrate以创建dataporten代理模型。

3. 在您的settings.py文件中,添加变量DATAPORTEN_TOKEN_FUNCTION,它应该是一个函数的点的路径,该函数将检索用户令牌。Dataporten使用此“可导入的字符串”来检索特定用户的OAuth2认证令牌。例如,

DATAPORTEN_TOKEN_FUNCTION = 'myapp.oauth.allauth_token'

该函数应接受一个User并返回一个str,如果存在令牌,则为None。以下是一个python3.6/3.7的示例,如果您使用django-allauth,它将工作

def allauth_token(user: User) -> Optional[str]:
    try:
        return SocialToken.objects.get(
            account__user=user,
            account__provider='dataporten',
        ).token
    except SocialToken.DoesNotExist:
        return None

4. 添加dataporten中间件。此中间件将一个dataporten属性添加到具有关联dataporten令牌的用户request.user上。请确保将其放置在django.contrib.auth.middleware.AuthenticationMiddleware之后。

MIDDLEWARE = (
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
    'dataporten.middleware.DataportenGroupsMiddleware',
    ...
)

5. 可选地,启用API查询的缓存。在启动Django服务器之前,请确保创建在DATAPORTEN_CACHE_PATH中设置的目录。

# Cache requests to the dataporten API
DATAPORTEN_CACHE_REQUESTS = True

# Where to save the sqlite3 cache backend
DATAPORTEN_CACHE_PATH = 'tmp/'

使用

DataportenGroupsMiddleware 为每个发送请求的有效 Dataporten 用户在 request.user.dataporten 中添加了一个 DataportenGroupsManager 实例。此对象包含访问不同类型群组成员资格的属性,例如课程、组织单位、学习计划、主要个人资料、通用群组和 所有 群组。

群组

所有 群组都可通过 request.user.dataporten.groups 访问。这是一个以群组 ID 为键的字典,其值是 Group 对象。以下以 NTNU 的应用物理和数学硕士学位课程为例,说明适用于所有群组类型的常见属性。

uid = 'fc:fs:fs:prg:ntnu.no:MTFYMA'
group = request.user.dataporten.groups[uid]
assert group.uid == uid
assert group.name == 'Fysikk og matematikk - masterstudium (5-\u00e5rig)'
assert group.url == 'http://www.ntnu.no/studier/mtfyma'
assert group.group_type == 'fc:fs:prg'

成员资格对象

所有群组都关联了一个 Membership 对象,可用于查询该特定群组的成员资格属性。原始成员资格 JSON 可通过 Membership.json 属性访问。

group = request.user.dataporten.groups[uid]
membership = group.membership

print(membership.json)
>>> {
>>>     'title': ['fast ansatt'],
>>>     'affiliation': ['employee', 'member', 'affiliate', 'student'],
>>>     'primaryAffiliation': 'employee',
>>>     'basic': 'admin',
>>>     'displayName': 'Ansatt',
>>> }

一些其他常用属性也可用

# Membership objects are "truthy" if they are considered active
assert membership

# Not all group memberships have a set end time
assert isinstance(membership.end_time, [datetime.datetime, None])

# The displayName value is used as the membership string representation
assert str(membership) == 'Ansatt'

# Primary affiliation to the group
assert membership.primary_affiliation == 'employee'

# And all affiliations to the group
assert membership.affiliations == [
    'employee',
    'member',
    'affiliate',
    'student',
]

群组成员资格检查

您还可以通过向 DataportenGroupsManager.is_member_of 方法提供群组 id 来检查用户是否为特定 Dataporten 群组的 活跃 成员。这是一个比 bool(request.user.dataporten.groups[uid].membership) 更人性化的替代方案。例如,

assert request.user.dataporten.is_member_of(
    uid='fc:org:ntnu.no:unit:167500',
    active=True,
)

如果 active 设置为 False,则方法仅检查用户是否曾为该群组成员,而不一定是用户是否为 活跃 成员。

学期对象

成员资格对象还关联了一个 Semester 对象,可用于确定成员资格的年份和季节。

from dataporten.parsers import Semester

semester = request.user.groups[uid].membership.semester
assert semester.year == 2019
assert semester.season in (Semester.SPRING, Semester.AUTUMN)

Semester 类还实现了 __sub__,它返回两个学期之间的“学期差”。例如,2019 年春季学期减去 2017 年秋季学期将返回 3

课程

课程注册可以通过分配给 request.user.dataporten.courseCourseManager 对象查询。

您可以通过仅提供课程代码而不是 Dataporten ID 来检查用户是否与课程有关联,

# Already finished the course
assert 'TMA4150' in request.user.dataporten.courses.finished

# Currently enrolled in the course
assert 'TMA4150' in request.user.dataporten.courses.active

# Either
assert 'TMA4150' in request.user.dataporten.courses.all

更多

还有更多未记录的(但经过良好测试!)的 DataportenGroupsManager 属性。请参阅 dataporten/parsers.py。每个解析器都有一个类变量 NAME,它们作为 request.user.dataporten.NAME附加到用户。

如果您有特定的用例,请创建一个 GitHub 问题,我将为您记录和/或实现它。

运行测试

export DJANGO_SETTINGS_MODULE=dataporten.settings
pytest

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定要选择哪一个,请了解有关 安装包 的更多信息。

源分发

django-dataporten-0.4.0.tar.gz (17.8 kB 查看哈希值)

上传时间

构建分发

django_dataporten-0.4.0-py3-none-any.whl (20.1 kB 查看哈希值)

上传时间 Python 3

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面