source: products/qTopic/trunk/qTopic.py @ 3565

Last change on this file since 3565 was 1, checked in by myroslav, 18 years ago

Building directory structure

File size: 8.4 KB
Line 
1from locale import strcoll
2from Products.CMFCore import CMFCorePermissions
3from Products.CMFCore.utils import getToolByName
4from AccessControl import ClassSecurityInfo
5from Acquisition import aq_parent, aq_inner
6
7from Products.ATContentTypes.content.base import updateActions
8from Products.ATContentTypes.content.topic import ATTopic, IGNORED_FIELDS
9from Products.ATContentTypes.interfaces import IATTopic
10from Products.ATContentTypes.types.criteria import _criterionRegistry
11from Products.ATContentTypes.permission import ChangeTopics, AddTopics
12from Products.CMFCore.permissions import View
13from Products.ATContentTypes.content.topic import ATTopicSchema
14from Products.ATContentTypes.interfaces import IATTopicSearchCriterion, IATTopicSortCriterion
15from Products.Archetypes.public import *
16from config import *
17from Products.CMFPlone.PloneBatch import Batch
18from Products.ATContentTypes.config import TOOLNAME
19from StringIO import StringIO
20from csv import DictWriter
21import csv
22
23qTopic_schema = ATTopicSchema.copy() + Schema((
24          StringField("catalog",
25                       default = "portal_catalog",
26                       vocabulary = "getCatalogList",
27                       widget = SelectionWidget(label="Catalog",
28                                       label_msgid="label_catalog",
29                                       description="Select catalog to query",
30                                       description_msgid="description_catalog")
31          ),
32          BooleanField("showHeader",
33                      schemata = "export",
34                      default = 1,
35                      widget = BooleanWidget(label="Print field headers",
36                                             label_msgid="label_print_headers",
37                                             description="Check if headers need to be printed",
38                                             description_msgid="description_print_headers")
39          ),
40          StringField("delimiter",
41                      default = ";",
42                      schemata = "export",
43                      widget = StringWidget(label="Values delimiter",
44                                            label_msgid="label_delimiter",
45                                            description="Select delimiter to be used in CSV",
46                                            description_msgid="description_delimiter",
47                                            size = 4)
48          ),
49          ))
50qTopic_schema["customViewFields"].schemata = "export"
51qTopic_schema["customViewFields"].vocabulary = "listMetaDataFields"
52qTopic_schema["customViewFields"].default=("id","getFullName","getEmail")
53
54class qTopic(ATTopic):
55    """A topic folder"""
56    meta_type      = "qTopic"
57    portal_type    = "qTopic"
58    archetype_name = "qTopic"
59    typeDescription= ("qTopic is the same topic but with "+
60                      "option of catlog selection")
61    typeDescMsgId  = "description_edit_topic"
62
63    schema = qTopic_schema
64    security       = ClassSecurityInfo()
65    actions = updateActions(ATTopic,
66        (
67        {
68        "id"          : "export_csv",
69        "name"        : "Export in CSV",
70        "action"      : "string:${folder_url}/result_csv",
71        "permissions" : (CMFCorePermissions.View,)
72        },
73       )
74    )
75
76    def getCatalogList(self):
77        """ return list of catalog ids
78        """
79        at_tool = getToolByName(self, "archetype_tool")
80        catalogs = at_tool.getCatalogsInSite()
81        return  DisplayList(zip(catalogs, catalogs))
82
83    security.declareProtected(ChangeTopics, "criteriaByIndexId")
84    def criteriaByIndexId(self, indexId):
85        """ get createrias by index """
86        catalog_tool = getToolByName(self, self.getCatalog())
87        indexObj = catalog_tool.Indexes[indexId]
88        results = _criterionRegistry.criteriaByIndex(indexObj.meta_type)
89        return results
90
91    security.declareProtected(View, 'allowedCriteriaForField')
92    def allowedCriteriaForField(self, field, display_list=False):
93        """ Return all valid criteria for a given field.  Optionally include
94            descriptions in list in format [(desc1, val1) , (desc2, val2)] for
95            javascript selector."""
96        tool = getToolByName(self, self.getCatalog())
97        criteria = _criterionRegistry.listTypes()
98        allowed = [crit for crit in criteria
99                                if crit in self.criteriaByIndexId(field)]
100        if display_list:
101            flat = []
102            for a in allowed:
103                desc = _criterionRegistry[a].shortDesc
104                flat.append((a,desc))
105            allowed = DisplayList(flat)
106        return allowed
107
108    security.declareProtected(ChangeTopics, "listFields")
109    def listFields(self):
110        """Return a list of fields from portal_catalog.
111        """
112        tool = getToolByName(self, TOOLNAME)
113        return tool.getEnabledFields(catalog_name=self.getCatalog())
114
115    security.declareProtected(ChangeTopics, 'listAvailableFields')
116    def listAvailableFields(self):
117        """Return a list of available fields for new criteria.
118        """
119        return self.listFields()
120   
121    security.declareProtected(View, 'listMetaDataFields')
122    def listMetaDataFields(self, exclude=True):
123        """Return a list of metadata fields from portal_catalog.
124        """
125        tool = getToolByName(self, TOOLNAME)
126        catalog_name=self.getCatalog()
127        return tool.getMetadataDisplay(exclude,catalog_name=catalog_name)
128
129    security.declareProtected(CMFCorePermissions.View, "queryCatalog")
130    def queryCatalog(self, REQUEST=None, batch=False, b_size=None,
131                                                    full_objects=False, **kw):
132        """Invoke the catalog using our criteria to augment any passed
133            in query before calling the catalog.
134        """
135        if REQUEST is None:
136            REQUEST = getattr(self, 'REQUEST', {})
137        b_start = REQUEST.get('b_start', 0)
138
139        q = self.buildQuery()
140        if q is None:
141            # empty query - do not show anything
142            if batch:
143                return Batch([], 20, int(b_start), orphan=0)
144            return []
145        # Allow parameters to further limit existing criterias
146        for k,v in q.items():
147            if kw.has_key(k):
148                arg = kw.get(k)
149                if isinstance(arg, (ListType,TupleType)) and isinstance(v, (ListType,TupleType)):
150                    kw[k] = [x for x in arg if x in v]
151                elif isinstance(arg, StringType) and isinstance(v, (ListType,TupleType)) and arg in v:
152                    kw[k] = [arg]
153                else:
154                    kw[k]=v
155            else:
156                kw[k]=v
157        #kw.update(q)
158        pcatalog = getToolByName(self, self.getCatalog())
159        limit = self.getLimitNumber()
160        max_items = self.getItemCount()
161        # Batch based on limit size if b_szie is unspecified
162        if max_items and b_size is None:
163            b_size = int(max_items)
164        else:
165            b_size = 20
166        if limit and max_items and self.hasSortCriterion():
167            # Sort limit helps Zope 2.6.1+ to do a faster query
168            # sorting when sort is involved
169            # See: http://zope.org/Members/Caseman/ZCatalog_for_2.6.1
170            kw.setdefault('sort_limit', max_items)
171        __traceback_info__ = (self, kw,)
172        results = pcatalog.searchResults(REQUEST, **kw)
173        if full_objects and not limit:
174            results = [b.getObject() for b in results]
175        if batch:
176            batch = Batch(results, b_size, int(b_start), orphan=0)
177            return batch
178        if limit:
179            if full_objects:
180                return [b.getObject() for b in results[:max_items]]
181            return results[:max_items]
182        return results
183
184    def toCSV(self, fields, data):
185        dialect = csv.excel()
186        dialect.delimiter = self.getDelimiter()
187        buffer = StringIO()
188        writer = DictWriter(buffer, fieldnames=fields, dialect=dialect)
189        if self.getShowHeader():
190            writer.writerow(dict(zip(fields, fields)))
191        writer.writerows(data)
192        return buffer.getvalue()
193
194
195registerType(qTopic, PROJECTNAME)
196
197def modify_fti(fti):
198    """Remove folderlisting action
199    """
200    actions = []
201    fti['allowed_content_types'] = ('qTopic',)
202    fti['filter_content_types'] = 1
203    for action in fti["actions"]:
204        if action["id"] == "folderlisting":
205                action["visible"] = False
206                #actions.append(action)
207    #fti["actions"] = tuple(actions)
Note: See TracBrowser for help on using the repository browser.