1from PythonGenerator import PythonGenerator
2from PythonGenerator import Klass as SuperKlass
3
4
5class SQLPythonGenerator(PythonGenerator):
6    pass
7
8
9class Klass(object):
10
11    def writePyImports(self):
12        SuperKlass.writePyImports.im_func(self)  # invoke our super generator's method
13        # @@ 2000-11-22 ce: the above is pretty hacky;
14        # invoking super is the only awkward aspect of mix-ins that hasn't been solved
15        self._pyOut.write('from MiddleKit.Run.SQLObjectStore import ObjRefError\n\n')
16
17
18class ObjRefAttr(object):
19
20    def writePyGet(self, out):
21        name = self.name()
22        pyGetName = self.pyGetName()
23        klassName = self.klass().name()
24        out.write('''
25    def %(pyGetName)s(self):
26        if self._%(name)s is not None and not isinstance(self._%(name)s, MiddleObject):
27            try:
28                self.__dict__['_%(name)s'] = self._mk_store.fetchObjRef(self._%(name)s)
29            except ObjRefError as e:
30                self.__dict__['_%(name)s'] = self.objRefErrorWasRaised(e, %(klassName)r, %(name)r)
31        return self._%(name)s
32''' % locals())
33
34
35class ListAttr(object):
36
37    def writePyGet(self, out, names):
38        if self.setting('UseBigIntObjRefColumns', False):
39            out.write('''
40    def %(pyGetName)s(self):
41        if self._%(name)s is None:
42            from %(package)s%(targetClassName)s import %(targetClassName)s
43            self._%(name)s = self._mk_store.fetchObjectsOfClass(%(targetClassName)s, clauses='where %(backRefAttrName)sId=%%i' %% self.sqlObjRef())
44        return self._%(name)s
45''' % names)
46        else:
47            classIdSuffix, objIdSuffix = self.setting('ObjRefSuffixes')
48            names.update(locals())
49            out.write('''
50    def %(pyGetName)s(self):
51        if self._%(name)s is None:
52            from %(package)s%(targetClassName)s import %(targetClassName)s
53            self._%(name)s = self._mk_store.fetchObjectsOfClass(%(targetClassName)s, clauses='where %(backRefAttrName)s%(classIdSuffix)s=%%i and %(backRefAttrName)s%(objIdSuffix)s=%%i' %% (self.klass().id(), self.serialNum()))
54        return self._%(name)s
55''' % names)
56        if self.setting('AccessorStyle', 'methods') == 'properties':
57            out.write('''
58    %(name)s = property(%(pyGetName)s)
59''' % names)
60