source: products/quintagroup.canonicalpath/trunk/quintagroup/canonicalpath/upgrades.py @ 3145

Last change on this file since 3145 was 3145, checked in by vmaksymiv, 13 years ago

pep8 fixes

  • Property svn:eol-style set to native
File size: 4.5 KB
Line 
1import sys
2from types import StringTypes
3from logging import NOTSET, DEBUG, INFO, ERROR
4from logging import Logger, StreamHandler, Formatter
5from StringIO import StringIO
6from zope.component import getAdapter
7from Acquisition import aq_base, aq_inner
8
9from quintagroup.canonicalpath.interfaces  import ICanonicalPath
10from quintagroup.canonicalpath.interfaces  import ICanonicalLink
11from quintagroup.canonicalpath.adapters import PROPERTY_LINK
12from quintagroup.canonicalpath.adapters import PROPERTY_PATH
13from quintagroup.canonicalpath.adapters import DefaultPropertyAdapter
14
15
16class CanonicalConvertor(object):
17    """Convert canonical link to canonical path and vice versa."""
18
19    def __init__(self, portal_url):
20        """Create instanse of convertor.
21           - *portal_url* (string), add in the front of canonical path property
22             value for get canonical link.
23           - *logger_name* - name of the logger
24        """
25        self._initLogger()
26        self.portal_url = portal_url
27
28    # General APIs
29    def getLogs(self):
30        self._inout.flush()
31        return self._inout.getvalue()
32
33    def cleanupLogs(self):
34        self._inout = StringIO()
35
36    def convertILinkToPath(self, obj):
37        """Convert canonical link to canonical path"""
38        return self._convert(obj, ICanonicalLink, ICanonicalPath,
39                             self._convertL2P)
40
41    def convertIPathToLink(self, obj):
42        """Convert canonical path to canonical link"""
43        return self._convert(obj, ICanonicalPath, ICanonicalLink,
44                             self._convertP2L)
45
46    def convertPLinkToPath(self, obj, prop=PROPERTY_LINK):
47        """Convert canonical link, got from the *prop* parameter
48           to canonical path.
49        """
50        return self._convert(obj, prop, ICanonicalPath,
51                             self._convertL2P)
52
53    def convertPPathToLink(self, obj, prop=PROPERTY_PATH):
54        """Convert canonical path, got from the *prop* parameter
55           to canonical link.
56        """
57        return self._convert(obj, prop, ICanonicalLink,
58                             self._convertP2L)
59
60    # Service methods
61    def _convert(self, obj, src_iface, dst_iface, converter):
62        """Convert canonical from source canonical interface
63           to destination canonical interface.
64
65           Return True is successfull, False otherwise.
66           Log results in logger.
67        """
68        src_msg = type(src_iface) in StringTypes and src_iface \
69                                                 or src_iface.__name__
70        msg = "Migrate %s into %s for %s object: " \
71               % (src_msg, dst_iface.__name__, obj.absolute_url())
72        try:
73            src = self._getOrMakeAdapter(obj, src_iface)
74            dst = getAdapter(obj, dst_iface)
75            # XXX: Check is this correct work XXX
76            obj = aq_base(aq_inner(obj))
77            # XXX
78            converter(src, dst)
79        except Exception:
80            import sys
81            et, em, etr = map(str, sys.exc_info())
82            lev = ERROR
83            msg += "ERROR: %s: %s" % (et, em)
84        else:
85            lev = INFO
86            msg += "SUCCESS"
87        self._logger.log(lev, msg)
88
89        return lev == INFO and True or False
90
91    def _getOrMakeAdapter(self, obj, arg):
92        """Function return adapter for process of the property.
93           Adapter get by interface(if arg is not a string - interface assumed)
94           OR if arg is string - adapter created from DefaultCanonicalAdapter.
95        """
96        if type(arg) in StringTypes:
97            adapter = DefaultPropertyAdapter(obj)
98            adapter.prop = arg
99            return adapter
100        else:
101            return getAdapter(obj, arg)
102
103    def _convertP2L(self, src, dst):
104        """Convert canonical path to canonical link."""
105        cpath = src.getProp()
106        cpath = cpath.startswith('/') and cpath or '/' + cpath
107        dst.canonical_link = self.portal_url + cpath
108        src.delProp()
109
110    def _convertL2P(self, src, dst):
111        """Convert canonical link to canonical path."""
112        raise NotImplementedError(
113            "Convertion from canonical link to canonical path not implemented")
114
115    def _initLogger(self):
116        self._inout = StringIO()
117        handler = StreamHandler(self._inout)
118        handler.setLevel(DEBUG)
119        formatter = Formatter(fmt="[%(asctime)s]: %(message)s",
120                                      datefmt="%H:%M:%S")
121        handler.setFormatter(formatter)
122        self._logger = Logger("quintagroup.canonicalpath", NOTSET)
123        self._logger.addHandler(handler)
Note: See TracBrowser for help on using the repository browser.