Пример #1
0
    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)
Пример #3
0
    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
Пример #4
0
 def get_table_fields(self):
     return get_topic_table_fields(self.topic, self.portal_catalog)