1+ from urllib .parse import urlparse
2+
13from django import forms
4+ from django .conf import settings
25from django .contrib import admin , messages
36from django .contrib .admin .widgets import FilteredSelectMultiple
47from django .core .exceptions import ValidationError
58from django .db .models import Q
9+ from django .utils .safestring import mark_safe
10+ from django_redis import get_redis_connection
611
712from kobo .apps .data_collectors .models import DataCollector , DataCollectorGroup
813from 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 )
111116class 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