def gsprofilecssregistry(self, source, target): """Create cssregistry.xml """ package = target.anchor default = package['profiles']['default'] # read or create cssregistry.xml if 'cssregistry.xml' in default: cssregistry = default['cssregistry.xml'] else: cssregistry = default['cssregistry.xml'] = DTMLTemplate() # set template used for cssregistry.xml cssregistry.template = 'agx.generator.plone:templates/cssregistry.xml' # set template params egg_name = egg_source(source).name cssregistry.params['css'] = [{ 'title': '%s main CSS' % egg_name, 'cacheable': 'True', 'compression': 'save', 'cookable': 'True', 'enabled': '1', 'expression': '', 'id': '++resource++%s/main.css' % egg_name, 'media': 'all', 'rel': 'stylesheet', 'rendering': 'import', }]
def gsprofilejsregistry(self, source, target): """Create jsregistry.xml """ package = target.anchor default = package['profiles']['default'] # read or create jsregistry.xml if 'jsregistry.xml' in default: jsregistry = default['jsregistry.xml'] else: jsregistry = default['jsregistry.xml'] = DTMLTemplate() # set template used for jsregistry.xml jsregistry.template = 'agx.generator.plone:templates/jsregistry.xml' # set template params egg_name = egg_source(source).name jsregistry.params['scripts'] = [{ 'cacheable': 'True', 'compression': 'safe', 'cookable': 'True', 'enabled': 'True', 'expression': '', 'id': '++resource++%s/main.js' % egg_name, 'inline': 'False', }]
def resourceregistries(self, source, target): """Create main.css and main.js file in resources directory. Runs after browser.zcml has been created. """ egg = egg_source(source) eggname = egg.name targetdir = read_target_node(source, target.target) resources = targetdir['resources'] resources.factories['main.css'] = DTMLTemplate resources.factories['main.js'] = DTMLTemplate if not 'main.css' in resources: css = resources['main.css'] = DTMLTemplate() else: css = resources['main.css'] css.template = 'agx.generator.plone:templates/main.css.dtml' css.params['project'] = eggname css.SECTION_BEGIN = '/* code-section' css.SECTION_END = '/* /code-section' css.SECTION_POSTFIX = ' */' if not 'main.js' in resources: js = resources['main.js'] = DTMLTemplate() else: js = resources['main.js'] js.template = 'agx.generator.plone:templates/main.js.dtml' js.params['project'] = eggname js.SECTION_BEGIN = '// code-section' js.SECTION_END = '// /code-section' js.SECTION_POSTFIX = ''
def resourcedirectory(self, source, target): """Create resource directory and register in ZCML. """ egg = egg_source(source) eggname = egg.name targetdir = read_target_node(source, target.target) if 'resources' not in targetdir.keys(): targetdir['resources'] = Directory() path = targetdir.path path.append('browser.zcml') fullpath = os.path.join(*path) if 'browser.zcml' not in targetdir: zcml = ZCMLFile(fullpath) zcml.nsmap['browser'] = 'http://namespaces.zope.org/browser' targetdir['browser.zcml'] = zcml else: zcml = targetdir['browser.zcml'] addZcmlRef(targetdir, zcml) # add the resourceDirectory stmt zcautils.set_zcml_directive(targetdir, 'browser.zcml', 'include', 'package', "zope.browserresource", file="meta.zcml") if not zcml.filter( tag='browser:resourceDirectory', attr='name', value=eggname): directory = SimpleDirective(name='browser:resourceDirectory', parent=zcml) directory.attrs['name'] = eggname directory.attrs['directory'] = 'resources'
def behaviorschema(self, source, target): schema = read_target_node(source, target.target) module = schema.parent # check whether this behavior has schema attributes if not 'form.Schema' in schema.bases: schema.bases.append('form.Schema') alsoprovides = "alsoProvides(%s, form.IFormFieldProvider)" \ % schema.classname alsoprovides_exists = False for block in module.blocks(): for line in block.lines: if line == alsoprovides: alsoprovides_exists = True block = python.Block() block.__name__ = str(uuid.uuid4()) if not alsoprovides_exists: block.lines.append(alsoprovides) if block.lines: module.insertafter(block, schema) egg = egg_source(source) imp = Imports(schema.parent) imp.set(egg.name, [['_', None]]) imp.set('plone.directives', [['form', None]]) imp.set('zope.interface', [['alsoProvides', None]])
def resourcedirectory(self, source, target): """Create resource directory and register in ZCML. """ egg = egg_source(source) eggname = egg.name targetdir = read_target_node(source, target.target) if 'resources' not in targetdir.keys(): targetdir['resources'] = Directory() path = targetdir.path path.append('browser.zcml') fullpath = os.path.join(*path) if 'browser.zcml' not in targetdir: zcml = ZCMLFile(fullpath) zcml.nsmap['browser'] = 'http://namespaces.zope.org/browser' targetdir['browser.zcml'] = zcml else: zcml = targetdir['browser.zcml'] addZcmlRef(targetdir, zcml) # add the resourceDirectory stmt zcautils.set_zcml_directive(targetdir, 'browser.zcml', 'include', 'package', "zope.browserresource", file="meta.zcml") if not zcml.filter( tag='browser:resourceDirectory', attr='name', value=eggname): directory = SimpleDirective( name='browser:resourceDirectory', parent=zcml) directory.attrs['name'] = eggname directory.attrs['directory'] = 'resources'
def gscomposition(self, source, target): # get container. ownedEnds len should always be 1 container = source.ownedEnds[0].type class_ = read_target_node(container, target.target) # lookup child from memberEnds child = None for member in source.memberEnds: if member.type is not container: child = member.type break # self containment if child is None: child = container # both end types need to be content types if not container.stereotype('plone:content_type') \ or not child.stereotype('plone:content_type'): return # read fti and append allowed content type container_name = type_id(container, target.target) child_name = type_id(child, target.target) egg = egg_source(source) package = read_target_node(egg, target.target) default = package['profiles']['default'] name = '%s.xml' % container_name fti = default['types'][name] fti.params['ctype']['allowed_content_types'].append(child_name) # otherwise the class name is already set if token(str(class_.uuid), False, dont_generate=False).dont_generate: fti.params['ctype']['klass'] = 'plone.dexterity.content.Container'
def make_generators(self, source, target): if source.stereotype('pyegg:stub'): return egg = egg_source(source) eggtarget = read_target_node(egg, target.target) zcml = get_zcml(eggtarget, 'configure.zcml', nsmap={None: 'http://namespaces.zope.org/zope', 'agx': 'http://namespaces.zope.org/agx'}) tgv = TaggedValues(source) # if transform isnt specified as tgv, get it from dependency relations to # other generators transform = tgv.direct('transform', 'generator:generator', None) if not transform: transforms = token(str(source.uuid), True, transforms=[]).transforms if len(transforms) > 1: msg = 'Currently only one transform per generator allowed (%s)' msg = msg % source.name raise ValueError(msg) elif len(transforms) == 1: transform = transforms[0].name if not transform: transform = 'uml2fs' # if depends isnt specified as tgv, get it from dependency relations to # transforms depend = tgv.direct('depends', 'generator:generator', None) if not depend: depends = token(str(source.uuid), True, depends_on=[]).depends_on if len(depends) > 1: msg = 'Currently only one depends per generator allowed (%s)' msg = msg % source.name raise ValueError(msg) elif len(depends) == 1: depend = depends[0].name if not depend: depend = 'NO' directives = zcml.filter(tag='agx:generator', attr='name') directive = None for d in directives: if d.attrs['name'] == source.name: directive = d break if not directive: directive = SimpleDirective(name='agx:generator', parent=zcml) directive.attrs['name'] = source.name directive.attrs['transform'] = transform directive.attrs['depends'] = depend set_zcml_directive(eggtarget, 'configure.zcml', 'agx:generator', 'name', source.name, overwrite=True)
def generate_vanilla_profile(self, source, target): egg = egg_source(source) if not is_generator_egg(egg): return tgv = TaggedValues(source) profilename = tgv.direct('name', 'generator:profile', source.name) basepath = os.path.dirname(agx.generator.generator.__file__) profilepath = os.path.join(basepath, 'resources', 'vanilla_profile') # read the model files model_di = open(os.path.join(profilepath, 'model.profile.di')).read() model_uml = open(os.path.join(profilepath, 'model.profile.uml')).read() model_notation = open( os.path.join(profilepath, 'model.profile.notation')).read() eggdir = read_target_node(egg_source(source), target.target) # create profiles dir if 'profiles' not in eggdir.keys(): profiles = Directory() profiles.__name__ = 'profiles' eggdir['profiles'] = profiles profiles = eggdir['profiles'] # add the model files with correct name and change the references if profilename + '.profile.di' not in profiles.keys(): ff = File() ff._data = model_di.replace( 'model.profile.notation', profilename + '.profile.notation') profiles[profilename + '.profile.di'] = ff if profilename + '.profile.uml' not in profiles.keys(): ff = File() ff._data = model_uml.replace('profilename_changeme', profilename) profiles[profilename + '.profile.uml'] = ff if profilename + '.profile.notation' not in profiles.keys(): ff = File() ff._data = model_notation.replace( 'model.profile.uml', profilename + '.profile.uml') profiles[profilename + '.profile.notation'] = ff
def generate_vanilla_profile(self, source, target): egg = egg_source(source) if not is_generator_egg(egg): return tgv = TaggedValues(source) profilename = tgv.direct('name', 'generator:profile', source.name) basepath = os.path.dirname(agx.generator.generator.__file__) profilepath = os.path.join(basepath, 'resources', 'vanilla_profile') # read the model files model_di = open(os.path.join(profilepath, 'model.profile.di')).read() model_uml = open(os.path.join(profilepath, 'model.profile.uml')).read() model_notation = open(os.path.join(profilepath, 'model.profile.notation')).read() eggdir = read_target_node(egg_source(source), target.target) # create profiles dir if 'profiles' not in eggdir.keys(): profiles = Directory() profiles.__name__ = 'profiles' eggdir['profiles'] = profiles profiles = eggdir['profiles'] # add the model files with correct name and change the references if profilename + '.profile.di' not in profiles.keys(): ff = File() ff._data = model_di.replace('model.profile.notation', profilename + '.profile.notation') profiles[profilename + '.profile.di'] = ff if profilename + '.profile.uml' not in profiles.keys(): ff = File() ff._data = model_uml.replace('profilename_changeme', profilename) profiles[profilename + '.profile.uml'] = ff if profilename + '.profile.notation' not in profiles.keys(): ff = File() ff._data = model_notation.replace('model.profile.uml', profilename + '.profile.uml') profiles[profilename + '.profile.notation'] = ff
def apiexporter(self, source,target): """Takes classes with 'api' stereotype and imports them into the pyegg's __init__.py. """ egg = egg_source(source) targetegg = read_target_node(egg, target.target) init = targetegg['__init__.py'] imps = Imports(init) klass = read_target_node(source, target.target) imps.set(class_base_name(klass), [[source.name, None]])
def standardbehavior(self, source, target): # XXX: cleanup standard behaviors, some inherit each other if source.stereotype('dexterity:behavior_standard'): behaviors = standard_behaviors.values() else: behaviors = get_standard_behaviors(source) package = read_target_node(egg_source(source), target.target) default = package['profiles']['default'] full_name = type_id(source, target.target) name = '%s.xml' % full_name type_xml = default['types'][name] for behavior in behaviors: type_xml.params['ctype']['behaviors'].append(behavior)
def plone__init__(self, source, target): egg = egg_source(source) eggname = egg.name targetdir = read_target_node(source, target.target) module = targetdir['__init__.py'] imp = Imports(module) imp.set('zope.i18nmessageid', [['MessageFactory', None]]) value = 'MessageFactory("%s")' % eggname atts = [att for att in module.attributes() if '_' in att.targets] if atts: atts[0].value = value else: module['_'] = Attribute('_', value)
def gsbehavior(self, source, target): if not source.client.stereotype('dexterity:behavior'): return package = read_target_node(egg_source(source), target.target) default = package['profiles']['default'] supplier = source.supplier full_name = type_id(supplier, target.target) name = '%s.xml' % full_name type_xml = default['types'][name] behavior_class = read_target_node(source.client, target.target) behavior = class_full_name(behavior_class) type_xml.params['ctype']['behaviors'].append(behavior)
def schemaclass(self, source, target): schema = getschemaclass(source, target) klass = read_target_node(source, target.target) module = schema.parent view = module.classes('%sView' % klass.classname)[0] tok = token(str(view.uuid), True, depends_on=set()) tok.depends_on.add(schema) if not 'form.Schema' in schema.bases: schema.bases.append('form.Schema') egg = egg_source(source) imp = Imports(schema.parent) imp.set(egg.name, [['_', None]]) imp.set('plone.directives', [['form', None]])
def schemaclass(self, source, target): schema = getschemaclass(source,target) klass = read_target_node(source, target.target) module = schema.parent view = module.classes('%sView' % klass.classname)[0] tok = token(str(view.uuid), True, depends_on=set()) tok.depends_on.add(schema) if not 'form.Schema' in schema.bases: schema.bases.append('form.Schema') egg = egg_source(source) imp = Imports(schema.parent) imp.set(egg.name, [['_', None]]) imp.set('plone.directives', [['form', None]])
def gsdynamicview(self, source, target): """Add view method to FTI's of all dependent content types. """ if not source.supplier.stereotype('plone:content_type') \ or not source.client.stereotype('plone:dynamic_view'): return view = source.client content_type = source.supplier package = read_target_node(egg_source(content_type), target.target) default = package['profiles']['default'] full_name = type_id(content_type, target.target) name = '%s.xml' % full_name type_xml = default['types'][name] tgv = TaggedValues(view) viewname = tgv.direct('name', 'plone:dynamic_view', view.name) type_xml.params['ctype']['view_methods'].append(viewname)
def generate_profile_location_zcml(self, source, target): if source.stereotype('pyegg:stub'): return targetclass = read_target_node(source, target.target) module = targetclass.parent blocks = module.blocks() egg = egg_source(source) eggtarget = read_target_node(egg, target.target) tgv = TaggedValues(source) #name = tgv.direct('name', 'generator:profile', None) set_zcml_directive(eggtarget, 'configure.zcml', 'utility', 'name', implicit_dotted_path(source), provides="agx.core.interfaces.IProfileLocation", component=implicit_dotted_path(source))
def gsprofilesetuphandlers(self, source, target): """Create jsregistry.xml """ package = target.anchor default = package['profiles']['default'] egg = egg_source(source) egg_name = egg.name path = dotted_path(egg) + '.setuphandlers.install' markerfilename = '%s_marker.txt' % dotted_path(egg) #create setuphandlers.py setupname = 'setuphandlers.py' if setupname not in package.keys(): setup = JinjaTemplate() package[setupname] = setup setup.template = 'agx.generator.plone:templates/setuphandlers.py.jinja' setup.params = {'egg': path, 'markerfilename': markerfilename} #create the markerfile if not markerfilename in default.keys(): markerfile = default[markerfilename] = DTMLTemplate() markerfile.template = \ 'agx.generator.plone:templates/productname_marker.txt' # read or create import_steps.xml if 'import_steps.xml' in default: xml = default['import_steps.xml'] else: xml = default['import_steps.xml'] = DTMLTemplate() # set template used for import_steps.xml xml.template = 'agx.generator.plone:templates/import_steps.xml' # set template params xml.params = { 'eggid': path, 'handler': path, 'handlertitle': 'Installer for ' + dotted_path(egg), 'version': '1', # XXX: extend profile with import step version. 'description': '', # XXX: extend profile with import step version. }
def gsprofilesetuphandlers(self, source, target): """Create jsregistry.xml """ package = target.anchor default = package['profiles']['default'] egg = egg_source(source) egg_name = egg.name path = dotted_path(egg) + '.setuphandlers.install' markerfilename = '%s_marker.txt' % dotted_path(egg) #create setuphandlers.py setupname = 'setuphandlers.py' if setupname not in package.keys(): setup = JinjaTemplate() package[setupname] = setup setup.template = 'agx.generator.plone:templates/setuphandlers.py.jinja' setup.params = {'egg':path, 'markerfilename':markerfilename} #create the markerfile if not markerfilename in default.keys(): markerfile = default[markerfilename] = DTMLTemplate() markerfile.template = \ 'agx.generator.plone:templates/productname_marker.txt' # read or create import_steps.xml if 'import_steps.xml' in default: xml = default['import_steps.xml'] else: xml = default['import_steps.xml'] = DTMLTemplate() # set template used for import_steps.xml xml.template = 'agx.generator.plone:templates/import_steps.xml' # set template params xml.params = { 'eggid' : path, 'handler' : path, 'handlertitle' : 'Installer for ' + dotted_path(egg), 'version': '1', # XXX: extend profile with import step version. 'description':'',# XXX: extend profile with import step version. }
def typeicon(self, source, target): egg = egg_source(source) package = read_target_node(egg, target.target) resources = package['resources'] icon = '%s_icon.png' % source.name.lower() klass = read_target_node(source, target.target) folderish = token(str(klass.uuid), True, folderish=False).folderish if not icon in resources: default = package['profiles']['default'] type_name = type_id(source, target.target) name = '%s.xml' % type_name fti = default['types'][name] if folderish: path = templatepath('folder_icon.png') else: path = templatepath('document_icon.png') file = resources[icon] = File() file.mode = MODE_BINARY with open(path) as template: file.data = template.read()
def typeicon(self, source, target): egg = egg_source(source) package = read_target_node(egg, target.target) resources = package['resources'] icon = '%s_icon.png' % source.name.lower() klass = read_target_node(source,target.target) folderish = token(str(klass.uuid), True, folderish=False).folderish if not icon in resources: default = package['profiles']['default'] type_name = type_id(source, target.target) name = '%s.xml' % type_name fti = default['types'][name] if folderish: path = templatepath('folder_icon.png') else: path = templatepath('document_icon.png') file = resources[icon] = File() file.mode = MODE_BINARY with open(path) as template: file.data = template.read()
def gsprofilezcml(self, source, target): """Create configure.zcml if not exists yet, profiles.zcml and profile specific directives. """ package = target.anchor # read or create configure.zcml if 'configure.zcml' in package: configure = package['configure.zcml'] else: configure = package['configure.zcml'] = ZCMLFile() # if include profile.zcml missing, add it if not configure.filter(tag='include', attr='file', value='profiles.zcml'): include = SimpleDirective(name='include', parent=configure) include.attrs['file'] = 'profiles.zcml' # read or create profiles.zcml if 'profiles.zcml' in package: profiles = package['profiles.zcml'] else: snmap = { None: 'http://namespaces.zope.org/zope', 'genericsetup': 'http://namespaces.zope.org/genericsetup', } profiles = package['profiles.zcml'] = ZCMLFile(nsmap=snmap) # if include Products.GenericSetup missing, add it if not profiles.filter(tag='include', attr='package', value='Products.GenericSetup'): include = SimpleDirective(name='include', parent=profiles) include.attrs['package'] = 'Products.GenericSetup' include.attrs['file'] = 'meta.zcml' # read or create install profile directive if not profiles.filter(tag='genericsetup:registerProfile', attr='name', value='default'): install = SimpleDirective(name='genericsetup:registerProfile', parent=profiles) install.attrs['name'] = 'default' else: install = profiles.filter(tag='genericsetup:registerProfile', attr='name', value='default')[0] egg_name = egg_source(source).name # set default profile directive attributes install.attrs['title'] = '%s install' % egg_name install.attrs['description'] = 'Install %s in Plone' % egg_name install.attrs['directory'] = 'profiles/default' install.attrs['provides'] = 'Products.GenericSetup.interfaces.EXTENSION' # read or create uninstall profile directive if not profiles.filter(tag='genericsetup:registerProfile', attr='name', value='uninstall'): uninstall = SimpleDirective(name='genericsetup:registerProfile', parent=profiles) uninstall.attrs['name'] = 'uninstall' else: uninstall = profiles.filter(tag='genericsetup:registerProfile', attr='name', value='uninstall')[0] # set uninstall profile directive attributes uninstall.attrs['title'] = '%s uninstall' % egg_name uninstall.attrs['description'] = 'Uninstall %s in Plone' % egg_name uninstall.attrs['directory'] = 'profiles/uninstall' uninstall.attrs['provides'] = 'Products.GenericSetup.interfaces.EXTENSION'
def mark_handler_as_function(self, source, target): token(str(source.uuid), True, is_function=True) egg = egg_source(source) tok = token(str(egg.uuid), True, is_generator_egg=True) tok.is_generator_egg = True
def make_generators(self, source, target): if source.stereotype('pyegg:stub'): return egg = egg_source(source) eggtarget = read_target_node(egg, target.target) zcml = get_zcml(eggtarget, 'configure.zcml', nsmap={ None: 'http://namespaces.zope.org/zope', 'agx': 'http://namespaces.zope.org/agx' }) tgv = TaggedValues(source) # if transform isnt specified as tgv, get it from dependency relations to # other generators transform = tgv.direct('transform', 'generator:generator', None) if not transform: transforms = token(str(source.uuid), True, transforms=[]).transforms if len(transforms) > 1: msg = 'Currently only one transform per generator allowed (%s)' msg = msg % source.name raise ValueError(msg) elif len(transforms) == 1: transform = transforms[0].name if not transform: transform = 'uml2fs' # if depends isnt specified as tgv, get it from dependency relations to # transforms depend = tgv.direct('depends', 'generator:generator', None) if not depend: depends = token(str(source.uuid), True, depends_on=[]).depends_on if len(depends) > 1: msg = 'Currently only one depends per generator allowed (%s)' msg = msg % source.name raise ValueError(msg) elif len(depends) == 1: depend = depends[0].name if not depend: depend = 'NO' directives = zcml.filter(tag='agx:generator', attr='name') directive = None for d in directives: if d.attrs['name'] == source.name: directive = d break if not directive: directive = SimpleDirective(name='agx:generator', parent=zcml) directive.attrs['name'] = source.name directive.attrs['transform'] = transform directive.attrs['depends'] = depend set_zcml_directive(eggtarget, 'configure.zcml', 'agx:generator', 'name', source.name, overwrite=True)
def gsprofiletypes(self, source, target): """Create or extend types.xml and corresponding TYPENAME.xml. """ egg = egg_source(source) package = read_target_node(egg, target.target) default = package['profiles']['default'] # create types foder if not exists if not 'types' in default: default['types'] = Directory() # read or create types.xml if 'types.xml' in default: types = default['types.xml'] else: types = default['types.xml'] = DTMLTemplate() # set template and params if not done yet if not types.template: types.template = 'agx.generator.plone:templates/types.xml' types.params['portalTypes'] = list() # calculate type name full_name = type_id(source, target.target) # add portal type to types.xml types.params['portalTypes'].append({ 'name': full_name, 'meta_type': 'Dexterity FTI', }) # add TYPENAME.xml to types folder # read or create TYPENAME.xml name = '%s.xml' % full_name if name in default['types']: type = default['types'][name] else: type = default['types'][name] = DTMLTemplate() # set template used for TYPENAME.xml type.template = 'agx.generator.plone:templates/type.xml' # set template params # FTI properties can be added by prefixing param key with 'fti:' # XXX: calculate from model content_icon = '++resource++%s/%s_icon.png' % ( egg.name, source.name.lower()) type.params['ctype'] = dict() # general type.params['ctype']['name'] = full_name type.params['ctype']['meta_type'] = 'Dexterity FTI' type.params['ctype']['i18n_domain'] = egg.name # basic metadata type.params['ctype']['title'] = source.name type.params['ctype']['description'] = source.name type.params['ctype']['content_icon'] = content_icon type.params['ctype']['allow_discussion'] = 'False' type.params['ctype']['global_allow'] = 'True' # XXX: maybe False for non contained ones? type.params['ctype']['filter_content_types'] = 'True' type.params['ctype']['allowed_content_types'] = list() # dexterity specific class_ = read_target_node(source, target.target) schemaclass=getschemaclass(source,target) schema = '%s.%s' % (class_base_name(class_), schemaclass.classname) # XXX: check whether container or leaf if token(str(class_.uuid), False, dont_generate=False).dont_generate: klass = 'plone.dexterity.content.Item' else: klass = '%s.%s' % (class_base_name(class_), class_.classname) type.params['ctype']['schema'] = schema type.params['ctype']['klass'] = klass type.params['ctype']['add_permission'] = 'cmf.AddPortalContent' type.params['ctype']['behaviors'] = list() # View information type.params['ctype']['view_methods'] = ['view'] type.params['ctype']['default_view'] = 'view' type.params['ctype']['default_view_fallback'] = 'False' # Method aliases type.params['ctype']['aliases'] = list() type.params['ctype']['aliases'].append({ 'from': '(Default)', 'to': '(dynamic view)', }) type.params['ctype']['aliases'].append({ 'from': 'view', 'to': '(selected layout)', }) type.params['ctype']['aliases'].append({ 'from': 'edit', 'to': '@@edit', }) type.params['ctype']['aliases'].append({ 'from': 'sharing', 'to': '@@sharing', }) # Actions type.params['ctype']['actions'] = list() type.params['ctype']['actions'].append({ 'action_id': 'edit', 'title': 'Edit', 'category': 'object', 'condition_expr': '', 'url_expr': 'string:${object_url}/edit', 'visible': 'True', 'permissions': ['Modify portal content'], }) type.params['ctype']['actions'].append({ 'action_id': 'view', 'title': 'View', 'category': 'object', 'condition_expr': '', 'url_expr': 'string:${object_url}/view', 'visible': 'True', 'permissions': ['View'], })
def mark_handler_as_function(self, source, target): token(str(source.uuid), True, is_function=True) egg = egg_source(source) tok=token(str(egg.uuid),True,is_generator_egg=True) tok.is_generator_egg=True
def gsprofilezcml(self, source, target): """Create configure.zcml if not exists yet, profiles.zcml and profile specific directives. """ package = target.anchor # read or create configure.zcml if 'configure.zcml' in package: configure = package['configure.zcml'] else: configure = package['configure.zcml'] = ZCMLFile() # if include profile.zcml missing, add it if not configure.filter(tag='include', attr='file', value='profiles.zcml'): include = SimpleDirective(name='include', parent=configure) include.attrs['file'] = 'profiles.zcml' # read or create profiles.zcml if 'profiles.zcml' in package: profiles = package['profiles.zcml'] else: snmap = { None: 'http://namespaces.zope.org/zope', 'genericsetup': 'http://namespaces.zope.org/genericsetup', } profiles = package['profiles.zcml'] = ZCMLFile(nsmap=snmap) # if include Products.GenericSetup missing, add it if not profiles.filter( tag='include', attr='package', value='Products.GenericSetup'): include = SimpleDirective(name='include', parent=profiles) include.attrs['package'] = 'Products.GenericSetup' include.attrs['file'] = 'meta.zcml' # read or create install profile directive if not profiles.filter( tag='genericsetup:registerProfile', attr='name', value='default'): install = SimpleDirective(name='genericsetup:registerProfile', parent=profiles) install.attrs['name'] = 'default' else: install = profiles.filter(tag='genericsetup:registerProfile', attr='name', value='default')[0] egg_name = egg_source(source).name # set default profile directive attributes install.attrs['title'] = '%s install' % egg_name install.attrs['description'] = 'Install %s in Plone' % egg_name install.attrs['directory'] = 'profiles/default' install.attrs['provides'] = 'Products.GenericSetup.interfaces.EXTENSION' # read or create uninstall profile directive if not profiles.filter(tag='genericsetup:registerProfile', attr='name', value='uninstall'): uninstall = SimpleDirective(name='genericsetup:registerProfile', parent=profiles) uninstall.attrs['name'] = 'uninstall' else: uninstall = profiles.filter(tag='genericsetup:registerProfile', attr='name', value='uninstall')[0] # set uninstall profile directive attributes uninstall.attrs['title'] = '%s uninstall' % egg_name uninstall.attrs['description'] = 'Uninstall %s in Plone' % egg_name uninstall.attrs['directory'] = 'profiles/uninstall' uninstall.attrs['provides'] = 'Products.GenericSetup.interfaces.EXTENSION'