def addDataSource(self, name, props=[]):
     ''' create a new datasource class '''
     self.is_datasource = True
     self.classname = name
     self.properties = props
     self.helper = ClassHelper(self.classname, self.compname, self.zenpackbase, self.zenpackroot)
     self.getClassData()
 def addDataSource(self, name, props=[]):
     '''
         collect datasource info
         
     '''
     self.is_datasource = True
     self.classname = name
     self.properties = props
     self.helper = ClassHelper(self.classname, self.zenpackbase, self.zenpackroot)
     self.getClassData()
 def addComponent(self, name, singular, plural, manual=False, props=[]):
     ''' create a new component class '''
     self.is_datasource = False
     self.classname = name
     self.singular = singular
     self.plural = plural
     self.manual = manual
     self.baseid = self.classname.lower()
     self.jsname = self.baseid
     self.properties = props
     self.override = ''
     # component relation
     self.relname = "%s%ss" % (self.baseid[:1], self.classname[1:])
     self.helper = ClassHelper(self.classname, self.compname, self.zenpackbase, self.zenpackroot)
     self.getClassData()
     self.buildAddMethods(self.indent)
class Prototype(object):
    '''
        generates and holds all class info prior to class building
    '''
    template = Template()
    add_method = template.ADDMETHOD
    create_method = template.CREATEMETHOD
    facade_method = template.FACADEMETHOD
    ifacade_method = template.IFACADEMETHOD
    router_method = template.ROUTERMETHOD
    override = ''
    
    def __init__(self, root, base, compname, indent=4*' '):
        ''''''
        self.zenpackroot = root
        self.zenpackbase = base
        self.indent = indent
        self.compname = compname
        self.zenpackname = "%s.%s" % (root, base)
        self.relmgr = None
        self.classdata = {'parents' : [CustomComponent], 'class': {},
                          'info': {}, 'interface': {}, 'facade': {},
                          'ifacade': {}, 'router': {}, 'adapter': {},
                          '_properties': [], 'infotext': {}, 'configure': [],
                          }
        
        if self.compname == 'hw':  self.classdata['parents'] = [CustomHWComponent]
        self.methods = {
                   'create': {'name': None, 'text': None},
                   'add': {'name': None, 'text': None},
                   'facade': {'name': None, 'text': None},
                   'ifacade': {'name': None, 'text': None},
                   'router': {'name': None, 'text': None},
                   'volcab': {'name': None, 'text': None},
                   }
    
    def addComponent(self, name, singular, plural, manual=False, props=[]):
        ''' create a new component class '''
        self.is_datasource = False
        self.classname = name
        self.singular = singular
        self.plural = plural
        self.manual = manual
        self.baseid = self.classname.lower()
        self.jsname = self.baseid
        self.properties = props
        self.override = ''
        # component relation
        self.relname = "%s%ss" % (self.baseid[:1], self.classname[1:])
        self.helper = ClassHelper(self.classname, self.compname, self.zenpackbase, self.zenpackroot)
        self.getClassData()
        self.buildAddMethods(self.indent)
    
    def addDataSource(self, name, props=[]):
        ''' create a new datasource class '''
        self.is_datasource = True
        self.classname = name
        self.properties = props
        self.helper = ClassHelper(self.classname, self.compname, self.zenpackbase, self.zenpackroot)
        self.getClassData()
        
    def buildAddMethods(self, indent):
        ''' build the various add_component methods for GUI management'''
        basic_name = "add%s" % self.classname
        basic_text = self.add_method % (self.zenpackname, self.classname, 
                                        self.classname,self.baseid,
                                        self.classname, self.compname,
                                        self.relname, self.override)
        # create method
        self.methods['create'] = {'name' : basic_name, 'text' : basic_text }
        # device "manage_addComponent" method
        add_name = "manage_%s" % basic_name
        add_text = self.create_method  % (add_name, basic_text)
        self.methods['add'] = {'name' : add_name, 'text' : add_text}
        # facade "manage_addComponent" method
        facade_name = basic_name
        facade_text = self.facade_method % (facade_name, basic_text, self.singular)
        self.methods['facade'] = {'name' : facade_name, 'text' : facade_text}
        self.classdata['facade'] = self.methods['facade']
        # ifacade method
        ifacade_name = basic_name
        self.methods['ifacade'] = {'name' : ifacade_name, 'text' : self.ifacade_method % ifacade_name}
        self.classdata['ifacade'] = self.methods['ifacade']
        # router method
        router_name = "%sRouter" % basic_name
        self.methods['router'] = {'name' : router_name, 'text' : self.router_method % (router_name, basic_name)}
        self.classdata['router'] = self.methods['router']
    
    def getClassData(self):
        ''' set class info attributes '''
        for p in self.properties:
            # skip if this is a datasource property/method
            if self.is_datasource is True and p.isMethod is True : continue
            # for properties that are actually methods with a drop-down 
            if p.isMethod is True and p.ptype == 'selection':
                vocref = '%s%s' % (self.classname, p.methodName)
                vocname = "%s%sVocabulary" % (self.classname,p.methodName)
                data = p.get_chooser(vocname, vocref, self.template.COMPONENT_VOLCABULARY_METHOD)
                for k in data.keys(): self.classdata[k].update(data[k])
                self.classdata['configure'] = self.template.CONFIGURE_COMPONENT_VOLCABULARY % (vocname, vocref)
            # for getting/setting product class
            elif p.title == 'Product Class':
                #print "PRODUCT CLASS: %s"  % p.title
                data = p.get_product()
                for k in data.keys(): self.classdata[k].update(data[k])
            # refer to pass-through for password
            elif p.ptype == 'password':
                data = p.get_password()
                for k in data.keys(): self.classdata[k].update(data[k])
            # for all other properties that should be visible in component grid
            else:
                if p.visible is True:
                    self.classdata['info'][p.id] =  p.get_info()
                    self.classdata['interface'][p.id] = p.get_interface()
            self.classdata['class'][p.id] = p.get_classattribute(self.is_datasource)
            self.classdata['_properties'].append(p.get_classproperty(self.is_datasource))
            if p.get_override() is not None:  self.override +=  "%s%s" % (self.indent,p.get_override())
    
    def getHelper(self):
        ''' build component and datasource classes '''
        log.debug( "building %s" % self.helper.classname)
        if self.is_datasource is False:
            #log.debug( self.classdata['class'])
            self.helper.componentClass(self.classdata['parents'], self.classdata['class'])
            self.helper.classobject._relations += tuple(self.relmgr.fromrelations)
            self.helper.classobject._properties += tuple(self.classdata['_properties'])
            
            self.helper.classobject.factory_type_information = (
                {
                    'id'             : '%s' % self.classname,
                    'meta_type'      : '%s' % self.classname,
                    'description'    : """Arbitrary device grouping class""",
                    'icon'           : 'FileSystem_icon.gif',
                    'product'        : '%s' % self.zenpackbase,
                    'factory'        : '%s'  % self.methods['add']['name'],
                    'immediate_view' : 'view%s' % self.classname,
                    'actions'        :
                    (
                        { 'id'            : 'status'
                        , 'name'          : 'Status'
                        , 'action'        : 'view%s'  % self.classname
                        , 'permissions'   : (ZEN_VIEW,)
                        },
                        { 'id'            : 'events'
                        , 'name'          : 'Events'
                        , 'action'        : 'viewEvents'
                        , 'permissions'   : (ZEN_VIEW, )
                        },
                        { 'id'            : 'perfConf'
                        , 'name'          : 'Template'
                        , 'action'        : 'objTemplates'
                        , 'permissions'   : ("Change Device", )
                        },
                    )
                  },
                )
            # short-circuited this so that eventClass can be selectable
            #self.helper.classobject.isUserCreatedFlag = self.manual
            self.helper.classobject.isUserCreatedFlag = True
            self.helper.interfaceClass(self.classdata['interface'])            
            self.helper.infoClass(self.classdata['info'])
            self.helper.ifacadeClass(self.classdata['ifacade'])            
            self.helper.facadeClass(self.classdata['facade'])            
            self.helper.routerClass(self.classdata['router'])
            self.helper.addClassTextMethod(Device,self.methods['add']['name'], self.methods['add']['text'])
        else:
            self.classdata['class']['factory_type_information'] = ({'immediate_view' : 'edit%s' % self.classname,
                                                                    'actions' : ({
                                                                                  'id' : 'edit',
                                                                                  'name' : 'Data Source',
                                                                                  'action' : 'edit%s' % self.classname,
                                                                                  'permissions'   : ( Permissions.view, ),
                                                                                  },)
                                                                    },)
            self.helper.datasourceClass(self.classdata['class'])
            self.helper.classobject._properties += tuple(self.classdata['_properties'])
            self.helper.interfaceClass(self.classdata['interface'], True)            
            self.helper.infoClass(self.classdata['info'], True)