Esempio n. 1
0
def oa_mygroup_users(context, nodelist, *args, **kwargs):
    context.push()
    namespace = get_namespace(context)

    obj = kwargs.get('object', None)
    start = kwargs.get('start', None)
    end = kwargs.get('end', None)

    try:
        mygroups = MyGroup.objects.filter(topic=obj)
        cnt = mygroups.count()

    except:
        mygroups = None
        cnt = 0

    if start is not None and end is not None and mygroups is not None:
        mygroups = mygroups[int(start):int(end)]

    namespace['rangelist'] = get_rangelist(start, end, cnt)

    namespace['groups'] = mygroups
    namespace['count'] = cnt

    output = nodelist.render(context)
    context.pop()

    return output
Esempio n. 2
0
def pp_get_reputation_events(context, nodelist, *args, **kwargs):
    '''
    This block tag can create or process forms to get tags.
    Usage is as follows:

    {% pp_get_reputation_events user=request.object %}
       Do stuff with {{ pp_reputation.reputation_events }}.
    {% endpp_get_reputation %}

    '''

    context.push()
    namespace = get_namespace(context)

    user = kwargs.get('user', None)
    start = kwargs.get('start', 0)
    end = kwargs.get('end', 10)

    if user is not None and isinstance(user, User):
        #get argument score
        rep = ReputationEvent.objects.filter(
            initiator=user).order_by('-created_dt')
        cnt = rep.count()
    else:
        rep = []
        cnt = 0

    namespace['count'] = cnt
    namespace['reputation_events'] = rep[start:end]

    namespace['rangelist'] = get_rangelist(start, end, namespace['count'])

    output = nodelist.render(context)
    context.pop()
    return output
Esempio n. 3
0
def oa_mygroup_users(context, nodelist, *args, **kwargs):
    context.push()
    namespace = get_namespace(context)

    obj = kwargs.get('object', None)
    start = kwargs.get('start', None)
    end = kwargs.get('end', None)

    try:
        mygroups = MyGroup.objects.filter(topic=obj)
        cnt = mygroups.count()

    except:
        mygroups = None
        cnt = 0

    if start is not None and end is not None and mygroups is not None:
        mygroups = mygroups[int(start):int(end)]

    namespace['rangelist'] = get_rangelist(start, end, cnt)

    namespace['groups'] = mygroups
    namespace['count'] = cnt

    output = nodelist.render(context)
    context.pop()

    return output
Esempio n. 4
0
def pp_get_reputation_events(context, nodelist, *args, **kwargs):
    '''
    This block tag can create or process forms to get tags.
    Usage is as follows:

    {% pp_get_reputation_events user=request.object %}
       Do stuff with {{ pp_reputation.reputation_events }}.
    {% endpp_get_reputation %}

    '''

    context.push()
    namespace = get_namespace(context)

    user = kwargs.get('user', None)
    start = kwargs.get('start', 0)
    end = kwargs.get('end', 10)

    if user is not None and isinstance(user, User):
        #get argument score
        rep = ReputationEvent.objects.filter(
            initiator=user).order_by('-created_dt')
        cnt = rep.count()
    else:
        rep = []
        cnt = 0

    namespace['count'] = cnt
    namespace['reputation_events'] = rep[start:end]

    namespace['rangelist'] = get_rangelist(start, end, namespace['count'])

    output = nodelist.render(context)
    context.pop()
    return output
Esempio n. 5
0
def pp_get_messages(context, nodelist, *args, **kwargs):

    context.push()
    namespace = get_namespace(context)

    sender = kwargs.get('sender', None)
    user = kwargs.get('user', None)
    start = kwargs.get('start', 0)
    end = kwargs.get('end', 10)
    newest = kwargs.get('newest', None)

    if sender is not None:
        read = Message.objects.filter(
            Q(receiver=user, sender=sender)
            | Q(receiver=sender, sender=user)).order_by('-created_dt')
        unread = Message.objects.filter(read=False,
                                        receiver=user,
                                        sender=sender)

        for mes in unread:
            mes.read = True
            mes.save()

        count = unread.count()
        rcount = read.count()

        if count == 0:
            has_mail = False
        else:
            has_mail = True

        read = read[start:end]

        namespace['has_mail'] = has_mail
        namespace['unreadcount'] = count
        namespace['readcount'] = rcount
        namespace['count'] = rcount + count
        namespace['all'] = read
        namespace['unread'] = unread

        namespace['rangelist'] = get_rangelist(start, end, count)

    elif user is not None:
        namespace['all'] = Message.objects.filter(
            receiver=user).order_by('-created_dt')
        namespace['count'] = namespace['all'].count()
        namespace['all'] = namespace['all'][start:end]

    output = nodelist.render(context)
    context.pop()

    return output
Esempio n. 6
0
def pp_get_messages(context, nodelist, *args, **kwargs):

    context.push()
    namespace = get_namespace(context)

    sender = kwargs.get('sender', None)
    user = kwargs.get('user', None)
    start = kwargs.get('start', 0)
    end = kwargs.get('end', 10)
    newest = kwargs.get('newest', None)

    if sender is not None:
        read = Message.objects.filter(Q(receiver=user, sender=sender) | Q(receiver=sender, sender=user)).order_by('-created_dt')
        unread = Message.objects.filter(read=False, receiver=user, sender=sender)

        for mes in unread:
            mes.read = True
            mes.save()

        count = unread.count()
        rcount = read.count()

        if count == 0:
            has_mail = False
        else:
            has_mail = True

        read = read[start:end]

        namespace['has_mail'] = has_mail
        namespace['unreadcount'] = count
        namespace['readcount'] = rcount
        namespace['count'] = rcount + count
        namespace['all'] = read
        namespace['unread'] = unread

        namespace['rangelist'] = get_rangelist(start, end, count)

    elif user is not None:
        namespace['all'] = Message.objects.filter(receiver=user).order_by('-created_dt')
        namespace['count'] = namespace['all'].count()
        namespace['all'] = namespace['all'][start:end]


    output = nodelist.render(context)
    context.pop()

    return output
Esempio n. 7
0
def get_cache_or_render(user, key, empty, forcerender=True, request=None, extracontext={}):
    """
    get_cache_or_render is required for objects to be returned by
    AJAX requests based on the type of object. This pre-renders
    content so that it is quickly accessible using the oa_cache
    models to interface with templates and div ids derived from css.
    This allows designers to still maintain what templates are pre-rendered
    to improve response time.

    Forms cannot be rendered in this way, as the POST request is sent
    to pirate_core.views.welcome_page, the root of www.openassembly.org/
    **instead we use JS method adObject in detail_dyn.html

    To overcome this only specified cached content in:
        src/pirate_core/templatetags/pp_url/TEMPLATE_DICT


    *** There are a lot of repeated prgramming patterns throughout this function and it
        could easily be optimized
    """
    #init
    tot_items = None
    if key is not None:
        key, rendertype, paramdict = interpret_hash(key)
    rendered_list = []
    load_last = []
    counts = {}

    #need to determine the computational load of adding all the settings dict to the context, if any. Should be a heavier memory load at most, but
    #I don't see how this could slow down the cpu necessarily if we are using hashing
    extracontext.update({'template': rendertype, 'user': user, 'key': key.replace('/', ''), 'settings': settings})

    #get the obj if it exists
    ctype_id = paramdict.get('TYPE_KEY', None)
    obj_id = paramdict.get('OBJ_KEY', None)
    dimension = paramdict.get('DIM_KEY', None)
    scroll_to = paramdict.get('SCROLL_KEY', None)
    phase = paramdict.get('PHASE_KEY', None)
    try:
        obj = get_object_or_none(ctype_id, obj_id)
    except:
        return {'rendered_list': [{'html': render_to_string('dead_link.html'), 'ctype_id': ctype_id, 'obj_id': obj_id, 'div': '#content', 'type': 'html'}],
                     'paramdict': {}, 'render': True}
    if dimension is not None and not empty:
        render = False
    else:
        render = True

    #model specific code: if this is an item or user render that obj first
    try:
        m = ModelCache.objects.get(content_type=rendertype, main=True)
        u = UserSaltCache.objects.filter(model_cache=m.pk)
    except:
        m = None
        u = []
    if (rendertype == 'item' or rendertype == 'user' or rendertype == 'arpv') and render:
        if rendertype == 'user':
            forcerender = True
    if m is not None:
        contextual = {'user': user,
                    'dimension': paramdict.get('DIM_KEY', None),
                    'start': paramdict.get('START_KEY', 0), 'end': paramdict.get('END_KEY', 20)}
        #if theres no obj, specify the user as the main object
        if obj is not None:
            contextual['object'] = obj
        else:
            contextual['object'] = rendertype.replace('_', ' ')
        contextual.update(extracontext)
        #set obj pk
        try:
            obj_pk = contextual['object'].pk
        except:
            obj_pk = m.content_type
        rendered_list.append({'obj_pk': obj_pk, 'div': m.div_id,
            'type': m.jquery_cmd, 'html': m.render(RequestContext(request, contextual))})
        usc = UserSaltCache.objects.filter(model_cache=m.pk, load_last=False)
        for usc in u:
            if usc.object_specific:
                rendered_list.append({'obj_pk': obj_pk, 'div': usc.div_id + obj_pk, 'type': usc.jquery_cmd, 'html':
                       usc.render(RequestContext(request, contextual))})
            else:
                rendered_list.append({'obj_pk': obj_pk, 'div': usc.div_id, 'type': usc.jquery_cmd, 'html':
                       usc.render(RequestContext(request, contextual))})

    if request is not None:
        csrf_val = request.COOKIES.get('csrftoken', None)
        csrf_t = "<div style='display:none'><input type='hidden' value='" + str(csrf_val) + "' name='csrfmiddlewaretoken'></div>"
    else:
        csrf_t = ''

    kwargs = {}

    #list specific code:loads after model so detailed content is loaded first
    #if we aren't renderind the main content, we only want to render the list associated with scrolling
    ###Warning: this breaks if you try to display two lists on one page
    if dimension:
        lists = ListCache.objects.filter(content_type=rendertype, template=dimension)
    if not dimension or lists.count() == 0:
        lists = ListCache.objects.filter(content_type=rendertype, default=True)
    for l in lists:
        m_pk = l.model_cache
        lm = ModelCache.objects.get(pk=m_pk)
        #if we aren't forcerendering, try to get rendered_list from memcache
        renders = None
        if not forcerender:
            #renders[0] -> rendered_list | renders[1] -> cached_list | renders[2] -> tot_items
            renders = memcache.get(key + str(l.pk))
        if renders is None or forcerender:
            renders = []
            #get list of objects to be rendered
            cached_list, tot_items = l.get_or_create_list(key, paramdict, forcerender=forcerender)
            sp = UserSaltCache.objects.filter(model_cache=lm.pk, object_specific=True, **kwargs)

            if len(cached_list) == 0:
                renders.append({'div': lm.div_id, 'html': '', 'type': lm.jquery_cmd})
            for li in cached_list:
                #render each object in the list
                if li != None:
                    context = {'div': lm.div_id, 'object': li, 'dimension': dimension}
                    context.update(extracontext)
                    html = lm.render(context, forcerender=forcerender)
                    if lm.object_specific:
                        renders.append({'div': lm.div_id + str(obj.pk), 'html': html, 'type': lm.jquery_cmd})
                    else:
                        renders.append({'div': lm.div_id, 'html': html, 'type': lm.jquery_cmd})
                if li != None:
                    try:
                        context = {'dimension': paramdict.get('DIM_KEY', 'n'),
                                'object': li, 'obj_pk': li.pk, 'user': user,
                                'phase': phase, 'csrf_string': csrf_t,
                                'sort_type': paramdict.get('CTYPE_KEY', '')}
                    except:
                            context = {'dimension': paramdict.get('DIM_KEY', 'n'),
                                'object': li, 'obj_pk': li[0].pk, 'user': user,
                                'phase': phase, 'csrf_string': csrf_t,
                                'sort_type': paramdict.get('CTYPE_KEY', '')}
                    context.update(extracontext)
                    #user requested this, not auto-update. generate user specific html
                    for usc in sp:
                        if not usc.is_recursive:
                            retdiv = usc.div_id + str(li.pk)
                            renders.append({'div': retdiv, 'type': usc.jquery_cmd, 'html':
                            usc.render(RequestContext(request, context))})
                        else:
                            #if it's recursive we need to also render all the children USCs
                            recursive_list = usc.render(RequestContext(request, context))
                            for html, pk in recursive_list:
                                renders.append({'div': usc.div_id + str(pk), 'type': usc.jquery_cmd, 'html': html})  
            memcache.set(str(key) + str(l.pk), (renders, cached_list, tot_items))
        else:
            renders, cached_list, tot_items = renders
        rendered_list.extend(renders)
        counts[rendertype] = tot_items
        #add usersaltcache if there is request data
        if request is not None:
            #Get Dybamic inputs not linked to a user
            lu = UserSaltCache.objects.filter(model_cache=lm.pk, object_specific=False, opposite=False, load_last=False, **kwargs)
            context = {'dimension': paramdict.get('DIM_KEY', None),
                                    'user': user, 'phase': phase,
                                    'sort_type': paramdict.get('CTYPE_KEY', '')}
            if obj is not None:
                context.update({'object': obj, 'obj_pk': obj.pk})
            context.update(extracontext)
            for usc in lu:
                rendered_list.append({'div': usc.div_id, 'type': usc.jquery_cmd, 'html':
                                    usc.render(RequestContext(request, context))})

            #now add all the UserSaltCache objects from this page
            #THIS REQUIRES A REQUEST OBJECT FO' CSRF
            context = {'dimension': paramdict.get('DIM_KEY', None),
                                'user': user, 'phase': phase,
                                'csrf_string': csrf_t, 'sort_type': paramdict.get('CTYPE_KEY', '')}
            if obj is not None:
                context.update({'object': obj, 'obj_pk': obj.pk})
            context.update(extracontext)
            #for usc in u:
            #    rendered_list.append({'test': 'test', 'obj_pk': obj.pk, 'div': usc.div_id, 'type': usc.jquery_cmd, 'html':
            #                usc.render(RequestContext(request, context))})
            #load last for list caches
            lu = UserSaltCache.objects.filter(model_cache=lm.pk, load_last=True, **kwargs)
            for usc in lu:
                load_last.append({'obj_pk': obj.pk, 'div': usc.div_id, 'type': usc.jquery_cmd, 'html':
                                    usc.render(RequestContext(request, context))})

        #USER SALT CACHCES WITH DYNAMIC RESPONSES ARE DONE
        if tot_items is not None:
            r = UserSaltCache.objects.filter(model_cache=lm.pk, div_id="#rangelist")
            for usc in r:
                rangelist = get_rangelist(paramdict.get('START_KEY', 0), paramdict.get('END_KEY', 20), tot_items)
                html = usc.render(RequestContext(request, {'rangelist': rangelist,
                        'start': paramdict.get('START_KEY', 0), 'end': paramdict.get('END_KEY', 20),
                        'dimension': paramdict.get('DIM_KEY', None), 'object': obj, 'sort_type': paramdict.get('CTYPE_KEY', '')}))
                rendered_list.append({'div': '#pages', 'phase': phase, 'type': usc.jquery_cmd, 'html': html})
    if rendered_list == []:
        context = {'search': paramdict.get('SEARCH_KEY', ''),
                            'dimension': paramdict.get('DIM_KEY', None),
                             'user': user, 'csrf_string': csrf_t, 'template': rendertype}
        context.update(extracontext)
        context = RequestContext(request, context)
        if obj is not None:
            context['object'] = obj
        else:
            context['object'] = rendertype.replace('_', ' ')
        if rendertype != '':
            #first try for free floating usersaltcache forms...
            usc = UserSaltCache.objects.filter(template=rendertype + '.html')
            for u in usc:
                obj_pk = random.randint(-1000, 10000)
                rendered_list.append({'div': u.div_id, 'type': u.jquery_cmd, 'obj_pk': obj_pk, 'html':
                            u.render(context)})
                cached = UserSaltCache.objects.filter(model_cache=u.pk)
                for c in cached:
                    rendered_list.append({'div': c.div_id, 'type': c.jquery_cmd, 'obj_pk': obj_pk, 'html':
                            c.render(context)})
            if rendered_list == []:
                context['request'] = request
                val = render_to_string(rendertype + '.html', context)
                if obj is not None:
                    rendered_list = [{'div': '#pages', 'html': val, 'type': 'append', 'obj_pk': obj.pk}]
                else:
                    rendered_list = [{'div': '#pages', 'html': val, 'type': 'append'}]

    #render all the user salt caches associated with this listindex.html#topics/_s0/_e20/_dh
    #i.e. the Sort By: is a user salt cache
    lu = UserSaltCache.objects.filter(opposite=True, **kwargs)
    if m is not None:
        #exclude if model is available
        lu = lu.exclude(model_cache=m.pk)
    for usc in lu:
        rendered_list.append({'div': usc.div_id, 'obj_pk': obj_pk,  'phase': phase, 'type': usc.jquery_cmd, 'html': usc.render({'request': request, 'object': obj, 'user': user})})
    if m is not None:
        r = UserSaltCache.objects.filter(model_cache=m.pk, load_last=True, **kwargs)
        context = {'dimension': dimension, 'object': obj,
            'obj_pk': obj_pk, 'sort_type': paramdict.get('CTYPE_KEY', '')}
        context.update(extracontext)
        for usc in r:
            html = usc.render(RequestContext(request, context))
            rendered_list.append({'div': usc.div_id,  'phase': phase, 'type': usc.jquery_cmd, 'html': html})
    rendered_list.extend(load_last)
    return {'counts': counts, 'object': obj, 'rendered_list': rendered_list, 'paramdict': paramdict, 'render': render, 'scroll_to': scroll_to, 'rendertype': rendertype}
Esempio n. 8
0
def get_cache_or_render(user,
                        key,
                        empty,
                        forcerender=True,
                        request=None,
                        extracontext={}):
    """
    get_cache_or_render is required for objects to be returned by
    AJAX requests based on the type of object. This pre-renders
    content so that it is quickly accessible using the oa_cache
    models to interface with templates and div ids derived from css.
    This allows designers to still maintain what templates are pre-rendered
    to improve response time.

    Forms cannot be rendered in this way, as the POST request is sent
    to pirate_core.views.welcome_page, the root of www.openassembly.org/
    **instead we use JS method adObject in detail_dyn.html

    To overcome this only specified cached content in:
        src/pirate_core/templatetags/pp_url/TEMPLATE_DICT


    *** There are a lot of repeated prgramming patterns throughout this function and it
        could easily be optimized
    """
    #init
    tot_items = None
    if key is not None:
        key, rendertype, paramdict = interpret_hash(key)
    rendered_list = []
    load_last = []
    counts = {}

    #need to determine the computational load of adding all the settings dict to the context, if any. Should be a heavier memory load at most, but
    #I don't see how this could slow down the cpu necessarily if we are using hashing
    extracontext.update({
        'template': rendertype,
        'user': user,
        'key': key.replace('/', ''),
        'settings': settings
    })

    #get the obj if it exists
    ctype_id = paramdict.get('TYPE_KEY', None)
    obj_id = paramdict.get('OBJ_KEY', None)
    dimension = paramdict.get('DIM_KEY', None)
    scroll_to = paramdict.get('SCROLL_KEY', None)
    phase = paramdict.get('PHASE_KEY', None)
    try:
        obj = get_object_or_none(ctype_id, obj_id)
    except:
        return {
            'rendered_list': [{
                'html': render_to_string('dead_link.html'),
                'ctype_id': ctype_id,
                'obj_id': obj_id,
                'div': '#content',
                'type': 'html'
            }],
            'paramdict': {},
            'render':
            True
        }
    if dimension is not None and not empty:
        render = False
    else:
        render = True

    #model specific code: if this is an item or user render that obj first
    try:
        m = ModelCache.objects.get(content_type=rendertype, main=True)
        u = UserSaltCache.objects.filter(model_cache=m.pk)
    except:
        m = None
        u = []
    if (rendertype == 'item' or rendertype == 'user'
            or rendertype == 'arpv') and render:
        if rendertype == 'user':
            forcerender = True
    if m is not None:
        contextual = {
            'user': user,
            'dimension': paramdict.get('DIM_KEY', None),
            'start': paramdict.get('START_KEY', 0),
            'end': paramdict.get('END_KEY', 20)
        }
        #if theres no obj, specify the user as the main object
        if obj is not None:
            contextual['object'] = obj
        else:
            contextual['object'] = rendertype.replace('_', ' ')
        contextual.update(extracontext)
        #set obj pk
        try:
            obj_pk = contextual['object'].pk
        except:
            obj_pk = m.content_type
        rendered_list.append({
            'obj_pk':
            obj_pk,
            'div':
            m.div_id,
            'type':
            m.jquery_cmd,
            'html':
            m.render(RequestContext(request, contextual))
        })
        usc = UserSaltCache.objects.filter(model_cache=m.pk, load_last=False)
        for usc in u:
            if usc.object_specific:
                rendered_list.append({
                    'obj_pk':
                    obj_pk,
                    'div':
                    usc.div_id + obj_pk,
                    'type':
                    usc.jquery_cmd,
                    'html':
                    usc.render(RequestContext(request, contextual))
                })
            else:
                rendered_list.append({
                    'obj_pk':
                    obj_pk,
                    'div':
                    usc.div_id,
                    'type':
                    usc.jquery_cmd,
                    'html':
                    usc.render(RequestContext(request, contextual))
                })

    if request is not None:
        csrf_val = request.COOKIES.get('csrftoken', None)
        csrf_t = "<div style='display:none'><input type='hidden' value='" + str(
            csrf_val) + "' name='csrfmiddlewaretoken'></div>"
    else:
        csrf_t = ''

    kwargs = {}

    #list specific code:loads after model so detailed content is loaded first
    #if we aren't renderind the main content, we only want to render the list associated with scrolling
    ###Warning: this breaks if you try to display two lists on one page
    if dimension:
        lists = ListCache.objects.filter(content_type=rendertype,
                                         template=dimension)
    if not dimension or lists.count() == 0:
        lists = ListCache.objects.filter(content_type=rendertype, default=True)
    for l in lists:
        m_pk = l.model_cache
        lm = ModelCache.objects.get(pk=m_pk)
        #if we aren't forcerendering, try to get rendered_list from memcache
        renders = None
        if not forcerender:
            #renders[0] -> rendered_list | renders[1] -> cached_list | renders[2] -> tot_items
            renders = memcache.get(key + str(l.pk))
        if renders is None or forcerender:
            renders = []
            #get list of objects to be rendered
            cached_list, tot_items = l.get_or_create_list(
                key, paramdict, forcerender=forcerender)
            sp = UserSaltCache.objects.filter(model_cache=lm.pk,
                                              object_specific=True,
                                              **kwargs)

            if len(cached_list) == 0:
                renders.append({
                    'div': lm.div_id,
                    'html': '',
                    'type': lm.jquery_cmd
                })
            for li in cached_list:
                #render each object in the list
                if li != None:
                    context = {
                        'div': lm.div_id,
                        'object': li,
                        'dimension': dimension
                    }
                    context.update(extracontext)
                    html = lm.render(context, forcerender=forcerender)
                    if lm.object_specific:
                        renders.append({
                            'div': lm.div_id + str(obj.pk),
                            'html': html,
                            'type': lm.jquery_cmd
                        })
                    else:
                        renders.append({
                            'div': lm.div_id,
                            'html': html,
                            'type': lm.jquery_cmd
                        })
                if li != None:
                    try:
                        context = {
                            'dimension': paramdict.get('DIM_KEY', 'n'),
                            'object': li,
                            'obj_pk': li.pk,
                            'user': user,
                            'phase': phase,
                            'csrf_string': csrf_t,
                            'sort_type': paramdict.get('CTYPE_KEY', '')
                        }
                    except:
                        context = {
                            'dimension': paramdict.get('DIM_KEY', 'n'),
                            'object': li,
                            'obj_pk': li[0].pk,
                            'user': user,
                            'phase': phase,
                            'csrf_string': csrf_t,
                            'sort_type': paramdict.get('CTYPE_KEY', '')
                        }
                    context.update(extracontext)
                    #user requested this, not auto-update. generate user specific html
                    for usc in sp:
                        if not usc.is_recursive:
                            retdiv = usc.div_id + str(li.pk)
                            renders.append({
                                'div':
                                retdiv,
                                'type':
                                usc.jquery_cmd,
                                'html':
                                usc.render(RequestContext(request, context))
                            })
                        else:
                            #if it's recursive we need to also render all the children USCs
                            recursive_list = usc.render(
                                RequestContext(request, context))
                            for html, pk in recursive_list:
                                renders.append({
                                    'div': usc.div_id + str(pk),
                                    'type': usc.jquery_cmd,
                                    'html': html
                                })
            memcache.set(
                str(key) + str(l.pk), (renders, cached_list, tot_items))
        else:
            renders, cached_list, tot_items = renders
        rendered_list.extend(renders)
        counts[rendertype] = tot_items
        #add usersaltcache if there is request data
        if request is not None:
            #Get Dybamic inputs not linked to a user
            lu = UserSaltCache.objects.filter(model_cache=lm.pk,
                                              object_specific=False,
                                              opposite=False,
                                              load_last=False,
                                              **kwargs)
            context = {
                'dimension': paramdict.get('DIM_KEY', None),
                'user': user,
                'phase': phase,
                'sort_type': paramdict.get('CTYPE_KEY', '')
            }
            if obj is not None:
                context.update({'object': obj, 'obj_pk': obj.pk})
            context.update(extracontext)
            for usc in lu:
                rendered_list.append({
                    'div':
                    usc.div_id,
                    'type':
                    usc.jquery_cmd,
                    'html':
                    usc.render(RequestContext(request, context))
                })

            #now add all the UserSaltCache objects from this page
            #THIS REQUIRES A REQUEST OBJECT FO' CSRF
            context = {
                'dimension': paramdict.get('DIM_KEY', None),
                'user': user,
                'phase': phase,
                'csrf_string': csrf_t,
                'sort_type': paramdict.get('CTYPE_KEY', '')
            }
            if obj is not None:
                context.update({'object': obj, 'obj_pk': obj.pk})
            context.update(extracontext)
            #for usc in u:
            #    rendered_list.append({'test': 'test', 'obj_pk': obj.pk, 'div': usc.div_id, 'type': usc.jquery_cmd, 'html':
            #                usc.render(RequestContext(request, context))})
            #load last for list caches
            lu = UserSaltCache.objects.filter(model_cache=lm.pk,
                                              load_last=True,
                                              **kwargs)
            for usc in lu:
                load_last.append({
                    'obj_pk':
                    obj.pk,
                    'div':
                    usc.div_id,
                    'type':
                    usc.jquery_cmd,
                    'html':
                    usc.render(RequestContext(request, context))
                })

        #USER SALT CACHCES WITH DYNAMIC RESPONSES ARE DONE
        if tot_items is not None:
            r = UserSaltCache.objects.filter(model_cache=lm.pk,
                                             div_id="#rangelist")
            for usc in r:
                rangelist = get_rangelist(paramdict.get('START_KEY', 0),
                                          paramdict.get('END_KEY', 20),
                                          tot_items)
                html = usc.render(
                    RequestContext(
                        request, {
                            'rangelist': rangelist,
                            'start': paramdict.get('START_KEY', 0),
                            'end': paramdict.get('END_KEY', 20),
                            'dimension': paramdict.get('DIM_KEY', None),
                            'object': obj,
                            'sort_type': paramdict.get('CTYPE_KEY', '')
                        }))
                rendered_list.append({
                    'div': '#pages',
                    'phase': phase,
                    'type': usc.jquery_cmd,
                    'html': html
                })
    if rendered_list == []:
        context = {
            'search': paramdict.get('SEARCH_KEY', ''),
            'dimension': paramdict.get('DIM_KEY', None),
            'user': user,
            'csrf_string': csrf_t,
            'template': rendertype
        }
        context.update(extracontext)
        context = RequestContext(request, context)
        if obj is not None:
            context['object'] = obj
        else:
            context['object'] = rendertype.replace('_', ' ')
        if rendertype != '':
            #first try for free floating usersaltcache forms...
            usc = UserSaltCache.objects.filter(template=rendertype + '.html')
            for u in usc:
                obj_pk = random.randint(-1000, 10000)
                rendered_list.append({
                    'div': u.div_id,
                    'type': u.jquery_cmd,
                    'obj_pk': obj_pk,
                    'html': u.render(context)
                })
                cached = UserSaltCache.objects.filter(model_cache=u.pk)
                for c in cached:
                    rendered_list.append({
                        'div': c.div_id,
                        'type': c.jquery_cmd,
                        'obj_pk': obj_pk,
                        'html': c.render(context)
                    })
            if rendered_list == []:
                context['request'] = request
                val = render_to_string(rendertype + '.html', context)
                if obj is not None:
                    rendered_list = [{
                        'div': '#pages',
                        'html': val,
                        'type': 'append',
                        'obj_pk': obj.pk
                    }]
                else:
                    rendered_list = [{
                        'div': '#pages',
                        'html': val,
                        'type': 'append'
                    }]

    #render all the user salt caches associated with this listindex.html#topics/_s0/_e20/_dh
    #i.e. the Sort By: is a user salt cache
    lu = UserSaltCache.objects.filter(opposite=True, **kwargs)
    if m is not None:
        #exclude if model is available
        lu = lu.exclude(model_cache=m.pk)
    for usc in lu:
        rendered_list.append({
            'div':
            usc.div_id,
            'obj_pk':
            obj_pk,
            'phase':
            phase,
            'type':
            usc.jquery_cmd,
            'html':
            usc.render({
                'request': request,
                'object': obj,
                'user': user
            })
        })
    if m is not None:
        r = UserSaltCache.objects.filter(model_cache=m.pk,
                                         load_last=True,
                                         **kwargs)
        context = {
            'dimension': dimension,
            'object': obj,
            'obj_pk': obj_pk,
            'sort_type': paramdict.get('CTYPE_KEY', '')
        }
        context.update(extracontext)
        for usc in r:
            html = usc.render(RequestContext(request, context))
            rendered_list.append({
                'div': usc.div_id,
                'phase': phase,
                'type': usc.jquery_cmd,
                'html': html
            })
    rendered_list.extend(load_last)
    return {
        'counts': counts,
        'object': obj,
        'rendered_list': rendered_list,
        'paramdict': paramdict,
        'render': render,
        'scroll_to': scroll_to,
        'rendertype': rendertype
    }