def search_aktivitet_dates(site, search_query): aktivitet_filter = DEFAULT_FILTER.copy() aktivitet_filter.update({'search': search_query}) if site.forening.id != Forening.DNT_CENTRAL_ID: aktivitet_filter['organizers'] = '%s:%s' % ( 'forening', site.forening.id) _, aktivitet_dates = filter_aktivitet_dates(aktivitet_filter) return aktivitet_dates
def index(request): query = request.GET.copy() # Default organizers: If visiting a local site, default to the owner of the current site (except for DNT central) if not request.GET.get("organizers", "") and request.site.forening.id != Forening.DNT_CENTRAL_ID: query["organizers"] = "%s:%s" % ("forening", request.site.forening.id) # Default minimum duration is always 1 query["min_duration"] = query.get("min_duration", "1") filter, aktivitet_dates = filter_aktivitet_dates(query) aktivitet_dates_pagenav = paginate_aktivitet_dates(filter, aktivitet_dates) # Usually, the 'sentral' type is sorted first, but in this case we want it last all_foreninger = Forening.get_all_sorted() sentral = all_foreninger[0] if not sentral["code"] == "sentral": # We made an incorrect assumption, log it but try to continue rendering instead of raising an error logger.error( "Assumed first group of forening to be type 'sentral', was really '%s'" % sentral["code"], extra={"request": request, "all_foreninger": all_foreninger}, ) # Remove and append the sentral group to the end all_foreninger.remove(sentral) all_foreninger.append(sentral) # Look up DNT cabins with serving cabins = sorted( Sted.list( params={ "tags": "Hytte", "betjeningsgrad": "Betjent", "privat": {"hytteeier": "DNT"}, "status": "Offentlig", "tilbyder": "DNT", } ), key=lambda s: s["navn"], ) context = { "aktivitet_dates": aktivitet_dates_pagenav, "difficulties": Aktivitet.DIFFICULTY_CHOICES, "categories": Aktivitet.CATEGORY_CHOICES, "category_types": Aktivitet.CATEGORY_TYPES_LIST, "audiences": Aktivitet.AUDIENCE_CHOICES, "omrader": sorted(Område.list(params={"status": "Offentlig", "tilbyder": "DNT"}), key=lambda o: o["navn"]), "cabins": cabins, "all_foreninger": all_foreninger, "filter": filter, } return render(request, "common/aktiviteter/index.html", context)
def filter(request): if not request.is_ajax() or not request.method == "POST": return redirect("aktiviteter:index") filter, aktivitet_dates = filter_aktivitet_dates(request.POST.copy()) aktivitet_dates_pagenav = paginate_aktivitet_dates(filter, aktivitet_dates) context = {"aktivitet_dates": aktivitet_dates_pagenav, "filter": filter} return HttpResponse( json.dumps( { "html": render_to_string("common/aktiviteter/listing.html", context, request=request), "page": aktivitet_dates_pagenav.number, } ) )
def filter(request): if not request.is_ajax() or not request.method == 'POST': return redirect('aktiviteter:index') filter_ = DEFAULT_FILTER.copy() filter_.update(request.POST.dict()) # Share the cache key with the index view template fragment cache cache_key = make_template_fragment_key( 'aktivitet_listing', [filter_hash(filter_)], ) # The entire HTML response is cached html = cache.get(cache_key) if html is None: filter_, aktivitet_dates = filter_aktivitet_dates(filter_) aktivitet_dates_pagenav = paginate_aktivitet_dates( filter_, aktivitet_dates, ) query_string = get_filter_query_string(request.POST.dict()) context = { 'aktivitet_dates': aktivitet_dates_pagenav, 'filter': filter_, 'query_string': query_string, } html = render_to_string( 'common/aktiviteter/listing.html', context, request=request, ) # Note that the cache timeout should match the timeout in # templates/common/aktiviteter/index.html and not be larger than the # timeout in `aktiviteter.models.Aktivitet.add_filter_hash`. cache.set(cache_key, html, 60 * 60 * 24) return HttpResponse(json.dumps({ 'html': html, 'page': filter_['page'], }))
def search(request): # Very simple search for now if 'q' not in request.GET: return render(request, 'common/page/search.html') search_query = request.GET['q'].strip() if len(search_query) < SEARCH_CHAR_LIMIT: context = { 'search_query': search_query, 'query_too_short': True, 'search_char_limit': SEARCH_CHAR_LIMIT, } return render(request, 'common/page/search.html', context) # Record the search search = Search(query=search_query, site=request.site) search.save() pages = Page.on(request.site).filter( # Match page title or content Q(variant__version__rows__columns__contents__content__icontains=search_query) | Q(title__icontains=search_query), # Default segment, active version, published page variant__segment=None, variant__version__active=True, published=True, ).distinct() article_versions = Version.objects.filter( # Match content variant__version__rows__columns__contents__content__icontains=search_query, # Active version, default segment, published article active=True, variant__segment=None, variant__article__published=True, variant__article__pub_date__lt=datetime.now(), variant__article__site=request.site, ).distinct().order_by('-variant__article__pub_date') aktivitet_filter = {'search': search_query} if request.site.forening.id != Forening.DNT_CENTRAL_ID: aktivitet_filter['organizers'] = '%s:%s' % ('forening', request.site.forening.id) _, aktivitet_dates = filter_aktivitet_dates(aktivitet_filter) aktivitet_date_count = aktivitet_dates.count() if request.site.id == Site.DNT_CENTRAL_ID: old_articles = OldArticle.objects.filter( Q(title__icontains=search_query) | Q(lede__icontains=search_query) | Q(content__icontains=search_query) ).distinct().order_by('-date') else: old_articles = [] context = { 'search_query': search_query, 'article_versions': article_versions, 'pages': pages, 'old_articles': old_articles, 'article_count': len(article_versions) + len(old_articles), 'aktivitet_date_count': aktivitet_date_count, } return render(request, 'common/page/search.html', context)
def search(request): SEARCH_CHAR_LIMIT = 3 # Very simple search for now if 'q' not in request.GET: return render(request, 'common/cms/search.html') search_query = request.GET['q'].strip() if len(search_query) < SEARCH_CHAR_LIMIT: context = { 'search_query': search_query, 'query_too_short': True, 'search_char_limit': SEARCH_CHAR_LIMIT, } return render(request, 'common/cms/search.html', context) pages = Page.objects.filter( # Match page title, content or tags Q(versions__rows__columns__contents__content__icontains=search_query) | Q(title__icontains=search_query) | Q(versions__tags__name__icontains=search_query), # Current site site=request.site, # Published page published=True, ).distinct() article_versions = Version.objects.filter( # Match content or tags Q(rows__columns__contents__content__icontains=search_query) | Q(tags__name__icontains=search_query), # Article has not reached its unpublish date Q(article__unpub_date__gt=date.today()) | Q(article__unpub_date__isnull=True), # Active version, published article active=True, article__published=True, article__pub_date__lt=datetime.now(), article__site=request.site, ).distinct().order_by('-article__pub_date') aktivitet_filter = {'search': search_query} if request.site.forening.id != Forening.DNT_CENTRAL_ID: aktivitet_filter['organizers'] = '%s:%s' % ('forening', request.site.forening.id) _, aktivitet_dates = filter_aktivitet_dates(aktivitet_filter) aktivitet_date_count = aktivitet_dates.count() if request.site.is_central(): old_articles = OldArticle.objects.filter( Q(title__icontains=search_query) | Q(lede__icontains=search_query) | Q(content__icontains=search_query) ).distinct().order_by('-date') else: old_articles = [] context = { 'search_query': search_query, 'article_versions': article_versions, 'pages': pages, 'old_articles': old_articles, 'article_count': len(article_versions) + len(old_articles), 'aktivitet_date_count': aktivitet_date_count, } return render(request, 'common/cms/search.html', context)
def index(request): filter_ = DEFAULT_FILTER.copy() filter_.update(request.GET.dict()) # Default organizers: If visiting a local site, default to the owner of the current site (except for DNT central) if not filter_['organizers'] and request.site.forening.id != Forening.DNT_CENTRAL_ID: filter_['organizers'] = '%s:%s' % ('forening', request.site.forening.id) # Interestingly, the paginator will perform a COUNT query to count the # total number of objects, regardless of whether it is used in the # template. Therefore, even if we get a cache hit for the listing template # fragment, it will perform the query unnecessarily. So explicitly check # if the current filter is cached or not, and if so, skip the pagination. cache_key = make_template_fragment_key( 'aktivitet_listing', [filter_hash(filter_)], ) if cache.get(cache_key) is not None: aktivitet_dates_pagenav = None else: filter_, aktivitet_dates = filter_aktivitet_dates(filter_) aktivitet_dates_pagenav = paginate_aktivitet_dates(filter_, aktivitet_dates) # Usually, the 'sentral' type is sorted first, but in this case we want it last all_foreninger = Forening.get_all_sorted() sentral = all_foreninger[0] if not sentral['code'] == 'sentral': # We made an incorrect assumption, log it but try to continue rendering instead of raising an error logger.error( "Assumed first group of forening to be type 'sentral', was really '%s'" % sentral['code'], extra={ 'request': request, 'all_foreninger': all_foreninger, } ) # Remove and append the sentral group to the end all_foreninger.remove(sentral) all_foreninger.append(sentral) # Look up DNT cabins with serving cabins = sorted(Sted.list(params={ 'tags': 'Hytte', 'betjeningsgrad': 'Betjent', 'privat': {'hytteeier': 'DNT'}, 'status': 'Offentlig', 'tilbyder': 'DNT', }), key=lambda s: s['navn']) # Set url query parameters for pagination links query_string = get_filter_query_string(request.GET.dict()) context = { 'aktivitet_dates': aktivitet_dates_pagenav, 'difficulties': Aktivitet.DIFFICULTY_CHOICES, 'categories': Aktivitet.CATEGORY_CHOICES, 'category_types': Aktivitet.CATEGORY_TYPES_LIST, 'audiences': Aktivitet.AUDIENCE_CHOICES, 'omrader': sorted(Område.list(params={'status': 'Offentlig', 'tilbyder': 'DNT'}), key=lambda o: o['navn']), 'cabins': cabins, 'all_foreninger': all_foreninger, 'query_string': query_string, 'filter': filter_, 'filter_hash': filter_hash(filter_), } return render(request, 'common/aktiviteter/index.html', context)