source: products/quintagroup.plonegooglesitemaps/branches/blacklist/quintagroup/plonegooglesitemaps/browser/commonview.py @ 2940

Last change on this file since 2940 was 2940, checked in by mylan, 14 years ago

#228: Fix filter naming overhead, fix tests

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1from string import find
2from zope.interface import implements, Interface, Attribute
3from zope.component import queryMultiAdapter
4
5from Acquisition import aq_inner, aq_parent
6from Products.Five import BrowserView
7from Products.CMFCore.utils import getToolByName
8
9from quintagroup.plonegooglesitemaps import qPloneGoogleSitemapsMessageFactory as _
10from quintagroup.plonegooglesitemaps.interfaces import IBlackoutFilter
11from quintagroup.plonegooglesitemaps.browser.utils import additionalURLs, applyOperations
12
13
14class ISitemapView(Interface):
15    """
16    Sitemap view interface
17    """
18
19    def results():
20        """ Return list of dictionary objects
21            which confirm Sitemap conditions
22        """
23
24    def getAdditionalURLs():
25        """ Return additional URL list
26        """
27
28    def updateRequest():
29        """ Add compression header to RESPONSE
30            if allowed
31        """
32
33    numEntries = Attribute("Return number of entries")
34
35class CommonSitemapView(BrowserView):
36    """
37    Sitemap browser view
38    """
39    implements(ISitemapView)
40
41    # key, function map for extend return results
42    # with mapping data
43    additional_maps = ()
44
45
46    def __init__(self, context, request):
47        self.context = context
48        self.request = request
49
50    @property
51    def portal_catalog(self):
52        return getToolByName(self.context, 'portal_catalog')
53
54    @property
55    def portal(self):
56        return getToolByName(self.context, 'portal_url').getPortalObject()
57
58    @property
59    def search_path(self):
60        return '/'.join(aq_parent(aq_inner(self.context)).getPhysicalPath())
61
62    def getFilteredObjects(self):
63        """ Return brains
64        """
65        return []
66
67    def results(self):
68        """ Prepare mapping for template
69        """
70        result = []
71        objects = self.getFilteredObjects()
72        reg_exps = self.context.getReg_exp()
73
74        brain_url_map = applyOperations(self.getBOFiltered(objects), reg_exps)
75        # Prepare dictionary for view
76        for url, b in brain_url_map.items():
77            res_map = {'url' : url,}
78            [res_map.update({k : f(b)}) for k, f in self.additional_maps]
79            result.append(res_map)
80        self.num_entries = len(result)
81        return result
82
83    def getBOFiltered(self, objects):
84        """Return blkack-out filtered objects
85          Every record in blackout_list filter should follow the spec:
86             [extra filter data, separated by ':':][<filter name>:]<filter data>
87          For example:
88          1|  index.html
89          2|  id:index.html
90          3|  path:/folder_1_level/obj_in_folder
91          4|  path:./folder_near_sitemap/obj_in_folder
92          5|  extra_arg1:extra_arg2:super_filter:super arg-1, super arg-2
93         
94          1->used default "id" filter - remove "index.html" objects;
95          2->explicit "id" filter - remove "index.html" objects;
96          3->"path" filter - remove /folder_1_level/obj_in_folder object,
97              path from the root of the plone site;
98          4->same to 3), but path get from the folder, where sitemap is located;
99          5->filter name is "super_filter" (must be registered IBlackoutFilterUtility,
100             named "seoptimzier.blackoutfilter.super_filter:), which get list of extra
101             parameters, e.g. [extra_arg1,extra_arg2] to the filterOut method in
102             "extras" option, and get filter arguments: super arg-1, super arg-2
103         
104          class SuperFilterUtility(object):
105              def filterOut(self, fdata, fargs, **kwargs):
106                  sitemap = kwargs.get("sitemap")
107                  extras = kwargs.get("extras") # [extra_arg1,extra_arg2]
108                  # some logic to filter-out fdata by fargs with taking into
109                  # consideration extras ...
110        """
111        blackout_list = filter(None, self.context.getBlackout_list())
112        for frec in blackout_list:
113            fspec = frec.split(":")
114            fargs = fspec.pop()
115            fname = fspec and fspec.pop() or "id"
116            fengine = queryMultiAdapter((self.context, self.request),
117                          interface=IBlackoutFilter, name=fname)
118            if fengine:
119                objects = fengine.filterOut(objects, fargs)
120        return objects
121
122    def updateRequest(self):
123        self.request.RESPONSE.setHeader('Content-Type', 'text/xml')
124        try:
125            compression = self.context.enableHTTPCompression()
126            if compression:
127                compression(request=self.request)
128        except:
129            pass
130
131    def getAdditionalURLs(self):
132        return additionalURLs(self.context)
133
134    @property
135    def numEntries(self):
136        return len(self.results()) + len(self.getAdditionalURLs())
Note: See TracBrowser for help on using the repository browser.