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

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

#228: Remake filter utility to multiadapter, fix tests

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