diff --git a/src/providers/views.py b/src/providers/views.py index b2448213836385ee5f25789ad9a35e461f23fd04..9740136b06524eec8de1ddac07ea748ccfce4b55 100644 --- a/src/providers/views.py +++ b/src/providers/views.py @@ -363,38 +363,44 @@ class GetProviderData(APIView): collection = lrs_db["statements"] + active_verbs = list(map(lambda x : x["verb"], list(AnalyticsTokenVerb.objects.filter(analytics_token_id = analytics_token).values()))) + providers = [] # check for anonymized collection - provider = analytics_token.provider - try: - latest_schema = ProviderSchema.objects.get( - provider=provider, superseded_by__isnull=True - ) - except ObjectDoesNotExist: - return JsonResponse( - { - "message": "No consent provider schema found.", - "provider": provider.name, - }, - safe=False, - status=status.HTTP_500_INTERNAL_SERVER_ERROR, - ) + for analytics_token_verb in AnalyticsTokenVerb.objects.filter(analytics_token_id = analytics_token): + if analytics_token_verb.provider not in providers: + providers.append(analytics_token_verb.provider) + for provider in providers: # get verbs that can be collected anonymously and their minimum count # and get those, whose minimum count is reached - anon_verbs = [] - for verb in [verb for verblist in [group["verbs"] for group in latest_schema.groups] for verb in verblist]: - if verb["id"] in analytics_token.active_verbs and verb.get("allowAnonymizedCollection", False): - min_count = verb.get("allowAnonymizedCollectionMinCount", - settings.ANONYMIZATION_DEFAULT_MINIMUM_COUNT) - current_count = collection.distinct("actor.mbox", { - "$and": [ - {"verb.id": {"$eq": verb["id"]}}, - {"actor.mbox": {"$exists": True}}, - {"actor.mbox": {"$regex": "^" + settings.ANONYMIZATION_HASH_PREFIX}} - ] - }).length - if current_count >= min_count: - anon_verbs.append(verb) + anon_verbs = [] + try: + latest_schema = ProviderSchema.objects.get( + provider=provider, superseded_by__isnull=True + ) + except ObjectDoesNotExist: + return JsonResponse( + { + "message": "No consent provider schema found.", + "provider": provider.name, + }, + safe=False, + status=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + + + for verb in [verb for verblist in [group["verbs"] for group in latest_schema.groups] for verb in verblist]: + if verb["id"] in active_verbs and verb.get("allowAnonymizedCollection", False): + min_count = verb.get("allowAnonymizedCollectionMinCount", settings.ANONYMIZATION_DEFAULT_MINIMUM_COUNT) + current_count = collection.distinct("actor.mbox", { + "$and": [ + {"verb.id": {"$eq": verb["id"]}}, + {"actor.mbox": {"$exists": True}}, + {"actor.mbox": {"$regex": "^" + settings.ANONYMIZATION_HASH_PREFIX}} + ] + }).length + if current_count >= min_count: + anon_verbs.append(verb) # selects for anonymized statements of which there are enough different actors # or explicitly non-anonymized statements @@ -421,7 +427,7 @@ class GetProviderData(APIView): "$and": [ {"actor.tan": {"$exists": False}}, # important! flagged statements filtered out here {"_id": {"$gt": ObjectId(last_object_id)}}, - {"verb.id": {"$in": analytics_token.active_verbs}}, + {"verb.id": {"$in": active_verbs}}, anon_query # for anonymized statements ] } @@ -429,14 +435,14 @@ class GetProviderData(APIView): else { "$and": [ {"actor.tan": {"$exists": False}}, - {"verb.id": {"$in": analytics_token.active_verbs}}, + {"verb.id": {"$in": active_verbs}}, anon_query # for anonymized statements ] } ) cursor = collection.find(query).limit(page_size) data = { - "verbs": list(set(analytics_token.active_verbs)), + "verbs": list(set(active_verbs)), "statements": list(cursor), "page_size": page_size, } @@ -475,7 +481,7 @@ class StoreAnalyticsEngineResult(APIView): collection.insert_one( { "created_at": datetime.now(), - "provider_id": analytics_token.provider.id, + #"provider_id": analytics_token.provider.id, "name": analytics_token.name, "analytics_token": token, "result": request.data.get("result"), @@ -631,9 +637,19 @@ class GetAnalyticsEngineResults(APIView): try: analytics_token = AnalyticsToken.objects.get(key=token) - accessible_provider_ids = [ - token.id for token in analytics_token.can_access.all() - ] + [analytics_token.provider.id] + provider_ids = [] + #providers from this token + for analytics_token_verb in AnalyticsTokenVerb.objects.filter(analytics_token_id = analytics_token): + if analytics_token_verb.provider.id not in provider_ids: + provider_ids.append(analytics_token_verb.provider.id) + + #providers from can_acccess tokens + for token in analytics_token.can_access.all(): + for analytics_token_verb in AnalyticsTokenVerb.objects.filter(analytics_token_id = token.id): + if analytics_token_verb.provider.id not in provider_ids: + provider_ids.append(analytics_token_verb.provider.id) + + accessible_provider_ids = provider_ids collection = lrs_db["results"] query = {"provider_id": {"$in": accessible_provider_ids}}