2222from django .contrib import messages
2323from django .core .paginator import EmptyPage , PageNotAnInteger , Paginator
2424from django .urls import reverse
25- from django .http import HttpResponse , HttpResponseRedirect
25+ from django .http import HttpResponse , HttpResponseRedirect , JsonResponse
2626from django .http import Http404
2727from django .shortcuts import get_object_or_404
2828from django .shortcuts import redirect
@@ -241,46 +241,12 @@ def rescan_service(request, service_id):
241241def service_detail (request , service_id ):
242242 """This view shows the details of a service"""
243243
244- services = Service .objects .filter (resourcebase_ptr_id = service_id )
245-
246- if not services .exists ():
247- messages .add_message (request , messages .ERROR , _ ("You dont have enougth rigths to see the resource detail" ))
248- return redirect (reverse ("services" ))
249- service = services .first ()
244+ service , resources , total_resources = _get_service_and_resources (service_id , request .user , request .GET .get ("page" ))
250245
251246 permissions_json = _perms_info_json (service )
252247
253248 perms_list = permissions_registry .get_perms (instance = service , user = request .user )
254249
255- harvested_resources_ids = []
256- if service .harvester :
257- _h = service .harvester
258- harvested_resources_ids = list (
259- _h .harvestable_resources .filter (should_be_harvested = True , geonode_resource__isnull = False ).values_list (
260- "geonode_resource__id" , flat = True
261- )
262- )
263- already_imported_datasets = get_visible_resources (
264- queryset = ResourceBase .objects .filter (id__in = harvested_resources_ids ), user = request .user
265- )
266- resources_being_harvested = []
267-
268- all_resources = list (resources_being_harvested ) + list (already_imported_datasets )
269-
270- paginator = Paginator (all_resources , getattr (settings , "CLIENT_RESULTS_LIMIT" , 25 ), orphans = 3 )
271- page = request .GET .get ("page" )
272- try :
273- resources = paginator .page (page )
274- except PageNotAnInteger :
275- resources = paginator .page (1 )
276- except EmptyPage :
277- resources = paginator .page (paginator .num_pages )
278-
279- # pop the handler out of the session in order to free resources
280- # - we had stored the service handler on the session in order to
281- # speed up the register/harvest resources flow. However, for services
282- # with many resources, keeping the handler in the session leads to degraded
283- # performance
284250 try :
285251 request .session .pop (service .service_url )
286252 except KeyError :
@@ -291,14 +257,12 @@ def service_detail(request, service_id):
291257 template_name = "services/service_detail.html" ,
292258 context = {
293259 "service" : service ,
294- "datasets" : already_imported_datasets ,
295- # "resource_jobs": (r for r in resources if isinstance(r, HarvestJob)),
260+ "resources" : resources ,
296261 "resource_jobs" : (),
297262 "permissions_json" : permissions_json ,
298263 "permissions_list" : perms_list ,
299264 "can_add_resorces" : request .user .has_perm ("base.add_resourcebase" ),
300- "resources" : resources ,
301- "total_resources" : len (already_imported_datasets ),
265+ "total_resources" : total_resources ,
302266 },
303267 )
304268
@@ -352,3 +316,71 @@ def remove_service(request, service_id):
352316 service .harvester .delete ()
353317 messages .add_message (request , messages .INFO , _ (f"Service { service .title } has been deleted" ))
354318 return HttpResponseRedirect (reverse ("services" ))
319+
320+
321+ @login_required
322+ def service_harvest_progress (request , service_id ):
323+ try :
324+ service = Service .objects .get (id = service_id )
325+ session = None
326+ if service .harvester :
327+ # Get latest active session if any
328+ active_session = service .harvester .latest_harvesting_session
329+ if active_session and active_session .status in ["pending" , "on-going" ]:
330+ session = active_session
331+ if session :
332+ progress = session .get_progress_percentage ()
333+ status = session .status
334+ in_progress = status in ["pending" , "on-going" ]
335+ else :
336+ progress = None
337+ status = "no-session"
338+ in_progress = False
339+ return JsonResponse ({"progress" : progress , "status" : status , "in_progress" : in_progress })
340+ except Service .DoesNotExist :
341+ return JsonResponse ({"progress" : 0 , "status" : "not_found" , "in_progress" : False })
342+
343+
344+ @login_required
345+ def service_resources_partial (request , service_id ):
346+ service , resources , total_resources = _get_service_and_resources (service_id , request .user , request .GET .get ("page" ))
347+
348+ return render (
349+ request ,
350+ template_name = "services/service_resources_partial.html" ,
351+ context = {
352+ "service" : service ,
353+ "resources" : resources ,
354+ "total_resources" : total_resources ,
355+ },
356+ )
357+
358+
359+ def _get_service_and_resources (service_id , user , page ):
360+ """
361+ Common helper to fetch a service and its paginated resources.
362+ """
363+ service = get_object_or_404 (Service , id = service_id )
364+
365+ harvested_resources_ids = []
366+ if service .harvester :
367+ harvested_resources_ids = list (
368+ service .harvester .harvestable_resources .filter (geonode_resource__isnull = False ).values_list (
369+ "geonode_resource__id" , flat = True
370+ )
371+ )
372+
373+ datasets = get_visible_resources (queryset = ResourceBase .objects .filter (id__in = harvested_resources_ids ), user = user )
374+
375+ resources_being_harvested = []
376+ all_resources = list (resources_being_harvested ) + list (datasets )
377+
378+ paginator = Paginator (all_resources , getattr (settings , "CLIENT_RESULTS_LIMIT" , 25 ), orphans = 3 )
379+ try :
380+ resources = paginator .page (page )
381+ except PageNotAnInteger :
382+ resources = paginator .page (1 )
383+ except EmptyPage :
384+ resources = paginator .page (paginator .num_pages )
385+
386+ return service , resources , len (datasets )
0 commit comments