# HG changeset patch # User durandn # Date 1479219056 -3600 # Node ID 895563933e8f090f202cbe49bccdfb539d2e0636 # Parent 51c9ac85fac0c3f916d31b3da6a442611bdd63fc corrected logic error on metacategories filter #41 diff -r 51c9ac85fac0 -r 895563933e8f src/iconolab/views/userpages.py --- a/src/iconolab/views/userpages.py Tue Nov 15 14:42:02 2016 +0100 +++ b/src/iconolab/views/userpages.py Tue Nov 15 15:10:56 2016 +0100 @@ -190,23 +190,32 @@ annotation_queryset = annotation_queryset.filter(current_revision__tagginginfo__accuracy__gte=min_accuracy) metacategories_filter = [] - mtcg_annotations_ids = [] + mtcg_annotations_ids = {} filtering_on_metacategories = False context["qarg_metacategories_filters"] = {} for metacategory in collection.metacategories.all(): - mtcg_filter = request.GET.get("min_metacategory_"+str(metacategory.id), "") - if mtcg_filter and mtcg_filter.isdigit(): + # Default filter is 0 + mtcg_filter = request.GET.get("min_metacategory_"+str(metacategory.id), "0") + # We ignore filters that aren't integers + if mtcg_filter and mtcg_filter.isdigit(): + # For each metacategory we have a dict entry with key=id that will be a list of the annotation matching the filter + mtcg_annotations_ids[str(metacategory.id)] = [] + # Queryarg for autocompleting the form on page load context["qarg_metacategories_filters"]["min_metacategory_"+str(metacategory.id)] = mtcg_filter + # If we got this far we did a filter on metacategories filtering_on_metacategories = True for annotation in annotation_queryset.all(): - if MetaCategoriesCountInfo.objects.filter(metacategory=metacategory, annotation_stats_obj=annotation.stats, count__gte=int(mtcg_filter)).exists(): - mtcg_annotations_ids.append(annotation.annotation_guid) -# mtcg_annotations_ids.append( -# annotation_queryset.filter( -# stats__metacategoriescountinfo_set__metacategory__id=metacategory.id, -# ).values_list('annotation_guid', flat=True)) + if int(mtcg_filter) == 0 or MetaCategoriesCountInfo.objects.filter(metacategory=metacategory, annotation_stats_obj=annotation.stats, count__gte=int(mtcg_filter)).exists(): + mtcg_annotations_ids[str(metacategory.id)].append(annotation.annotation_guid) if filtering_on_metacategories: - annotation_queryset = annotation_queryset.filter(annotation_guid__in=mtcg_annotations_ids) + # If we did a filter on metacategories we have several list of matching annotations. We only display the intersection of all these lists. + annotation_queryset = annotation_queryset.filter(annotation_guid__in= + list( + set.intersection(*[ + set(value) for value in list(mtcg_annotations_ids.values()) + ]) + ) + ) # ordering ordering = []