[01:22] <lifeless> who is around
[01:23] <StevenK> You want a roll call?
[01:23] <lifeless> hmm, wgrant  - hey, so - do we track enough detail to determine how often contact-this-team is used; by admins, by members, by non-members ?
[01:23] <lifeless> StevenK: no, I wanted a victim
[01:30] <wgrant> lifeless: Yes.
[01:31] <wgrant> lifeless: The abuse:realuse ratio is roughly infinity, I believe.
[01:33] <lifeless> if we can get a little data on that
[01:34] <lifeless> I will happily drive a sharp scope reduction on it
[01:38] <spm> my personal view is that it often shows up high in the UI, so if you're looking for help, then it's THE most obvious place folks see and hence "it's up here, must be important". I'd suggest just dropping it down the UI below lists or something and see what happens.
[01:38] <wgrant> Hm
[01:38] <wgrant> AJAX batchnaving probably shouldn't calculate the total every time.
[01:43] <lifeless> wgrant: why not?
[01:44] <wgrant> Because it's pointless?
[01:44] <lifeless> batch lengths are dynamic
[01:44] <lifeless> some collections more so than others
[01:45] <wgrant> And their accuracy is probably not particularly critical. I'm not sure the client even respects it if it changes.
[01:46] <lifeless> mmm, if a collection zeros out, it will get a bug report if we don't update it
[01:46] <lifeless> I'm fairly sure gmail updates theirs, for instance.
[01:46] <lifeless> Lets not paint ourselves into a corner either way.
[01:46] <StevenK> lifeless: Oh sure, because gmail does it is a reason we should?
[01:46] <lifeless> also, how to stop users reporting bugs
[01:46] <lifeless> StevenK: gmail is a paginated ajax app with years of experience dealing with users and user expectations.
[01:47] <lifeless> StevenK: observing what it does is merely one data source we should use. Not using it would be foolish.
[01:47] <StevenK> lifeless: You hit a nerve.
[01:48] <lifeless> StevenK: tl;dr - yes, because gmail does it *is* /a/ reason we should do it, transitively, because they also are trying to keep support costs down and user satisfaction up
[01:48] <lifeless> StevenK: Did I now? I didn't mean to. Whats the nerve?
[01:50] <StevenK> wallyworld_: O HAI
[01:50] <wallyworld_> hello
[01:51] <lifeless> anyhow, we know that few people click next anyhow
[01:51] <lifeless> so optimising next() to be faster than first-load is less interesting than making first load faster
[01:51] <StevenK> wallyworld_: I know Friday was a long time ago, but: http://pastebin.ubuntu.com/956524/
[01:51] <wgrant> lifeless: It's more the sorting that I'm hitting it on.
[01:51] <lifeless> wgrant: count() doesn't sort though, does it ?
[01:52] <wgrant> lifeless: No, but changing the sort order of a bug listing does an AJAX request for the new batch, which also returns the count.
[01:52] <wgrant> So rather than 10ms of DB queries there's lotsams.
[01:52] <lifeless> buglistings are a bit weird anyhow, not being an API call and all
[01:52] <wgrant> AJAX batchnavs aren't API calls in general, are they?
[01:53] <wgrant> Only the pickers are.
[01:53] <lifeless> FIIK
[01:53] <lifeless> I would like them to be
[01:53]  * lifeless dreams
[01:53] <wgrant> But ++model++ is awesome layering-violation goodness :)
[01:54] <lifeless> anyhow, the bugs batchnav currently caches too much anyhow, so if the count isn't updating, thats something we can poke deryck to fix at the same time ;)
[01:55] <wgrant> Dammit mawson, vacuum faster
[01:55] <wallyworld_> StevenK: looks good. i would use with FeatureFixture to avoid the separate cleaup call
[01:56] <lifeless> you can also use self.useFixture(..) to avoid cleanup calls.
[01:57] <StevenK> Not in a doctest I can't.
[01:57] <wgrant> ALso 'with FeatureFixture'
[01:57] <lifeless> spelt as f = self.useFixture(MyFixture())
[01:57] <StevenK> I knew what he meant, so meh.
[01:57] <lifeless> hmm, i thought I or someone else had added cleanups support to doctests.
[01:57] <StevenK> wallyworld_: Right, changed to 'with', commiting and pushing
[01:57] <wallyworld_> StevenK: awesome thanks. happy landing
[01:59] <StevenK> wgrant: Finally got around to loading up AA last night. Looks like I have to wait, since 1080p causes my 9500GT to melt.
[01:59] <wallyworld_> lifeless: perhaps. most/all other doctests seem to still use 'with ...'
[01:59] <wgrant> Kill all doctests :)
[02:00] <StevenK> Agreed.
[02:00] <StevenK> I should kill bug-change.txt and merge it into test_bugchanges.py
[02:01] <wallyworld_> some doc tests are good though
[02:02] <StevenK> wallyworld_: LIES
[02:02] <wallyworld_> the ones which are, you know, api documentation are ok
[02:03] <wgrant> That's a slippery slope.
[02:04] <StevenK> Some would argue so was adding doctests.
[02:19] <wgrant> lifeless: You might want to rephrase that self-notification thing to not be stupid
[02:20] <wgrant> lifeless: Currently it complains that the feature to disable bug self-notifications doesn't disable answer notifications, which is clearly an invalid complaint.
[02:20] <wgrant> Perhaps it wants the feature to be extended to all notifications.
[02:30] <lifeless> perhaps; arguably though, a comment on a bug with that option set should not result in a notification
[02:31] <lifeless> the fact we have naive pub-sub based notifications isn't their problem
[02:38] <StevenK> wgrant: Is there anything stopping us jumping to rabbit 2.7.1?
[02:39] <wgrant> No.
[02:39] <lifeless> hippity hop
[02:39] <StevenK> My precise laptop has rabbit held at 2.6.1, and apt keeps yelling at me.
[02:40] <wgrant> Ah, yeah, I should fix that. Might just drop -management for now, since we're not using it yet
[02:50] <StevenK> wgrant: Did you want my help, or you need to sit down and JFDI?
[02:51] <wgrant> I'll hopefully get to it today.
[02:52]  * StevenK tries to figure out how to package auditor up as an egg
[02:52] <lifeless> woo auditor woo
[02:52] <StevenK> Yeah, I know it's been a few weeks
[02:53] <StevenK> Sigh
[02:54] <StevenK> This web page talks about the 3 python files with django projects and then skips straight into setup.py?
[03:53] <wgrant> lifeless: Do you happen to know if the row length quoted by VACUUM FULL VERBOSE includes the tuple header?
[04:01] <lifeless> no
[04:01] <lifeless> also more freaking init discussions on d-d. Sob.
[04:01] <wgrant> Oh yeah
[04:01] <wgrant> Glanced over that this morning and decided I didn't care any more :)
[04:15]  * StevenK stabs apt on his laptop more.
[04:16] <StevenK> The Partial Upgrade message from upgrade-manager is getting tiresome.
[04:42] <wgrant> StevenK: https://code.launchpad.net/~wgrant/meta-lp-deps/no-rabbitmq-management/+merge/104055
[04:42] <spm> http://somethingofthatilk.com/index.php?id=407 <== wgrant
[04:43] <spm> 1 guess for where I see you in that panel
[04:43] <wgrant> Heh
[04:43] <wgrant> That tends to work well for Launchpad, though :)
[04:43] <spm> why do you think I posted it in *this* channel :-D
[04:44] <StevenK> wgrant: r=me
[04:44] <wgrant> lifeless: Can we upgrade to postgres 9.1 tonight? :)
[04:44] <StevenK> Haha
[04:44] <wgrant> StevenK: Thanks.
[04:45] <StevenK> wgrant: Does that fix the 2.6.1 madness or is there another step?
[04:45] <wgrant> That should be that.
[04:45] <lifeless> spm: also hah - http://i.imgur.com/VC9Ye.png
[04:45] <StevenK> That's terrible
[04:45] <lifeless> wgrant: up to stub really; oops report looks decent enough
[04:46] <spm> heh
[04:46] <lifeless> I'd have no concerns about pulling the trigger if mthaddon is happy
[04:46] <StevenK> What about DF?
[04:46] <lifeless> what about tit?
[04:46] <StevenK> Or do we just blow up the DB, get GSA to fiddle packages and then wait 48 hours for an import?
[04:46] <lifeless> you can up grade whenever you like
[04:46] <bigjools> mm tit
[04:47] <wgrant> StevenK: I intend to refresh DF this weekend anyway
[04:47] <bigjools> StevenK: combine with restore from prod
[04:47] <wgrant> So I plan to upgrade to postgres 9.1 at the same time
[04:47] <wgrant> Hopefully part of prod is done before then.
[04:47] <bigjools> I usually refresh when ubuntu is released
[04:48] <wgrant> I considered doing it on Saturday, but we basically need to do it for 9.1 anyway, so might as well wait
[05:08] <stub> In place upgrade is fine too, which will take maybe 30 mins on that hardware plus fiddling time getting postgresql.conf, pg_hba.conf etc. sorted
[05:54] <wgrant> StevenK: r-d-b should have sotred out rabbitmq for you
[05:55] <StevenK> wgrant: I fixed it about 30 seconds after the meta package was published. :-)
[05:55] <wgrant> Heh
[06:47] <StevenK> wallyworld: Your headers branch has hit qas.
[06:48] <StevenK> wallyworld: If you start syncing the staging mailbox right now you should be able to QA the branch on Wednesday morning? :-)
[07:04] <wallyworld> StevenK: :-P
[07:46] <alexh> wgrant: the API is supposed to return a 401 when it requires authorization. strikes me as fairly buggy returning an empty set but a non-zero count
[07:48] <wgrant> alexh: For collections it simply omits the inaccessible items, like a normal search. In this case it's probably a bug that the activity of a public bug requires authentication, but the non-zero count is not a bug.
[07:48] <wgrant> Counting is very expensive; it is not necessarily correct.
[07:49] <alexh> wgrant: also not sure why that requires authentication, attachments, etc, do show up
[07:49] <wgrant> As I said, probably a bug.
[07:49] <alexh> oh, ok
[07:49] <wgrant> But in general, inaccessible items in collections are just hidden.
[07:49] <alexh> wgrant: thanks, I'll give it a try after authenticating
[07:49] <wgrant> Oterhwise pretty much everything would 401 :)
[08:14] <czajkowski> aloha
[08:21] <alexh> hm, also struggling with the auth,
[08:21] <alexh> "The information provided by the remote application was incorrect or incomplete. Because of that we were unable to identify the application which would access Launchpad on your behalf. "
[08:21] <alexh> when visiting the authorize-token page
[08:22] <alexh> I'm sending oauth_consumer_key and oauth_signature{,_method}
[08:22] <alexh> (and I do get an oauth_token back)
[08:23] <wgrant> alexh: Which oauth library are you using?
[08:24] <alexh> none so far, just a regular HTTP post to get the token in the first place
[08:24] <alexh> following https://help.launchpad.net/API/SigningRequests
[08:24] <wgrant> alexh: Any reason not to use launchpadlib?
[08:25] <wgrant> Which does all this for you?
[08:25] <alexh> I'm using ruby, not python
[08:25] <wgrant> Ah
[08:25] <wgrant> What is the URL you're using for authorize-token?
[08:26] <alexh> https://launchpad.net/+authorize-token?oauth_token=MVlGSWMKbZ6GhsBQwV5H
[08:26] <alexh> MVl... being the oauth_token I get back from POSTing to https://launchpad.net/+request-token
[08:32] <alexh> meh, pebkac
[08:32] <wgrant> heh, what was the issue?
[08:33] <wgrant> Just tried it manually, works for me.
[08:33] <alexh> doing GET instead of POST
[08:33] <alexh> sorry
[08:33] <alexh> yea, now that works
[08:33] <wgrant> Great.
[10:06] <alexh> wgrant: you were right, it was indeed missing authentication
[10:41] <jml> rvba: just checking, is your testtools "ContainsAll" equivalent to a (probably hypothetical) "IsSubset"?
[10:43] <rvba> jml: it is indeed.
[10:43] <jml> rvba: ta, will get to the review shortly.
[10:43] <rvba> Cool.
[11:14] <jml> oh wait, it's not
[11:18] <rvba> jml: why?  We're using it on strings so IsSubSet would sounds strange but conceptually it is rather similar.
[11:20] <jml> I'm typing it out in the MP, but I would have guessed from the name & the docstring that self.assertThat(X, ContainsAll(Y)) would mean that Y is a subset of X.
[11:20] <jml> However, it apparently means: for x in X, for all y in Y, y in x
[11:21] <lifeless> meep
[11:21] <lifeless> that is indeed surprising
[11:22] <lifeless> isn't that MatchesAll(Contains(Y)) ?
[11:22] <lifeless> hmm, MatchesListwise(Contains(Y))
[11:22] <jml> MatchesAll(*map(Contains, Y))
[11:24] <lifeless> jml: All? *blink*, well you've read the code.
[11:24] <jml> matchers could probably use a little more algebra
[11:24] <jml> https://code.launchpad.net/~rvb/testtools/testtools-contains-all/+merge/104065
[11:25] <lifeless> I'll read tomorrow, if I should
[11:25] <lifeless> for now, -> sleep
[11:25] <jml> :D
[11:27] <jml> MatchesAll should really be called And or something :\
[11:27] <jml> rvba: http://pastebin.ubuntu.com/957278/ in case you missed it.
[11:28] <rvba> jml: thanks.  I was disconnected indeed.
[11:46] <rvba> jml: now it's my turn to be confused by your review.  "self.assertThat([1, 2, 3], ContainsAll([3, 1]))" is exactly what this matcher does.
[11:46] <rvba> jml: and the tests prove that.
[11:50] <jml> rvba: hmm.
[11:50] <rvba> Maybe the fact that I've written the tests with strings (instead of lists of ints) is confusing.
[11:55] <jml> rvba: hmm, yeah, that and the way the matcher interface tests work
[11:55] <jml> rvba: the problem was that I read this:
[11:55] <jml> +    matches_matches = ['foobar', 'foozbar', 'bar foo']
[11:55] <jml> as this:
[11:55] <jml> +    matches_matches = [['foobar', 'foozbar', 'bar foo']]
[11:55] <rvba> I see.
[11:56] <jml> rvba: ok. sorry for the confusion.
[11:57] <rvba> jml: That's funny because I see testtools as a (really nice) was to have nice tests… and the way testtools tests itself is not really clear ;).  I was myself confused by this matcher interface thingy.
[11:57] <rvba> Maybe that's a chicken and egg problem :)
[11:58] <jml> rvba: yeah. sorry about that.
[11:58] <jml> rvba: in this case, no.
[11:59] <rvba> jml: that's all right.  As the creator/maintainer of testtools, you've earned my gratitude ;).  I'm a happy user.
[11:59] <jml> rvba: I think the matcher interface tests are one of the things that make perfect sense once you've figured them out. could probably be made a bit more approachable.
[11:59] <rvba> Right.
[12:00] <rvba> There is quite a bit of code which uses it so it's easy enough to understand how it works though.
[12:01] <jml> crap crap crap
[12:01] <jml> late for something.
[12:01] <jml> brb
[14:11] <jml> rvba: back. and have replied.
[14:13] <rvba> jml: ta.  I'll fix the code as you suggest.
[14:13] <jml> rvba: thanks.
[14:34] <sinzui> jcsackett, Do you have time to review https://code.launchpad.net/~sinzui/launchpad/progressive-enhancement-ftw-2/+merge/103970
[14:35] <sinzui> jcsackett, I am waiting for allergy medication to work. I do feel very useful at the moment
[14:43] <czajkowski> jcsackett: ello ello
[14:43] <czajkowski> sinzui: oh hope you feel better
[14:44] <sinzui> czajkowski, I am going to write something for the blog today. Danhg and yourself and ensure it makes sense
[14:44] <czajkowski> danhg is off but I can look over it
[15:12] <jcsackett> czajkowski: hello. :-)
[15:12] <jcsackett> sinzui: sure, i can review.
[15:12] <jcsackett> ...and he signs off just before that makes it through.
[15:34] <jcsackett> sinzui: r=me on that branch.
[15:35] <sinzui> thank you
[16:24] <cjwatson> I'm working on bug 990219 and could use some advice on security.  I think it would be reasonable for build scores to be editable only by launchpad-buildd-admins (an existing celebrity), rather than allowing the owner of a packageset to give themselves arbitrary bonuses (since build scores arbitrate access to a global resource, while packagesets are more local than that).  Is the right way to do this to create a new ...
[16:24] <_mup_> Bug #990219: Reprioritize package build scores based on packageset <feature> <packagesets> <soyuz-build> <Launchpad itself:Triaged by cjwatson> < https://launchpad.net/bugs/990219 >
[16:24] <cjwatson> ... interface that just has the score setter in it, and add a new class for that in security.py?
[16:25] <cjwatson> IPackagesetBuild or something
[16:54] <cjwatson> Or should I be using some specialised permission like launchpad.Moderate or something for that instead?
[17:13] <sinzui> cjwatson, We want to normalise the check to a permission like launchpad.Moderate or launchpad.Admin where we check for membership/identity of the celebrity
[17:14] <sinzui> cjwatson, We have had trouble with this in the past when the object/interface has many users working with it. I do not think that is the case here
[17:15] <cjwatson> The thing I'm unsure about is that this is a permission applied to only one member of Packageset; most of the other members want to work with the packageset owner
[17:15] <cjwatson> I'm not clear on how best to express this
[17:15] <sinzui> yes, this does get tricky
[17:15] <cjwatson> I suppose it could be launchpad.Admin since that's currently unused for Packageset, but it seems like a hack
[17:17] <sinzui> cjwatson, maybe not. Does this celebrity have more knowledge and and skill than a member of Launchpad Admin?
[17:18] <cjwatson> Yes, this celebrity consists of people at the coal-face of running buildds
[17:18] <sinzui> There are several permission in security.py where membership in one of several teams suffices, and we might think of ~registry as equivalent as ~admin for example?
[17:18] <cjwatson> Oh, that wasn't what I meant
[17:19] <cjwatson> AdminByBuilddAdmin already exists, that much is fine
[17:19] <cjwatson> What I meant was is that it seems like a hack to use launchpad.Admin on IPackageset to control access to setting score, because at some point somebody might want to use launchpad.Admin on IPackageset for something more central to its functionality
[17:19] <cjwatson> Or at least something with different requirements
[17:20] <sinzui> I see
[17:20] <cjwatson> So I was wondering if I ought to break out a separate interface for this, and if there are any similar patterns elsewhere I could look to
[17:21] <cjwatson> Maybe I'm just borrowing trouble and should apply YAGNI?
[17:22] <sinzui> cjwatson, I do not see .Moderate used and I think that is appropriate if the celeb has limited control of some properties
[17:22] <cjwatson> OK, thanks, I'm happy with that
[18:35] <rick_h_> abentley: ping, can I borrow some eyeballs for a sec?
[18:35] <abentley> rick_h_: sure.
[18:35] <rick_h_> abentley: http://paste.mitechie.com/show/653/
[18:36] <rick_h_> abentley: so trying to move tests from doctest to unit tests and moving this exception to assertRaises, but it's still blwoing up the test and I can't see why here
[18:37] <abentley> rick_h_: That's surprising.
[18:37] <rick_h_> ok, just wondering if I've got a case of the Monday's and I'm blind to something
[18:38] <abentley> rick_h_: An alternative way to express this is testtools.testcase.ExpectedException.  It's a ContextManager, so you can write the code a bit more naturally.
[18:38] <rick_h_> ah ok, I tried to use the unittest context mgr but it's py2.7 only
[18:38] <rick_h_> I'll check that out, thanks
[18:39] <abentley> rick_h_: e.g. http://pastebin.ubuntu.com/958176/
[18:41] <rick_h_> abentley: awesome, that passed
[18:41] <abentley> rick_h_: So the thing is that Unauthorized is generated by attempts to *access* transitionToStatus, not by attempts to *execute* it.
[18:42] <rick_h_> ic, so maybe the unittest assertion is wired a bit wrongly to catch that case
[18:42] <abentley> rick_h_: Yes.
[18:42] <rick_h_> abentley: very cool, thanks again. Headache averted wahoo!
[18:43] <abentley> rick_h_: Or you can pass in getattr as the callee.  E.g. assertRaises(Unauthorized, getattr, upstream_task, "transitionToStatus")
[18:44] <rick_h_> ah, gotcha. That shows it a bit better. Makes more sense.
[18:47] <abentley> rick_h_: Although I think it would be far more intuitive, zope.security doesn't provide a way to defend against execution, which is why the restrictions on methods are actually permissions on accessing the methods.
[22:21] <lifeless> sinzui: hey, got a few minutes to chat about contact this user ?
[22:22] <StevenK> lifeless: We are on our stand up, feel free to join.
[22:23] <lifeless> ok, though I don't want to chew up all your times
[22:23] <lifeless> bah, plurals hard
[22:25] <sinzui> wallyworld_, I cannot think, but I recall the examples in this page was not good enough: maybe You can make this work for staging inbox for date range: http://stackoverflow.com/questions/3180891/imap-deleting-messages
[22:26] <wallyworld_> thanks, will look
[22:43] <sinzui> pause@!
[22:43] <sinzui> I have no mumble
[22:58]  * StevenK stabs buildout
[22:58] <StevenK> It's been running for eight minutes with no output.
[23:01] <StevenK> wgrant: The privacy portlet contains the code for changing the background colour of ... well, any privacy portlet.
[23:01] <StevenK> Sigh, privacy javascript
[23:02] <wgrant> StevenK: That should all die.
[23:02] <wgrant> It's not used any more.
[23:04] <StevenK> wgrant: Do you think it's worth writing a test for, or just rip it out and see that nothing breaks?
[23:04] <StevenK> Oh, look at that. buildout now takes twelve minutes. :-(
[23:24]  * StevenK attempts to get wgrant's attention again.
[23:25] <wgrant> StevenK: Writing a test for the absence of some code is silly.
[23:25] <wgrant> YOu must have a nice CPU, if a fresh buildout only takes 12 minutes
[23:26] <StevenK> wgrant: I upgraded to Precise yesterday afternoon, still watching for issues. That could be one.
[23:27] <StevenK> The only on-going issue is that gnome-do has broken into tiny pieces.
[23:29] <wgrant> StevenK: Oh, that'll probably mean you're building with 2.7 now, if you weren't already.
[23:29] <StevenK> Ah ha
[23:30] <lifeless> yay 429 is official
[23:30] <StevenK> lifeless: Hm?
[23:30] <lifeless> http://www.rfc-editor.org/rfc/rfc6585.txt
[23:31] <StevenK> The loss of gnome-do is affecting my muscle memory :-(
[23:32] <wgrant> lifeless: Ah, finally.
[23:44] <StevenK> wallyworld_: Due to wgrant being a little preoccupied, do you want to quickly review https://code.launchpad.net/~stevenk/launchpad/privacy-portlet-colour-change/+merge/104188 ?
[23:44] <wallyworld_> StevenK: sure.
[23:44] <wgrant> wallyworld_: Thanks
[23:44] <wallyworld_> StevenK: do you recall, on qas the bug notification scripts are now run via cron right?
[23:45] <StevenK> wallyworld_: I don't, I'm afraid.
[23:46] <wallyworld_> StevenK: do we know why the recent privacy portlet changes triggered this bug? were we not calling hide_privacy_notification() before?
[23:48] <StevenK> wallyworld_: It does call it.
[23:49] <wallyworld_> StevenK: so why is the issue showing up now and not before the info type ui changes?
[23:49] <StevenK> I seem to recall jcsackett being involved in turning that off, but I'm not certain what he did.
[23:51] <wallyworld_> StevenK: np. i just wanted to be extra cautious deleting code we were not 100% sure of
[23:52] <StevenK> wallyworld_: wgrant is certain it should die, at least.
[23:53] <wgrant> wallyworld_, StevenK: That code dates from back when the privacy banner was hideable.
[23:53] <wgrant> You could click X on it and it would hide, and turn the privacy portlet red instead.
[23:53] <wgrant> That went away when hiding was disabled, but the code was never removed.
[23:53] <wgrant> However.
[23:53] <wgrant> We should track down why this is only showing up now.
[23:56] <StevenK> wgrant: Ah ha.
[23:56] <wgrant> The old privacy switching code doesn't have that bug.
[23:56] <StevenK> wgrant: The hide JS looks for .portlet.private, and the legacy code changes the portlet class to public before calling that hide code.
[23:56] <wallyworld_> StevenK:  ok. r=me
[23:56] <wgrant> Ah
[23:56] <wgrant> Erm.
[23:56] <wgrant> Wut?
[23:57] <StevenK> wgrant: var privacy_portlet = Y.one('.portlet.private');
[23:57] <StevenK> wgrant: That's in the privacy JS
[23:57] <wgrant> I was wuting at the message from wallyworld followed less than a second later by a 180s timeout
[23:57] <StevenK> Ah
[23:58] <wgrant> StevenK: That's what I suspected, except I was expecting body.private instead of .portlet.private
[23:58] <StevenK> Yes, that is somewhat interesting.
[23:58] <wallyworld_> wgrant: i docked the laptop and that hickups the network for some reason
[23:58] <StevenK> wallyworld_: I'm not sure if you saw my explanation as to why this code is being hit now.
[23:59] <wallyworld_> StevenK: no, missed it
[23:59] <StevenK> [09:56] < StevenK> wgrant: The hide JS looks for .portlet.private, and the legacy code changes the portlet class to public before calling that hide code.