[Patch] AGX: support for viewlets

5 messages Options
Embed this post
Permalink
Derek Broughton-3 () [Patch] AGX: support for viewlets
Reply Threaded More More options
Print post
Permalink
I got fed up hand generating all my own viewlets (that's how most OSS
development gets done, right?) so cloned the <view_class> support for
<viewlet_class>.

It relies on two stereotypes <viewlet_class> and <viewlet_manager> which I
haven't attempted to add to the archgenxml XMI profile.

Add a class with <viewlet_class> stereotype to your model, and AGX will
generate the Class module, a skeleton template, and zcml for each viewlet.
Similar to views, one <browser:viewlet> tag is produced for each
combination of "for", "view" and, in this case, "manager".  A "view"
attribute is created for every class dependency which is a "view",
a "manager" attribute is created for every dependency which has
the "viewlet_manager" stereotype, and "for" attributes for all other
dependencies.  

If there are no "for" interfaces, a <browser:viewlet for="*" ... /> tag is
generated.
--
derek

[viewlet.diff]

diff -N -x '*.py?' -r -u plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/ArchetypesGenerator.py /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/ArchetypesGenerator.py
--- plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/ArchetypesGenerator.py 2009-03-20 14:44:21.000000000 -0300
+++ /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/ArchetypesGenerator.py 2009-03-30 12:16:32.000000000 -0300
@@ -131,10 +131,7 @@
     vocabulary_item_stereotype = ['vocabulary_term']
     vocabulary_container_stereotype = ['vocabulary']
     remember_stereotype = ['remember']
-    python_stereotype = ['python', 'python_class'] + \
-            BaseGenerator.view_class_stereotype +  \
-            BaseGenerator.viewlet_class_stereotype + \
-            BaseGenerator.portlet_class_stereotype
+    python_stereotype = ['python', 'python_class'] + BaseGenerator.view_class_stereotype + BaseGenerator.portlet_class_stereotype
     folder_stereotype = ['atfolder', 'folder', 'ordered', 'large', 'btree']
     atct_stereotype = ['atfolder', 'atfile', 'atdocument', 'atevent', 'atimage',
                        'atnewsitem', 'atlink']
@@ -2729,8 +2726,7 @@
         # generate subscribers
         self.generateSubscribersZCML(package)
         # generate browser views
-        if self.getViewClasses(package,recursive=True) \
-        or self.getClassesWithStereotype(package, self.viewlet_class_stereotype, recursive=True):
+        if self.getViewClasses(package,recursive=True):
             self.generateBrowserZCML(package)
         #generate portlets
         self.generatePortletsXML(package)
@@ -2766,11 +2762,8 @@
                        ]
 
         hasSubscribers = bool(package.getAnnotation('subscribers'))
-        hasBrowserViews = (
-                self.getViewClasses(package,recursive=False) or
-                self.getClassesWithStereotype(package,self.portlet_class_stereotype,recursive=False) or
-                self.getClassesWithStereotype(package,self.viewlet_class_stereotype,recursive=False)
-                )
+        hasBrowserViews = self.getViewClasses(package,recursive=False) or \
+            self.getClassesWithStereotype(package,self.portlet_class_stereotype,recursive=False)
         hasSubPackagesWithZcml = self.subPackagesWithZcml(package) != []
         handleSectionedFile(['configure.zcml'],
                             os.path.join(ppath, 'configure.zcml'),
@@ -2791,13 +2784,12 @@
     def generateBrowserZCML(self, package,fname="generatedbrowser.zcml"):
         """generates the generatedbrowser.zcml"""
         browserViews = self.getViewClasses(package)
-        viewletViews = self.getClassesWithStereotype(package,self.viewlet_class_stereotype)
         portletViews = self.getClassesWithStereotype(package,self.portlet_class_stereotype)
-        if not (browserViews or portletViews or viewletViews):
+        if not (browserViews or portletViews):
             return
         
         templdir=os.path.join(package.getFilePath(),'templates')
-        if browserViews or portletViews or viewletViews:
+        if browserViews or portletViews:
             self.makeDir(templdir)
         #create the vanilla templates
         for view in browserViews:
@@ -2810,16 +2802,6 @@
                                 overwrite=False,
                                 templateparams={})
 
-        for view in viewletViews:
-            if not view.getTaggedValue('template_name'):
-                view.setTaggedValue('template_name','%s.pt' % view.getName())
-
-            if not view.hasStereoType('stub'):
-                handleSectionedFile(['viewlet_template.pt'],
-                                os.path.join(templdir, view.getTaggedValue('template_name')),
-                                overwrite=False,
-                                templateparams={'generator':self,'klass':view})
-
         for view in portletViews:
             if not view.getTaggedValue('template_name'):
                 view.setTaggedValue('template_name','%s.pt' % view.getName())
@@ -2838,7 +2820,6 @@
                             sectionnames=['BROWSER'],
                             templateparams={'browserViews': browserViews,
                                             'portletViews': portletViews,
-                                            'viewletViews': viewletViews,
                                             'i18ndomain': package.getProductName()})
 
     def generatePackageIncludesZcml(self, package):
diff -N -x '*.py?' -r -u plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/BaseGenerator.py /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/BaseGenerator.py
--- plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/BaseGenerator.py 2009-03-20 15:29:33.000000000 -0300
+++ /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/BaseGenerator.py 2009-03-30 12:16:32.000000000 -0300
@@ -55,13 +55,6 @@
     description='Generate this class as a zope3 view class '
                 'instead of as an Archetypes class.')
 
-base_uml_profile.addStereoType('viewlet_class', ['XMIClass'],
-    dispatching=1,
-    generator='generateViewClass',
-    template=['viewlet_class.pydtml'],
-    description='Generate this class as a zope3 viewlet'
-                'instead of as an Archetypes class.')
-
 base_uml_profile.addStereoType('portlet_class', ['XMIClass'],
     dispatching=1,
     generator='generatePortletClass',
@@ -85,8 +78,7 @@
     uml_profile = base_uml_profile
     default_class_type = 'python_class'
     default_interface_type = 'z3'
-    viewlet_class_stereotype = ['viewlet_class',]
-    view_class_stereotype = ['view_class', 'view', ]
+    view_class_stereotype = ['view_class', 'view']
     portlet_class_stereotype = ['portlet_class','portlet']
     # indent helper for log output:
     infoind = 0
@@ -292,8 +284,7 @@
             # Zope 3 interfaces
             z3reparentnames = [p.getName() for p in reparents
                                if (self.getInterfaceType(p) == 'z3'
-                                   or p.hasStereoType('view_class')
-                                   or p.hasStereoType('viewlet_class'))]
+                                   or p.hasStereoType('view_class'))]
             
             if not element.isInterface() and self._isContentClass(element) and not element.hasStereoType('adapter'):
                 z3reparentnames = ['interfaces.I'+element.getCleanName()]+z3reparentnames
 
diff -N -x '*.py?' -r -u plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/browser.zcml /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/browser.zcml
--- plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/browser.zcml 2009-03-21 00:14:31.000000000 -0300
+++ /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/browser.zcml 2009-03-30 12:16:32.000000000 -0300
@@ -61,45 +61,6 @@
 </dtml-in>
 
 
-<dtml-in viewletViews>
-<dtml-let klass="_['sequence-item']">
-<dtml-let suppliers="[dep.getSupplier() for dep in klass.getClientDependencies()]">
-<dtml-let views="[x for x in suppliers if x.hasStereoType('view_class')] or ['']">
-<dtml-let managers="[x for x in suppliers if x.hasStereoType('viewlet_manager')] or ['']">
-<dtml-let fors="[x for x in suppliers if x not in views+managers] or ['']">
- <dtml-in fors>
-   <dtml-let tgtfor="_['sequence-item']">
-   <dtml-in views>
-    <dtml-let tgtview="_['sequence-item']">
-    <dtml-in managers>
-     <dtml-let manager="_['sequence-item']">
-  
-  <browser:viewlet
-     <dtml-if "tgtfor">for="Products.<dtml-if "tgtfor.isInterface()"><dtml-var "tgtfor.getQualifiedName(includeRoot=True)"><dtml-else><dtml-var "tgtfor.getPackage().getQualifiedName(None,includeRoot=True)">.interfaces.I<dtml-var "tgtfor.getName()"></dtml-if>"    
-     </dtml-if><dtml-if "not tgtfor">for="*"</dtml-if>
-     <dtml-if "tgtview">view="Products.<dtml-if "tgtview.isInterface()"><dtml-var "tgtview.getQualifiedName(includeRoot=True)"><dtml-else><dtml-var "tgtview.getPackage().getQualifiedName(None,includeRoot=True)">.interfaces.I<dtml-var "tgtview.getName()"></dtml-if>"
-     </dtml-if>
-     <dtml-if "manager">manager="Products.<dtml-if "manager.isInterface()"><dtml-var "manager.getQualifiedName(includeRoot=True)"><dtml-else><dtml-var "manager.getPackage().getQualifiedName(None,includeRoot=True)">.interfaces.I<dtml-var "manager.getName()"></dtml-if>"
-     </dtml-if>
-     name="<dtml-var "klass.getTaggedValue('name') or klass.getName()" >"
-     class="Products.<dtml-var "klass.getQualifiedName(includeRoot=True)" >"
-     template="templates/<dtml-var "klass.getTaggedValue('template_name')" >"
-     permission="<dtml-var "klass.getTaggedValue('permission') or 'zope2.View'" >"
-     />
-     </dtml-let>
-    </dtml-in>
-    </dtml-let>
-   </dtml-in>
-   </dtml-let>
- </dtml-in>
- </dtml-let>
- </dtml-let>
- </dtml-let>
- </dtml-let>
- </dtml-let>
-</dtml-in>
-
-
 
   
 <!-- ##code-section BROWSER #fill in your manual code here -->
diff -N -x '*.py?' -r -u plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_class.pydtml /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_class.pydtml
--- plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_class.pydtml 2009-03-20 13:14:34.000000000 -0300
+++ /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_class.pydtml 1969-12-31 20:00:00.000000000 -0400
@@ -1,50 +0,0 @@
-<dtml-let assocs="klass.getFromAssociations(aggtypes=['none','aggregation','composite'])"
-          atts="klass.getAttributeDefs()"
-          dependentImports="generator.generateDependentImports(klass)"
-          additionalImports="generator.generateAdditionalImports(klass)"
-          taggedImports="generator.getImportsByTaggedValues(klass)"
-          vars="atts+[a.toEnd for a in assocs]">
-<dtml-var "generator.getProtectedSection(parsed_class, 'module-header')">
-from zope import interface
-from zope import component
-from Products.CMFPlone import utils
-from plone.app.layout.viewlets.common import ViewletBase
-<dtml-if taggedImports><dtml-var taggedImports></dtml-if>
-<dtml-if dependentImports><dtml-var dependentImports></dtml-if>
-<dtml-if additionalImports><dtml-var additionalImports></dtml-if>
-<dtml-if "klass.hasStereoType('z3') or 'z3' in ['z3' for p in klass.getRealizationParents() if p.hasStereoType('z3')]">
-</dtml-if>
-
-<dtml-let base_class="klass.getTaggedValue('base_class') or ','.join([p.getCleanName() for p in klass.getGenParents()]) or 'ViewletBase'">
-class <dtml-var "klass.getCleanName()"><dtml-if base_class>(<dtml-var base_class>)</dtml-if>:
-</dtml-let>
-    """<dtml-var "utils.indent(klass.getDocumentation(), 1, skipFirstRow=True, stripBlank=True)">
-    """
-<dtml-var "generator.generateImplements(klass,[p.getCleanName() for p in klass.getGenParents()])">
-<dtml-var "generator.getProtectedSection(parsed_class,'class-header_'+klass.getCleanName(),1)">
-<dtml-in "generator.getMethodsToGenerate(klass)[0]">
-<dtml-let m="_['sequence-item']">
-<dtml-if "m.getParent().__class__.__name__=='XMIInterface'">
-    #from Interface <dtml-var "m.getParent().getName()">:
-</dtml-if>
-<dtml-if "parsed_class and m.getCleanName() in parsed_class.methods.keys()">
-<dtml-var "parsed_class.methods[m.getCleanName()].getSrc()">
-<dtml-else>
-<dtml-let param="', '.join(m.getParamNames())">
-    def <dtml-var "m.getName()">(self<dtml-if param>, <dtml-var param></dtml-if>):
-</dtml-let>
-        pass
-
-</dtml-if>
-<dtml-if "m.isStatic()">
-    <dtml-var "m.getName()"> = staticmethod(<dtml-var "m.getName()">)
-</dtml-if>
-</dtml-let>
-</dtml-in>
-
-<dtml-in "[m for m in generator.getMethodsToGenerate(klass)[1]]">
-
-<dtml-var "_['sequence-item'].getSrc()">
-</dtml-in>
-
-<dtml-var "generator.getProtectedSection(parsed_class,'module-footer')"></dtml-let>
diff -N -x '*.py?' -r -u plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_template.pt /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_template.pt
--- plone/eggs/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_template.pt 2009-03-20 13:17:08.000000000 -0300
+++ /usr/lib/python2.4/site-packages/archgenxml-2.3-py2.4.egg/archgenxml/templates/viewlet_template.pt 1969-12-31 20:00:00.000000000 -0400
@@ -1,3 +0,0 @@
-<div>
-        Body
-</div>




------------------------------------------------------------------------------

_______________________________________________
Archetypes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/archetypes-users
Vincent Fretin () Re: [Patch] AGX: support for viewlets
Reply Threaded More More options
Print post
Permalink
Cool, I'll try to look at it, add the stereotypes in the profile and
include in in agx 2.4.

On Mon, Mar 30, 2009 at 10:23 PM, Derek Broughton <[hidden email]> wrote:

> I got fed up hand generating all my own viewlets (that's how most OSS
> development gets done, right?) so cloned the <view_class> support for
> <viewlet_class>.
>
> It relies on two stereotypes <viewlet_class> and <viewlet_manager> which I
> haven't attempted to add to the archgenxml XMI profile.
>
> Add a class with <viewlet_class> stereotype to your model, and AGX will
> generate the Class module, a skeleton template, and zcml for each viewlet.
> Similar to views, one <browser:viewlet> tag is produced for each
> combination of "for", "view" and, in this case, "manager".  A "view"
> attribute is created for every class dependency which is a "view",
> a "manager" attribute is created for every dependency which has
> the "viewlet_manager" stereotype, and "for" attributes for all other
> dependencies.
>
> If there are no "for" interfaces, a <browser:viewlet for="*" ... /> tag is
> generated.
> --
> derek
>
> ------------------------------------------------------------------------------
>
> _______________________________________________
> Archetypes-users mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/archetypes-users
>
>



--
Vincent Fretin

------------------------------------------------------------------------------
_______________________________________________
Archetypes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/archetypes-users
Derek Broughton-3 () Re: [Patch] AGX: support for viewlets
Reply Threaded More More options
Print post
Permalink
Vincent Fretin wrote:

> Cool, I'll try to look at it, add the stereotypes in the profile and
> include in in agx 2.4.
>

Sorry, that doesn't quite fit the bill - I forgot the fact that I did some
hand editing after generating the viewlet .zcml

It needs to get a ViewletManager name for the "manager" attribute, rather
than using the class name (though I suppose there's nothing intrinsically
illegal, it just makes for big and unwieldy names).  And since there's
nothing to generate the zcml for the viewlet manager, I should add that
too.  Tomorrow :-)
--
derek


------------------------------------------------------------------------------
_______________________________________________
Archetypes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/archetypes-users
Vincent Fretin () Re: [Patch] AGX: support for viewlets
Reply Threaded More More options
Print post
Permalink
On Tue, Mar 31, 2009 at 6:06 PM, Derek Broughton <[hidden email]> wrote:

> Vincent Fretin wrote:
>
>> Cool, I'll try to look at it, add the stereotypes in the profile and
>> include in in agx 2.4.
>>
>
> Sorry, that doesn't quite fit the bill - I forgot the fact that I did some
> hand editing after generating the viewlet .zcml
>
> It needs to get a ViewletManager name for the "manager" attribute, rather
> than using the class name (though I suppose there's nothing intrinsically
> illegal, it just makes for big and unwieldy names).  And since there's
> nothing to generate the zcml for the viewlet manager, I should add that
> too.  Tomorrow :-)
> --
> derek

Hi,

I'm sorry Derek, this functionnality won't be in archgenxml 2.4. I
don't have the time to review your patch correctly and test it.
I will make the release of archgenxml 2.4 now.

Please continue to develop this functionality, and add your two stereotypes in
src/archgenxml/src/archgenxml/BaseGenerator.py next to portlet_class.

PS : I'm in vacation between 3 and 14 april, without computer of course.

Have a good day
--
Vincent Fretin

------------------------------------------------------------------------------
_______________________________________________
Archetypes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/archetypes-users
Derek Broughton-3 () Re: [Patch] AGX: support for viewlets
Reply Threaded More More options
Print post
Permalink
Vincent Fretin wrote:

>
> I'm sorry Derek, this functionnality won't be in archgenxml 2.4. I
> don't have the time to review your patch correctly and test it.
> I will make the release of archgenxml 2.4 now.

No problem - I really wasn't expecting to get into 2.4, and I'd rather see
the 2.4 release made than have it wait for my changes.   After all, I can
apply my patch to 2.4, too, and so can anybody else who feels they really
need it.
--
derek




------------------------------------------------------------------------------
_______________________________________________
Archetypes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/archetypes-users