Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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,
            }
        )
    )
Exemplo n.º 4
0
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'],
    }))
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)