Skip to content

Commit 45bd094

Browse files
authored
feat(dataCollectors): display collection client URLs in Django Admin DEV-920 (#6355)
### 📣 Summary Show ready-to-use links for Enketo Express and KoboCollect on Data Collector pages in Django Admin
1 parent 8280cbc commit 45bd094

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

kobo/apps/data_collectors/admin.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
from urllib.parse import urlparse
2+
13
from django import forms
4+
from django.conf import settings
25
from django.contrib import admin, messages
36
from django.contrib.admin.widgets import FilteredSelectMultiple
47
from django.core.exceptions import ValidationError
58
from django.db.models import Q
9+
from django.utils.safestring import mark_safe
10+
from django_redis import get_redis_connection
611

712
from kobo.apps.data_collectors.models import DataCollector, DataCollectorGroup
813
from kpi.constants import ASSET_TYPE_SURVEY, PERM_MANAGE_ASSET
@@ -110,11 +115,18 @@ def get_form(self, request, obj=..., change=..., **kwargs):
110115
@admin.register(DataCollector)
111116
class DataCollectorAdmin(admin.ModelAdmin):
112117
list_display = ('name', 'group', 'token')
113-
fields = ['name', 'group', 'token', 'uid']
114-
readonly_fields = ['uid', 'token']
118+
readonly_fields = ['uid', 'token', 'collect_url', 'enketo_urls']
115119
actions = ['rotate_token']
116120
search_fields = ('group__name', 'name')
117121
autocomplete_fields = ['group']
122+
fieldsets = (
123+
(None, {
124+
'fields': ('name', 'group', 'token', 'uid'),
125+
}),
126+
('Collector URLs', {
127+
'fields': ('collect_url', 'enketo_urls',),
128+
}),
129+
)
118130

119131
@admin.action(description='Rotate token')
120132
def rotate_token(self, request, queryset):
@@ -125,3 +137,35 @@ def rotate_token(self, request, queryset):
125137
f'Token for {data_collector.name} has been rotated',
126138
level=messages.SUCCESS,
127139
)
140+
141+
@admin.display(description='KoboCollect')
142+
def collect_url(self, obj):
143+
144+
if not (obj and obj.token):
145+
return '-'
146+
147+
collect_url = f'{settings.KOBOCAT_URL}/key/{obj.token}'
148+
return mark_safe(
149+
'<a href="{collect_url}" target="_blank">'
150+
f' {collect_url}'
151+
'</a>'
152+
)
153+
154+
@admin.display(description='Enketo')
155+
def enketo_urls(self, obj):
156+
redis_client = get_redis_connection('enketo_redis_main')
157+
158+
if not (obj and obj.token):
159+
return '-'
160+
161+
parsed_url = urlparse(settings.KOBOCAT_URL)
162+
163+
items = ''
164+
for asset in obj.group.assets.all():
165+
enketo_id = redis_client.get(
166+
f'or:{parsed_url.netloc}/key/{obj.token},{asset.uid}'
167+
)
168+
enketo_url = f'{settings.ENKETO_URL}/x/{enketo_id.decode()}'
169+
items = items + f'• <a href="{enketo_url}" target="_blank">{asset.name} (#{asset.uid})</a><br>' # noqa
170+
171+
return mark_safe(items)

0 commit comments

Comments
 (0)