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
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
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
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
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}
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 }