def _getQuerySetChildResult(self, querySet): ''' Determine child results... TODO: uniqueness detection/removal ''' children = self._getAllChildQuerySets(querySet, results=[]) model = modellib.type_map[querySet.resource_type] resources = EmptyQuerySet(model) lookupFn = self._searchMethod(querySet) for qs in children: # this won't use the tags for the child but will re-run # the kids and update transitive tags filtered = self._getQuerySetFilteredResult( qs ).distinct() chosen = self._getQuerySetChosenResult( qs, lookupFn ).distinct() resources = resources | filtered | chosen resources = resources.distinct() # this could be slow if we update on every access, and is complicated by the fact # that chosen ONLY works through tags. So only update transitive tags when # the tags are already stale #if self._areResourceTagsStale(querySet): self._updateTransitiveTags(querySet, resources) return resources
def filterQuerySet(self, querySet): '''Return resources matching specific filter criteria''' model = modellib.type_map[querySet.resource_type] # make sure we've implemented tags for these objects # should be able to remove this code once Edge-p1 is # complete resources = None retval = None if not querySet.filter_entries.all(): resources = EmptyQuerySet(model) else: resources = model.objects.select_related().all() for filt in querySet.filter_entries.select_related().all(): resources = modellib.filterDjangoQuerySet( resources, filt.field, filt.operator, filt.value, queryset=querySet) retval = resources.distinct() self._updateTransitiveTags(querySet, resources) return retval
def tidbits_by_book(request, book): book = book.replace('-',' ') startverse = Verse.objects.filter(book__iexact=book).order_by('id')[:1] if startverse.count() == 0: return HttpResponse(book + " is not valid!") endverse = Verse.objects.filter(book__iexact=book).order_by('-id')[:1] cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) from django.db.models.query import EmptyQuerySet tidbits = EmptyQuerySet() for cf in cfs: tidbits |= cf.tidbit_set.all() tidbits = tidbits.distinct() c = { 'filter_criteria': book, 'filter_count': tidbits.count(), 'tidbits': paginate_tidbits(request, tidbits), 'total_count': Tidbit.objects.all().count() } return render_to_response("tidbits_home.html", c, context_instance=RequestContext(request))
def tidbits_by_book(request, book): book = book.replace('-', ' ') startverse = Verse.objects.filter(book__iexact=book).order_by('id')[:1] if startverse.count() == 0: return HttpResponse(book + " is not valid!") endverse = Verse.objects.filter(book__iexact=book).order_by('-id')[:1] cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) from django.db.models.query import EmptyQuerySet tidbits = EmptyQuerySet() for cf in cfs: tidbits |= cf.tidbit_set.all() tidbits = tidbits.distinct() c = { 'filter_criteria': book, 'filter_count': tidbits.count(), 'tidbits': paginate_tidbits(request, tidbits), 'total_count': Tidbit.objects.all().count() } return render_to_response("tidbits_home.html", c, context_instance=RequestContext(request))
def tidbits_by_passage(request, user=None): if request.method == 'GET': passage_ref = request.GET['passage_ref'] try: startverse, endverse = CrossRef.objects.parse_reference( passage_ref) except Exception as e: # TODO: make this neater return HttpResponse(str(e.args[0])) # regex = re.compile("(?P<book>([12]?[A-Za-z ]+[A-Za-z]))( ?(?P<start_chapter>[0-9]+)((:(?P<start_verse>[0-9]+))? ?(- ?(?P<end_chp_or_verse>[0-9]+)(:(?P<end_verse>[0-9]+))?)?)?)?$") # matches = regex.search(passage_ref) # if matches == None: # # TODO: make this neater # return HttpResponse("Invalid passage reference: " + passage_ref) # groups = matches.groupdict() # book = groups['book'] # startchp = groups['start_chapter'] # startvs = groups['start_verse'] # endchporvs = groups['end_chp_or_verse'] # endvs = groups['end_verse'] # cfs = None # if not startchp: # startverse = Verse.objects.filter(book__iexact=book).order_by('id')[:1] # if startverse.count() == 0: # return HttpResponse(book + " is not valid!") # endverse = Verse.objects.filter(book__iexact=book).order_by('-id')[:1] # cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) # elif not startvs: # startverse = Verse.objects.filter( # book__iexact=book, # chapter_ref=int(startchp), # verse_ref=1 # ).order_by('id')[:1] # if startverse.count() == 0: # return HttpResponse(book + " " + int(startchp) + " is not valid!") # endverse = Verse.objects.filter( # book__iexact=book, # chapter_ref=int(startchp) # ).order_by('-id')[:1] # cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) # elif not endchporvs: # endchp = startchp # endvs = startvs # elif not endvs: # endvs = endchporvs # endchp = startchp # else: # endchp = endchporvs # startverse = Verse.objects.get(book__istartswith=book, # chapter_ref=int(startchp), # verse_ref=int(startvs)) # endverse = Verse.objects.get(book__istartswith=book, # chapter_ref=int(endchp), # verse_ref=int(endvs)) # if startverse.id > endverse.id: # # TODO: handle this # return HttpResponse("Start verse " + startverse + " must come before end verse " + endverse) # get tidbits where a cross ref intersects with a given range (more general) cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) cfs |= CrossRef.objects.filter(startverse__gte=startverse, endverse__gte=endverse, startverse__lte=endverse) cfs |= CrossRef.objects.filter(startverse__lte=startverse, endverse__lte=endverse, endverse__gte=startverse) # get tidbits where a cross ref is completely contained in the given range (more precise) cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) # get tidbit entries for each cf from django.db.models.query import EmptyQuerySet tidbits = EmptyQuerySet() for cf in cfs: tidbits |= cf.tidbit_set.all() tidbits = tidbits.distinct() else: return HttpResponseRedirect(reverse('tidbits:home')) c = { 'filter_criteria': passage_ref, 'filter_count': tidbits.count(), 'tidbits': paginate_tidbits(request, tidbits), 'total_count': Tidbit.objects.all().count() } return render_to_response("tidbits_home.html", c, context_instance=RequestContext(request))
def tidbits_by_passage(request, user=None): if request.method == 'GET': passage_ref = request.GET['passage_ref'] try: startverse, endverse = CrossRef.objects.parse_reference(passage_ref) except Exception as e: # TODO: make this neater return HttpResponse(str(e.args[0])) # regex = re.compile("(?P<book>([12]?[A-Za-z ]+[A-Za-z]))( ?(?P<start_chapter>[0-9]+)((:(?P<start_verse>[0-9]+))? ?(- ?(?P<end_chp_or_verse>[0-9]+)(:(?P<end_verse>[0-9]+))?)?)?)?$") # matches = regex.search(passage_ref) # if matches == None: # # TODO: make this neater # return HttpResponse("Invalid passage reference: " + passage_ref) # groups = matches.groupdict() # book = groups['book'] # startchp = groups['start_chapter'] # startvs = groups['start_verse'] # endchporvs = groups['end_chp_or_verse'] # endvs = groups['end_verse'] # cfs = None # if not startchp: # startverse = Verse.objects.filter(book__iexact=book).order_by('id')[:1] # if startverse.count() == 0: # return HttpResponse(book + " is not valid!") # endverse = Verse.objects.filter(book__iexact=book).order_by('-id')[:1] # cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) # elif not startvs: # startverse = Verse.objects.filter( # book__iexact=book, # chapter_ref=int(startchp), # verse_ref=1 # ).order_by('id')[:1] # if startverse.count() == 0: # return HttpResponse(book + " " + int(startchp) + " is not valid!") # endverse = Verse.objects.filter( # book__iexact=book, # chapter_ref=int(startchp) # ).order_by('-id')[:1] # cfs = CrossRef.objects.filter(startverse__gte=startverse, endverse__lte=endverse) # elif not endchporvs: # endchp = startchp # endvs = startvs # elif not endvs: # endvs = endchporvs # endchp = startchp # else: # endchp = endchporvs # startverse = Verse.objects.get(book__istartswith=book, # chapter_ref=int(startchp), # verse_ref=int(startvs)) # endverse = Verse.objects.get(book__istartswith=book, # chapter_ref=int(endchp), # verse_ref=int(endvs)) # if startverse.id > endverse.id: # # TODO: handle this # return HttpResponse("Start verse " + startverse + " must come before end verse " + endverse) # get tidbits where a cross ref intersects with a given range (more general) cfs = CrossRef.objects.filter( startverse__gte=startverse, endverse__lte=endverse ) cfs |= CrossRef.objects.filter( startverse__gte=startverse, endverse__gte=endverse, startverse__lte=endverse ) cfs |= CrossRef.objects.filter( startverse__lte=startverse, endverse__lte=endverse, endverse__gte=startverse ) # get tidbits where a cross ref is completely contained in the given range (more precise) cfs = CrossRef.objects.filter( startverse__gte=startverse, endverse__lte=endverse ) # get tidbit entries for each cf from django.db.models.query import EmptyQuerySet tidbits = EmptyQuerySet() for cf in cfs: tidbits |= cf.tidbit_set.all() tidbits = tidbits.distinct() else: return HttpResponseRedirect(reverse('tidbits:home')) c = { 'filter_criteria': passage_ref, 'filter_count': tidbits.count(), 'tidbits': paginate_tidbits(request, tidbits), 'total_count': Tidbit.objects.all().count() } return render_to_response("tidbits_home.html", c, context_instance=RequestContext(request))