예제 #1
0
def load_boxes(context, slugs=None, **filters):
    if slugs:
        filters['slug__in'] = ordered_slugs = slugs.split(',')

    request = context['request']
    current_site = getattr(
        request,
        'site',
        Site.objects.get(pk=settings.SITE_ID)
    )

    filters['site__in'] = [current_site]
    master_site = settings.OPPS_CONTAINERS_SITE_ID or 1
    if current_site.id != master_site:
        filters['site__in'].append(master_site)

    filters['date_available__lte'] = timezone.now()
    filters['published'] = True

    boxes = ContainerBox.objects.filter(**filters).order_by('-site')
    fallback = getattr(settings, 'OPPS_MULTISITE_FALLBACK', False)

    exclude_ids = []

    if slugs:
        ob = lambda i, o=ordered_slugs: (
            i.site != current_site, i.site.id, o.index(i.slug)
        )

        boxes = sorted(
            boxes,
            key=ob
        )

    for box in boxes:
        if box.queryset:
            results = box.get_queryset(exclude_ids=exclude_ids)
        else:
            results = box.ordered_containers(exclude_ids=exclude_ids)

        if box.queryset:
            [exclude_ids.append(i.pk)
             for i in results if i.pk not in exclude_ids
             and issubclass(i.__class__, Container)]
        elif fallback:
            [exclude_ids.append(i.container_id)
             for i in results
             if i.container_id and i.container_id not in exclude_ids]
        else:
            [exclude_ids.append(i.pk)
             for i in results
             if i.pk not in exclude_ids]

    results = {}
    for box in boxes:
        if box.slug not in results:
            results[box.slug] = box

    get_request().container_boxes = results
    return results
예제 #2
0
def get_containerbox(context, slug, template_name=None, **extra_context):

    request = context['request']
    current_site = getattr(request, 'site',
                           Site.objects.get(pk=settings.SITE_ID))
    is_mobile = getattr(request, 'is_mobile', False)

    cachekey = "ContainerBox-{}-{}-{}-{}".format(slug, template_name,
                                                 is_mobile, current_site.id)

    render = cache.get(cachekey)
    if render:
        return render

    box = getattr(get_request(), 'container_boxes', {}).get(slug, None)

    if not box:
        filters = {}
        filters['site'] = current_site
        filters['slug'] = slug
        filters['date_available__lte'] = timezone.now()
        filters['published'] = True

        master_site = settings.OPPS_CONTAINERS_SITE_ID or 1

        try:
            box = ContainerBox.objects.get(**filters)
        except ContainerBox.DoesNotExist:
            box = None

        if current_site.id != master_site and \
           not box or not getattr(box, 'has_content', False):
            filters['site'] = master_site
            try:
                box = ContainerBox.objects.get(**filters)
            except ContainerBox.DoesNotExist:
                box = None

        if not box:
            box = ContainerBox.objects.none()

    t = template.loader.get_template('articles/articlebox_detail.html')
    if template_name:
        t = template.loader.get_template(template_name)

    context = {
        'articlebox': box,
        'slug': slug,
        'context': context,
        'request': request
    }

    context.update(extra_context)

    render = t.render(template.Context(context))

    cache.set(cachekey, render, settings.OPPS_CACHE_EXPIRE)

    return render
예제 #3
0
def load_boxes(context, slugs=None, **filters):
    if slugs:
        filters['slug__in'] = ordered_slugs = slugs.split(',')

    request = context['request']
    current_site = getattr(request, 'site',
                           Site.objects.get(pk=settings.SITE_ID))

    filters['site__in'] = [current_site]
    master_site = settings.OPPS_CONTAINERS_SITE_ID or 1
    if current_site.id != master_site:
        filters['site__in'].append(master_site)

    filters['date_available__lte'] = timezone.now()
    filters['published'] = True

    boxes = ContainerBox.objects.filter(**filters).order_by('-site')
    fallback = getattr(settings, 'OPPS_MULTISITE_FALLBACK', False)

    exclude_ids = []

    if slugs:
        ob = lambda i, o=ordered_slugs: (i.site != current_site, i.site.id,
                                         o.index(i.slug))

        boxes = sorted(boxes, key=ob)

    for box in boxes:
        if box.queryset:
            results = box.get_queryset(exclude_ids=exclude_ids)
        else:
            results = box.ordered_containers(exclude_ids=exclude_ids)

        if box.queryset:
            [
                exclude_ids.append(i.pk) for i in results if
                i.pk not in exclude_ids and issubclass(i.__class__, Container)
            ]
        elif fallback:
            [
                exclude_ids.append(i.container_id) for i in results
                if i.container_id and i.container_id not in exclude_ids
            ]
        else:
            [
                exclude_ids.append(i.pk) for i in results
                if i.pk not in exclude_ids
            ]

    results = {}
    for box in boxes:
        if box.slug not in results:
            results[box.slug] = box

    get_request().container_boxes = results
    return results
예제 #4
0
def get_containerbox(
        context, slug, template_name=None, channel=None, **extra_context):

    request = context['request']
    current_site = getattr(
        request,
        'site',
        Site.objects.get(pk=settings.SITE_ID)
    )
    is_mobile = getattr(request, 'is_mobile', False)

    cachekey = "ContainerBox-{0}-{1}-{2}-{3}".format(
        slug,
        template_name,
        is_mobile,
        current_site.id
    )

    render = cache.get(cachekey)
    if render:
        return render

    box = getattr(get_request(), 'container_boxes', {}).get(slug, None)

    if not box:
        filters = {}
        filters['site'] = current_site
        filters['slug'] = slug
        filters['date_available__lte'] = timezone.now()
        filters['published'] = True
        if channel is not None:
            filters['channel'] = channel

        master_site = settings.OPPS_CONTAINERS_SITE_ID or 1

        try:
            box = ContainerBox.objects.get(**filters)
        except ContainerBox.DoesNotExist:
            box = None

        if current_site.id != master_site and \
           not box or not getattr(box, 'has_content', False):
            filters['site'] = master_site
            try:
                box = ContainerBox.objects.get(**filters)
            except ContainerBox.DoesNotExist:
                box = None

        if not box:
            box = ContainerBox.objects.none()

    t = template.loader.get_template('articles/articlebox_detail.html')
    if template_name:
        t = template.loader.get_template(template_name)

    context = {
        'articlebox': box,
        'slug': slug,
        'context': context,
        'request': request
    }

    context.update(extra_context)

    render = t.render(template.Context(context))

    cache.set(cachekey, render, settings.OPPS_CACHE_EXPIRE)

    return render