一个简单的Django应用程序,用于从Dataporten获取和解析数据。
项目描述
Django-dataporten是一个简单的Django应用程序,可以从dataporten获取数据并将其附加到您的Django用户对象上。它实现了dataporten组API,允许您通过Pythonic API轻松访问组成员资格,无需担心解析原始JSON内容。
设置
将“dataporten”添加到您的
INSTALLED_APPS
设置中,如下所示
INSTALLED_APPS = [
...
'dataporten',
...
]
运行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.course
的 CourseManager
对象查询。
您可以通过仅提供课程代码而不是 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
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定要选择哪一个,请了解有关 安装包 的更多信息。