Hello, Jorge et al.
Jorge said: > The next error (2) is how clumsy the > tg.predicates.is_anonymous().is_met(tg.request.environ) transformation > is implemented, I won't go over this again. > http://trac.turbogears.org/ticket/2205 Draw your own conclusions. > > But at least we have the more decent form tg.predicates.is_anonymous() > at least for now. > > <body> > <p > py:if='tg.predicates.is_anonymous().is_met(tg.request.environ)'>Anonymous > </p> > > <p> The methods below work due to a flag set by TG </p> > <p py:if='tg.predicates.is_anonymous()'>Anonymous </p> > <p py:if='tg.predicates.not_anonymous()'>Not Anonymous </p> > > <h1>WARNING: methods below will only work if you are logged in! </h1> > <h2> This is due to tg.identity being None if no auth is present </h2> > > <h3> From repoze.who </h3> > <div>User Object: ${tg.identity['repoze.who.userid']}</div> > > <h3>From repoze.what</h3> > <div>User Object: ${tg.identity['user']}</div> > <div>Groups List of Strings: ${tg.identity['groups']}</div> > <div>Groups List of Objects: ${tg.identity['user'].groups}</div> > > <div>Permissions List of Strings: ${tg.identity['permissions']}</div> > <div>Permissions List of Objects: > ${tg.identity['user'].permissions}</div> <div>First Group: > ${tg.identity['groups'][0]}</div> > <div>First Permission: ${tg.identity['permissions'][0]}</div> > > <h3> These are real object </h3> > > <div>User Object: ${str(type(tg.identity['user']))}</div> > <div>Groups List Of Strings: ${str(type(tg.identity['groups']))}</div> > <div>Groups List Of Objects: > ${str(type(tg.identity['user'].groups))}</div> <div>Groups First Object: > ${str(type(tg.identity['user'].groups[0]))}</div> <div>Permissions List Of > String: > ${str(type(tg.identity['permissions']))}</div> > <div>Permissions List Of Objects: > ${str(type(tg.identity['user'].permissions))}</div> > > </body> > > So that was a bunch, how about doing the same thing in the controller? > well it's totally different. > > @expose('identitytest.templates.index') > def index(self): > """Handle the front-page.""" > from repoze.what.predicates import has_permission > from tg import request > yes_or_no = has_permission('manage').is_met(request.environ) > print yes_or_no # outputs = the real "boolean object" > > yes_or_no = has_permission('manage') > print yes_or_no # outputs = > <repoze.what.predicates.has_permission object at 0xa63666c> > #Why? don't know r.what works that way. > #there is a flag you can set but it's not set at the > controller level, need to ask Gustavo Here we go once again... It's not "how repoze.what works". It's all about how Python works. In Python, an object can act as a boolean if its __nonzero__/__bool__ method is set accordingly. For TG2 users, a horrible error-prone monkey-patch has been implemented and enabled by default by popular demand: http://trac.turbogears.org/ticket/2205 With it, the __non_zero__ method is set on every predicate, so if you want to get its truth value, *Python* *mandates* that you use bool() *unless* it's in the context of a boolean evaluation: """ yes_or_not = bool(has_permission('manage')) if has_permission('manage'): # <-- equals: "bool(has_permission('manage'))" do_something() """ The "officially supported and recommended" (aka "my") way to do this is 1) disable that monkey-patch and 2) Use the is_met()/not_met() functions provided by repoze.what-pylons -- they do return a bool: """ yes_or_not = is_met(has_permission('manage')) if is_met(has_permission('manage')): do_something() """ You'd write a few more characters, but it's safer. Noone should ever expect an instance of a class (e.g., is_anonymous, has_permission) to return a bool because object.__init__() calls cannot return a value. Unless, of course, the class extends Python's bool, which can't obviously happen in a reusable software like repoze.what. So it all comes down to the way Python works. *Any* attempt to override this behavior in the core of repoze.what will result in a unportable software. Hence repoze.what-pylons exists. > identity = request.environ.get('repoze.who.identity') > # from here you can do everything in the template example as > tg.identity is the equivalent > return dict() > > As you can tell there is no "short form" (3) and you need to import > items from 2 classes (4) and in order to get the rather simply > tg.identity variable from the templates you get a really weird call to > the request.environ. If you want to do it the "raw" way, indeed you have to pass the environ. But you can use the is_met() function and make it available in the template: <p py:if="is_met(tg.predicates.is_anonymous())">Anonymous</p> Or if you use the monkey-patch enabled by default, you could even write: <p py:if="tg.predicates.is_anonymous()">Anonymous</p> As you could see, I didn't have to use the environ in the samples above. Cheers. -- Gustavo Narea <xri://=Gustavo>. | Tech blog: =Gustavo/(+blog)/tech ~ About me: =Gustavo/about | --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

