Example #1
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)
Example #2
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,
            }
        )
    )
Example #3
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'],
    }))
Example #4
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)