Re: Zope View Tutorial

Joe Bigler <[email protected]> Sun, 14 Jul 2013 05:33:07 +0000
Newsgroups gmane.comp.web.zope.plone.documentation
Message-ID <[email protected]>
Mike,

I got this code to work for the first example on http://developer.plone.org/members/member_basics.html#getting-the-logged-in-member

I used your example code and came up with this for the configure.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="example.MyAddOn">

  <include package="plone.app.contentmenu" />

  <!-- -*- extra stuff goes here -*- -->
  <browser:page
        for="*"
        name="test_user_view"
        class=".common.TestUserView"
        permission="zope2.View"
        />
        
  <browser:page
        for="*"
        name="test_user_view2"
        class=".mycommon.TestUserView2"
        permission="zope2.View"
        />

</configure>

This is the code I came up with for mycommon.py

from Products.Five import BrowserView
from Products.CMFCore.utils import getToolByName
import logging
logger=logging.getLogger("MyLogger: ")
from zope.component import getMultiAdapter

class TestUserView2:

    def __call__(self):
        """Testing views"""
        logger.info("TestUserView2: __call__: ")
        portal_state = getMultiAdapter((self.context, self.request), name="plone_portal_state")
        if portal_state.anonymous():
            # Return target URL for the site anonymous visitors
            logger.info("TestUserView2: __call__: self.context.portal_url(): %s" % str(self.context.portal_url.getPortalObject()))
        else:
            # Return edit URL for the site members
            logger.info("TestUserView2: __call__: self.context.absolute_url(): %s" % str(self.context.absolute_url()))


I tested this from the /events folder off of the root			
When I place /@@test_user_view2 in the url while logged in, it displays this in the console:
2013-07-14 01:20:59 INFO MyLogger:  TestUserView2: __call__:
2013-07-14 01:20:59 INFO MyLogger:  TestUserView2: __call__: self.context.absolute_url(): http://localhost:8080/PloneTest/events

When I do the same thing with the anonymous view, it displays this in the console:
2013-07-14 01:18:29 INFO MyLogger:  TestUserView2: __call__:
2013-07-14 01:18:29 INFO MyLogger:  TestUserView2: __call__: self.context.portal_url(): <PloneSite at PloneTest>
I tried to get the actual root url to show up, but couldn't get anything to work.  I have used context.getURL0() in the theme product in the past, but it would not work here.			

I could not get the code in the original else clause, product.absolute_url() to work so I replaced it with self.context.absolute_url()
Actually, I couldn't find any examples of product.absolute_url() in the Plone code on my site, my Plone documentation, which includes most of the Plone books, or any google search.  Seems odd that they would use something so uncommon.  Is that code, product.absolute_url(), correct or am I missing something?

This is the error I got with product.absolute_url() in the if clause:

2013-07-13 22:28:15 INFO Zope Ready to handle requests
2013-07-13 22:29:08 INFO MyLogger:  TestUserView2: __call__:
2013-07-13 22:29:08 ERROR Zope.SiteErrorLog 1373768948.090.486417813512 http://localhost:8080/PloneTest/@@test_user_view2
Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module example.MyAddOn.browser.mycommon, line 18, in __call__
NameError: global name 'product' is not defined

I ran into a similar problem with the anonymous view and the code self.product.getHomepageLink() in the if clause:
It generates this error:
2013-07-13 22:23:14 INFO MyLogger:  TestUserView2: __call__:
2013-07-13 22:23:14 ERROR Zope.SiteErrorLog 1373768594.460.832128119821 http://127.0.0.1:8080/PloneTest/@@test_user_view2
Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module example.MyAddOn.browser.mycommon, line 15, in __call__
AttributeError: 'TestUserView2' object has no attribute 'product'

Is self.product.getHomepageLink() valid code or am I not understanding something?

I appreciate your help with this.

Joe Bigler


-----Original Message-----
From: Mike Cullerton [mailto:plone-Jyq08SUepVWvlIlDamLRIwC/[email protected]] 
Sent: Saturday, July 13, 2013 9:41 AM
To: Joe Bigler
Cc: [email protected]
Subject: Re: [Plone-docs] Zope View Tutorial

Hey Joe,

You don't ask a specific question. Did you try something and get an error?

I suggest starting your view without restricting the views/interfaces, and worrying about that when you have all the other logic working.

Here's what it takes to get the example you referenced at http://developer.plone.org/members/member_basics.html#list-users-within-all-groups running.

First you tell Plone about your entry point. In the browser directory, in configure.zcml, add

    <browser:page
        for="*"
        name="test_user_view"
        class=".common.TestUserView"
        permission="zope2.View"
        />

This says when someone goes to the url test_user_view, run the code in the class common.TestUserView.

To create the class, create a file called common.py in the browser directory, and in common.py, add

from Products.Five import BrowserView
from Products.CMFCore.utils import getToolByName import logging
logger=logging.getLogger("MyLogger: ")

class TestUserView:

    def __call__(self):
        """Testing views"""
        logger.info("TestUserView: __call__: ")
        acl_users = getToolByName(self.context, 'acl_users')
        groups_tool = getToolByName(self.context, 'portal_groups')
        groups = acl_users.source_groups.getGroupIds()
        for group_id in groups:
            group = groups_tool.getGroupById(group_id)
            if group is None:
                continue
            logger.info("TestUserView: __call__: group: %s" % str(group))
            members = group.getGroupMembers()
            member_emails = [m.getProperty('email') for m in members]
            logger.info("TestUserView: __call__: member_emails: %s" % str(member_emails))


Notice that I added some logging to their example. 

You can access that code at http:blahblahblah/yourplonesite/test_user_view

Hope this helps,
Mike

On Jul 12, 2013, at 2:07 PM, Joe Bigler <[email protected]> wrote:

> Mike,
> 
> Here is what I am trying to do.  I need to access information from the Plone database.   I am trying to implement the examples at http://developer.plone.org/members/member_basics.html#list-users-within-all-groups because we are primarily interested in user information at this time.   Here are some of the things I have been tasked to do:
> 
> - email blast to all editors in the site
> - generate a report with names and email addresses for all editors
> - generate a list of all groups with their editors listed.
> 
> I have tried to build a view for this, but not sure how to proceed.  I 
> worked through the developer.plone.org "Hello World" tutorial at 
> https://developer.plone.org/reference_manuals/active/helloworld/index.
> html
> 
> I installed the product on my test site and got it to work for the tutorial.  I have also looked at the Professional Plone 4 Development book, and posted the question in the Nabble forum.  I understand the basic idea of a view,   but determining the interface, the class, and the python code to get the examples on http://developer.plone.org/members/member_basics.html#list-users-within-all-groups to work is something I just don't see yet.  I understand Zope browser views are an important part on Plone 4 and I need to understand how to use them, but I am frankly stuck.  I don't want to have to ask someone to build every one of these I need.  I need to get the principals down so I can build them on my own.  Any suggestions?
> 
> I have been working with Plone since 2006.   We made the jump from Plone 2.5.3 to Plone 4.1 last year.  I only know Python from what little I have used it in Plone.  I am working on that.  I don't have any experience with an object oriented programming language.  I have been programming web pages since 1998, mostly with ColdFusion and database applications since the 1990's with Visual Basic and SQL Server.  I am the web administrator for the College of Education at Penn State University.  You can see our site at http://www.ed.psu.edu.  
> 
> I am hoping that if I can understand views to add a tutorial to the http://developer.plone.org/members/member_basics.html#list-users-within-all-groups page.  I know of several administrators that would like to be able to do what I am doing, but have a similar background and are stuck as well.
> 
> Any thoughts or suggestions would be appreciated.
> 
> Joseph E. Bigler
> Web Administrator
> Carrara Education Technology Center
> [email protected]
> 814-865-1560
> 233B Chambers Building
> University Park, PA 16802
> 
> 
> 
> -----Original Message-----
> From: Mike Cullerton [mailto:plone-Jyq08SUepVWvlIlDamLRIwC/[email protected]]
> Sent: Thursday, July 11, 2013 10:43 AM
> To: Joe Bigler
> Cc: [email protected]
> Subject: Re: [Plone-docs] Zope View Tutorial
> 
> Hey Joe,
> 
> I don't know which tutorial you are referring to, but the Hello World tutorial has a secion of views.
> 
> https://developer.plone.org/reference_manuals/active/helloworld/index.
> html
> 
> If that's not what you are interested in, you can find all the 
> tutorials listed at https://developer.plone.org/
> 
> Mike
> 
> On Jul 11, 2013, at 8:38 AM, Joe Bigler <[email protected]> wrote:
> 
>> I am looking for the zope view tutorial referenced in the Plone 
>> Developer Manual Documentation.  It is listed on page 77, section 1.2 
>> Programming Plone in the latest version I have, April 03, 2013.
>> 
>> When I click on the link, it redirects me to 
>> http://developer.plone.org/moved_content.html.  This tells me the 
>> documentation has been moved to another location, but it doesn't list 
>> where it is.  I tried checking the links on that page, but I could not find it.
>> The link it originally went to is
>> http://plone.org/documentation/tutorial/borg/zope-3-views.
>> 
>> I have tried multiple searches, but cannot find it.  Can anyone help 
>> with this or point me to a good zope view tutorial?
>> 
>> 
>> 
>> --
>> View this message in context: 
>> http://plone.293351.n2.nabble.com/Zope-View-Tutorial-tp7566584.html
>> Sent from the Documentation Team mailing list archive at Nabble.com.
>> 
>> ---------------------------------------------------------------------
>> -
>> -------- See everything from the browser to the database with 
>> AppDynamics Get end-to-end visibility with application monitoring 
>> from AppDynamics Isolate bottlenecks and diagnose root cause in seconds.
>> Start your free trial of AppDynamics Pro today!
>> http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.
>> c lktrk _______________________________________________
>> Plone-docs mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/plone-docs
> 


------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk