def get_subtopics(self): stl = [] if self.context.hasSubtopics(): for sub_topic in self.context.listSubtopics(): fields = get_topic_table_fields(sub_topic, self.portal_catalog) results = sub_topic.queryCatalog() title = sub_topic.Title() description = sub_topic.Description() text = sub_topic.getText() size = sub_topic.getItemCount() id = sub_topic.id stl.append({'fields': fields, 'results': results, 'title': title, 'description': description, 'text': text, 'size': size, 'start':0, 'display_legend': False, 'id': 'topic-' + id}) return stl
def __call__(self): """ Return JSON for flexigrid, the query form looks like: {'getAgencies': '', 'rp': '15', 'sortname': 'Title', 'Title': '', 'getProject_status': '', 'getSubRegions': '', 'SearchableText': '', 'getProject_type': '', 'sortorder': 'asc', 'query': '', 'getBasin': '', 'qtype': 'getSubRegions', 'page': '1'} """ util = getToolByName(self.context, 'translation_service') form = self.request.form limit = int(form.get('rp', '15')) start = (int(form.get('page', '1')) - 1) * limit end = start + limit + 1 results = self._get_search_results() json_result= {"page":form.get('page', '1') , "total":len(results), "rows":[]} fields = get_topic_table_fields(self.context, self.portal_catalog) layout = getMultiAdapter((self.context, self.request), name=u'plone_layout') use_view_action = self.site_properties.typesUseViewActionInListings for result in results[start:end]: cell = [] icon = layout.getIcon(result) if icon.url: icon_snp = u'<img src="%s" alt="%s" title="%s" width="%i" height="%i" />'%( icon.url, icon.description, icon.title, icon.width, icon.height) else: icon_snp = '' for field in fields: value = getattr(result, field['name']) if type(value)==tuple: vt =[] for v in value: v = v.decode('utf-8', 'ignore').encode('ascii', 'xmlcharrefreplace') vt.append(v) value = vt elif type(value) in StringTypes: value = value.decode('utf-8', 'ignore').encode('ascii', 'xmlcharrefreplace') if not value: cell.append('') elif field['idx_type'] == 'DateIndex': dateval = util.ulocalized_time( value, context=self.context, domain='plonelocales', request=self.request) cell.append(dateval) elif field['name']=='Title': if result.portal_type in use_view_action: a = u'<a href="%s/view">%s %s</a>' else: a = u'<a href="%s">%s %s</a>' cell.append(a % (result.getURL(), icon_snp, value)) elif type(value)==tuple: cell.append(', '.join(getattr(result, field['name']))) else: cell.append(value) json_result['rows'].append( {"id":result.UID,"cell":cell}) self.request.RESPONSE.setHeader('Content-Type','application/json; charset=utf-8') return json.dumps(json_result)
def get_js(self): """{display: 'Title', name : 'Title', width : 220, sortable : true, align: 'left'}""" def is_sortable(sortname): if sortname in IDX_METADATA.keys(): return True elif sortname in self.portal_catalog.Indexes.keys(): if self.portal_catalog.Indexes[sortname].meta_type in [ 'FieldIndex', 'DateIndex', 'KeywordIndex']: return True return False def is_date(sortname): if sortname in IDX_METADATA and sortname !='Title': return True elif sortname in self.portal_catalog.Indexes.keys(): if self.portal_catalog.Indexes[sortname].meta_type in ['DateIndex']: return True return False fields = get_topic_table_fields(self.topic, self.portal_catalog) width=self.flexitopic_width height=self.flexitopic_height i_date = 0 for field in fields: if is_date(field['name']): i_date += 1 date_fields_width = DATE_FIELD_WIDTH * i_date if len(fields) > i_date: field_width=int( (width - date_fields_width - 18 - (len(fields) * FG_PADDING_WIDTH))/ (len(fields)-i_date)) else: field_width = DATE_FIELD_WIDTH t = "{display: '%s', name : '%s', width : %i, sortable : %s, align: 'left', hide: false}" tl = [] for field in fields: this_field_width = 0 if is_date(field['name']): this_field_width = DATE_FIELD_WIDTH else: this_field_width = field_width if is_sortable(field['name']): sortable='true' else: sortable='false' tl.append( t % (self.context.translate(_(field['label'])), field['idx_name'], this_field_width, sortable)) sort = '' if hasattr(self.topic, 'listCriteria'): #old style collection for criterion in self.topic.listCriteria(): if criterion.meta_type =='ATSortCriterion': sortname = criterion.getCriteriaItems()[0][1] sortorder = 'asc' if len(criterion.getCriteriaItems())==2: if criterion.getCriteriaItems()[1][1] =='reverse': sortorder = 'desc' sort = "sortname: '%s', sortorder: '%s'," % ( sortname, sortorder) elif hasattr(self.topic, 'getSort_on'): #new style collection sortname = self.topic.getSort_on() sortorder = 'asc' if self.topic.getSort_reversed(): sortorder = 'desc' else: sortorder = 'asc' sort = "sortname: '%s', sortorder: '%s'," % ( sortname, sortorder) table_name = self.topic.Title() url = self.topic.absolute_url() + '/@@flexijson_view' add_form_data_js = self.add_form_data_js % self.topic.absolute_url() js = self.js_template % { 'url': url, 'col_model': ', '.join(tl), 'sort': sort, 'title': table_name, 'items_ppage': self.items_ppage, 'add_js': add_form_data_js, 'width': width, 'height': height, } return js
def get_table_fields(self): return get_topic_table_fields(self.topic, self.portal_catalog)