← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~rharding/launchpad/private_sprites into lp:launchpad

 

Richard Harding has proposed merging lp:~rharding/launchpad/private_sprites into lp:launchpad.

Commit message:
Add new dual wide privacy sprites for use in branches, blueprints, and products.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1056893 in Launchpad itself: "Specification privacy: no "private content" header on +upcomingwork page with private data"
  https://bugs.launchpad.net/launchpad/+bug/1056893

For more details, see:
https://code.launchpad.net/~rharding/launchpad/private_sprites/+merge/134347

= Summary =

There's a lack of indication about which items are non-public when viewing
lists of artifacts.

After discussing we're not going to add the privacy banner any time there's
anything non-public on the page.

This does not fix all displays of artifacts, however it provides an easy way
to identify and update future views that need updating as they're discovered.

== Pre Implementation ==

Talked with Curtis and Deryck about how best to implement a UI for indicating.

== Implementation Notes ==

Adds new sprite images for private versions of the blueprint, branch, product,
and project icons. This includes original .svg and saved .png images.

Adds the larger sprites to the css in block-sprites-1.css.in per Curtis.

We try to automate and hit most cases by updating tales.py to use
context.private to determine if the private class is added for each object
when required.

Note that we add the private based on the general rule "the context is
private". We only added the sprites for the uses we actually need. It's
completely harmless for the others to have the private class without css rules
to engage it.

== Tests ==

Updated existing tests that run into the private class.

lib/lp/app/doc/tales.txt
lp/app/tests/test_tales

-- 
https://code.launchpad.net/~rharding/launchpad/private_sprites/+merge/134347
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~rharding/launchpad/private_sprites into lp:launchpad.
=== modified file 'lib/canonical/launchpad/icing/block-sprites-1.css.in'
--- lib/canonical/launchpad/icing/block-sprites-1.css.in	2012-06-02 03:10:14 +0000
+++ lib/canonical/launchpad/icing/block-sprites-1.css.in	2012-11-14 18:17:22 +0000
@@ -21,3 +21,25 @@
     background-image: url(/@@/info-large.png); /* sprite-ref: icon-sprites */
     background-repeat: no-repeat;
     }
+
+/* Add some wider 30px images for indicating a private artifact. */
+.blueprint.private {
+    background-image: url(/@@/blueprint-private.png); /* sprite-ref: icon-sprites */
+    padding-left: 32px;
+    }
+.blueprint-undefined.private {
+    background-image: url(/@@/blueprint-undefined-private.png); /* sprite-ref: icon-sprites */
+    padding-left: 32px;
+    }
+.product.private {
+    background-image: url(/@@/product-private.png); /* sprite-ref: icon-sprites */
+    padding-left: 32px;
+    }
+.project.private {
+    background-image: url(/@@/project-private.png); /* sprite-ref: icon-sprites */
+    padding-left: 32px;
+    }
+.branch.private {
+    background-image: url(/@@/branch-private.png); /* sprite-ref: icon-sprites */
+    padding-left: 32px;
+    }

=== added file 'lib/canonical/launchpad/images/blueprint-private.png'
Binary files lib/canonical/launchpad/images/blueprint-private.png	1970-01-01 00:00:00 +0000 and lib/canonical/launchpad/images/blueprint-private.png	2012-11-14 18:17:22 +0000 differ
=== added file 'lib/canonical/launchpad/images/blueprint-undefined-private.png'
Binary files lib/canonical/launchpad/images/blueprint-undefined-private.png	1970-01-01 00:00:00 +0000 and lib/canonical/launchpad/images/blueprint-undefined-private.png	2012-11-14 18:17:22 +0000 differ
=== added file 'lib/canonical/launchpad/images/branch-private.png'
Binary files lib/canonical/launchpad/images/branch-private.png	1970-01-01 00:00:00 +0000 and lib/canonical/launchpad/images/branch-private.png	2012-11-14 18:17:22 +0000 differ
=== added file 'lib/canonical/launchpad/images/product-private.png'
Binary files lib/canonical/launchpad/images/product-private.png	1970-01-01 00:00:00 +0000 and lib/canonical/launchpad/images/product-private.png	2012-11-14 18:17:22 +0000 differ
=== added file 'lib/canonical/launchpad/images/project-private.png'
Binary files lib/canonical/launchpad/images/project-private.png	1970-01-01 00:00:00 +0000 and lib/canonical/launchpad/images/project-private.png	2012-11-14 18:17:22 +0000 differ
=== added file 'lib/canonical/launchpad/images/src/blueprint-private.svg'
--- lib/canonical/launchpad/images/src/blueprint-private.svg	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/images/src/blueprint-private.svg	2012-11-14 18:17:22 +0000
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   width="30"
+   height="14"
+   sodipodi:docname="blueprint-private.svg"
+   inkscape:export-filename="/var/lib/lxc/lpdev/rootfs/home/ubuntu/launchpad/lp-branches/devel/lib/canonical/launchpad/images/blueprint-private.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="958"
+     inkscape:window-height="1059"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="12.113024"
+     inkscape:cx="16.075462"
+     inkscape:cy="7.0017203"
+     inkscape:window-x="960"
+     inkscape:window-y="19"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAN1JREFU
+KJFj/P//P8O0vQz/GQiALGcGRmQ+C4zhoo1b056rmGIsyJwZ+3BrLloGcVVfFMRmFnQFUZa4NS87
+jsXGP38Rgi3zcGsOqIXYDNf4Dy14CoJxa56wFtnGf5gGvPuMqUmIF82p/6Aaf/1BVViD5uxp+Wga
+0Z385y8Dw7cfDAxVUajysLCAazxxF1Xi1x8Ghm8/If5hYED4GeYiFgYGRKooWsbwH9nGL98ZGFK8
+IPwv33HYCAPbLiI59Se6LA6NsFQRUMvw/98/BgYNWUyNsEDEsBEGluzBJQMBAOGOVJH4JeTsAAAA
+AElFTkSuQmCC
+"
+     id="image10"
+     x="0"
+     y="0" />
+  <image
+     y="0.49163899"
+     x="16.147388"
+     id="image3068"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAS9JREFU
+KJGt0L9Kw1AUBvAvaSoEU9vgJq2DiA4ODooP4CQu4qB0chG6uLj6AP55ApfiIjgojg4ObQUdu6il
+i9VXKElI0mty77kOItyUm06e7YPvx7n3GBib2/ubbdMsXkiiZQAwDeODkzyp79Uf1J6hhmbzcq1Q
+nHpaXFoolctlAIDvBxgMPkPxnWw2Gkfdv66pwjCKT6u1uRIRod3qRO1WJyISmK9VnXAUn6ndDOSC
+b7iui957309ZspuyZKf32gsqbgXEaV3tWmogIieIPMRR5Nh26Xk4HEqYo+kg9CBIONo/vt1Bjh9K
+N6v7vyazcWXraiLqPx7mPFUw8OBai6yZg2xWgyQGwX0tLBDLhyQYeKqHlpgABTFw7mmhmLQRksOe
+PdZCSJ4Pv17O9eg/5wcczoJwmRaCBQAAAABJRU5ErkJggg==
+"
+     height="14"
+     width="14" />
+</svg>

=== added file 'lib/canonical/launchpad/images/src/blueprint-undefined-private.svg'
--- lib/canonical/launchpad/images/src/blueprint-undefined-private.svg	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/images/src/blueprint-undefined-private.svg	2012-11-14 18:17:22 +0000
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   width="30"
+   height="14"
+   sodipodi:docname="blueprint-undefined-private.svg"
+   inkscape:export-filename="/var/lib/lxc/lpdev/rootfs/home/ubuntu/launchpad/lp-branches/devel/lib/canonical/launchpad/images/blueprint-undefined-private.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="958"
+     inkscape:window-height="404"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="1"
+     inkscape:cx="7"
+     inkscape:cy="7"
+     inkscape:window-x="0"
+     inkscape:window-y="19"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAPpJREFU KJGFkr1qAkEUhb8FK9Ps+CSBaLERokIgZQoLm3RpbPI0adKkS5MinSgokh+QLXaFLS0i+BIKzjC7 KcIss8yOnmrumftxLjM3AHh5fS44o/HjU2DXDXOI2pEXitPY8Rp2sfnd1IIiFLx/vBUAo+FD4IAA 7cuONznNkvpEo+1u60luMV9OCy8IcNMdeJN/Vp9+EOBw2Dtes3nhH9XWbDGp1MP70WlQ6xylFLf9 O8evgHEaI0JRNuS5Rqkj36svAHrdfumXoNkK81emQUpJ1LkGQErpgrbSLEGELbTWZXN11H8wcG6A +XJaXJ1YhHWW+B9nbW1Jnf4AT/9c1I1MbFEAAAAASUVORK5CYII= "
+     id="image10"
+     x="0"
+     y="0" />
+  <image
+     y="0.49541569"
+     x="16.099518"
+     id="image3068"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAS9JREFU KJGt0L9Kw1AUBvAvaSoEU9vgJq2DiA4ODooP4CQu4qB0chG6uLj6AP55ApfiIjgojg4ObQUdu6il i9VXKElI0mty77kOItyUm06e7YPvx7n3GBib2/ubbdMsXkiiZQAwDeODkzyp79Uf1J6hhmbzcq1Q nHpaXFoolctlAIDvBxgMPkPxnWw2Gkfdv66pwjCKT6u1uRIRod3qRO1WJyISmK9VnXAUn6ndDOSC b7iui957309ZspuyZKf32gsqbgXEaV3tWmogIieIPMRR5Nh26Xk4HEqYo+kg9CBIONo/vt1Bjh9K N6v7vyazcWXraiLqPx7mPFUw8OBai6yZg2xWgyQGwX0tLBDLhyQYeKqHlpgABTFw7mmhmLQRksOe PdZCSJ4Pv17O9eg/5wcczoJwmRaCBQAAAABJRU5ErkJggg== "
+     height="14"
+     width="14" />
+</svg>

=== added file 'lib/canonical/launchpad/images/src/branch-private.svg'
--- lib/canonical/launchpad/images/src/branch-private.svg	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/images/src/branch-private.svg	2012-11-14 18:17:22 +0000
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   width="30"
+   height="14"
+   sodipodi:docname="branch-private.svg"
+   inkscape:export-filename="/var/lib/lxc/lpdev/rootfs/home/ubuntu/launchpad/lp-branches/devel/lib/canonical/launchpad/images/branch-private.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="958"
+     inkscape:window-height="1059"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="16.857143"
+     inkscape:cx="7"
+     inkscape:cy="7"
+     inkscape:window-x="960"
+     inkscape:window-y="19"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAkhJREFU
+KJFtUl1IU3EU//3vvu7udp2roVi60QyywIciQgkxXZtS+WJfKMlWRgia6UMfhE8RWNAHMSUrKFtu
+RBNnDxtbjI0wioqkGIFEmaWkFqS1zW13u7s9mKJz5+38PuCc3zkEWcrtNKlG3iTsMinZkKeh6ls7
+AxOZGpIJOG1G9dsP3NM2C1uhYin02sLjDE1qOs4FPq/UUSubYYdJ/S7EeTqa2YroAiCVAO0WVh9P
+CMGbV6u3ZDUO2oy5r98n3J3NOWXJJIXLVjEcrjhoGUG7hS2MJQT/9SvVW1cZQy/3MaMfOVebmS1X
+qyj0DwJcUgTviAJjnxYglRKcNrOFsVjad9dqKAYA6rmnlra7oo9bjrF78jUihKNp8NxfAMB6Nowv
+438AAHKa4MyJnKKpaf7Z7VsGrUirK+w9fkTZWFQgBgDQMoJNOgn8L8TYpo/C0qBZ3ksiJigtkard
+gdguihBSk68RZbsKRsdy8fVbbBU284sHzwuvKEaOOmt/eCaZEpZJ0f/IBAF4NASk04vcxFQKD5wR
+1+H9TBd1visYkkhg6nkY/rlkltMEgiCgcscs8tZxmJ+L4PuPFPoGwr7WJmVjudGboADg7MVgiOdR
+e8cemeV5QMkQFG+cg7aAR4tZhViSQd9AxF9ZRh/avNMTX/M53ZeqShUM8Z1qUBaIxYujTk7zuOeI
++A7slR/cXeONLmnXvNy17qoSWka8J4+yusnpFO4/iQybKujGqjrfqpTWGAGg54ZBLwjC0O/5dKCp
+XnFBv93NZWr+ARd22wreYIAbAAAAAElFTkSuQmCC
+"
+     id="image10"
+     x="0"
+     y="0" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAS9JREFU KJGt0L9Kw1AUBvAvaSoEU9vgJq2DiA4ODooP4CQu4qB0chG6uLj6AP55ApfiIjgojg4ObQUdu6il i9VXKElI0mty77kOItyUm06e7YPvx7n3GBib2/ubbdMsXkiiZQAwDeODkzyp79Uf1J6hhmbzcq1Q nHpaXFoolctlAIDvBxgMPkPxnWw2Gkfdv66pwjCKT6u1uRIRod3qRO1WJyISmK9VnXAUn6ndDOSC b7iui957309ZspuyZKf32gsqbgXEaV3tWmogIieIPMRR5Nh26Xk4HEqYo+kg9CBIONo/vt1Bjh9K N6v7vyazcWXraiLqPx7mPFUw8OBai6yZg2xWgyQGwX0tLBDLhyQYeKqHlpgABTFw7mmhmLQRksOe PdZCSJ4Pv17O9eg/5wcczoJwmRaCBQAAAABJRU5ErkJggg== "
+     id="image10-4"
+     x="16.016949"
+     y="0.47457626" />
+</svg>

=== added file 'lib/canonical/launchpad/images/src/product-private.svg'
--- lib/canonical/launchpad/images/src/product-private.svg	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/images/src/product-private.svg	2012-11-14 18:17:22 +0000
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   width="30"
+   height="14"
+   sodipodi:docname="product-private.svg"
+   inkscape:export-filename="/var/lib/lxc/lpdev/rootfs/home/ubuntu/launchpad/lp-branches/devel/lib/canonical/launchpad/images/product-private.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="958"
+     inkscape:window-height="528"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="16.857143"
+     inkscape:cx="14.556855"
+     inkscape:cy="7"
+     inkscape:window-x="960"
+     inkscape:window-y="19"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAgBJREFU
+KJGFkstrE1EUh7+Z3JmGTJqUklIfraSpUGwRGsHHQhdaNAsJBN2IlK4Fd4JC/QPqQnAjgusudKVW
+unThxo0ra2nBPm3E2mLbaDOZZG5m5l4XUqXE4tmdH3yc73CO8fROaTxZWZjgP1XrHLh/69HUg71e
+JH8sTWQGhuk6PnwgtLU8A4uzE8BfEK3IDZ3i2/sXRM16CxSzE+TOXmd7YWZfLgAc26BD+CDMf8zz
+cWyjJRUH6VXTg+wcLVBr68ZoxjBH7jFZOlIcKxWmDwS/91zF77tCfugE6fYUqJDyZoVPK5+fP5t+
++/hm8eJ4i5vn9BHkClw4d4ZUKoFSEX7VI51OcXr4pGNZsduTL9+cNwE2KiFzZclcWfLlUJHebI6f
+9ZCa26DqbdOo19jcWAfDoL8/225Z4qH4OjjKpZFR2vIFAD4u7ZB0HHzZIGpKHDsklUkhKwLP92l3
+kgQqygsArTRRFO1T1lpjmaCUQmuNBlSk0VoDYAIEYYAvG/iyQSIu2HVd2mybilsHGcMNJJWGQcyy
+qLo1LDP2wQQIwwApfaT0SdoBy6trKKXozHRhhBHCitPf00kybrG6VnaDILwr9sDursN/NNe3PGZm
+5+nLHqM3k8EQNjWvzvziSj0Moidj1y6/EwBTr1633DLudOC5u8zb8d87N31My76x9wC/ADvR1s9j
+EloVAAAAAElFTkSuQmCC
+"
+     id="image10"
+     x="0"
+     y="0" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAS9JREFU KJGt0L9Kw1AUBvAvaSoEU9vgJq2DiA4ODooP4CQu4qB0chG6uLj6AP55ApfiIjgojg4ObQUdu6il i9VXKElI0mty77kOItyUm06e7YPvx7n3GBib2/ubbdMsXkiiZQAwDeODkzyp79Uf1J6hhmbzcq1Q nHpaXFoolctlAIDvBxgMPkPxnWw2Gkfdv66pwjCKT6u1uRIRod3qRO1WJyISmK9VnXAUn6ndDOSC b7iui957309ZspuyZKf32gsqbgXEaV3tWmogIieIPMRR5Nh26Xk4HEqYo+kg9CBIONo/vt1Bjh9K N6v7vyazcWXraiLqPx7mPFUw8OBai6yZg2xWgyQGwX0tLBDLhyQYeKqHlpgABTFw7mmhmLQRksOe PdZCSJ4Pv17O9eg/5wcczoJwmRaCBQAAAABJRU5ErkJggg== "
+     id="image10-9"
+     x="15.957627"
+     y="0.53389829" />
+</svg>

=== added file 'lib/canonical/launchpad/images/src/project-private.svg'
--- lib/canonical/launchpad/images/src/project-private.svg	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/images/src/project-private.svg	2012-11-14 18:17:22 +0000
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   width="30"
+   height="14"
+   sodipodi:docname="project-private.svg"
+   inkscape:export-filename="/var/lib/lxc/lpdev/rootfs/home/ubuntu/launchpad/lp-branches/devel/lib/canonical/launchpad/images/project-private.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="958"
+     inkscape:window-height="528"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="16.857143"
+     inkscape:cx="7"
+     inkscape:cy="7"
+     inkscape:window-x="960"
+     inkscape:window-y="19"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAj9JREFU
+KJF1kk9IFGEYxp+d75vZmd2Zcd1tkyT/xaqbpYhkkpFRSBQeYkUvERWEHoI6dAmkQ3Ts4NGoS1rg
+JZOF6iYERkVWhLVZqSysmiVm5M7sn9mdb75Ou5nac3rfl+fH8/Lyuu5e6Rr3JOMRbJSsMWRNYvrC
+vYSnLivrCx1pf31P/2D0UcFCPcl4ZE9dLapaOoocCdauBMJHhqintAJANJMxBpRbg6/6ES16KABU
+tXRg7d04nFwaACBUHlxdezxwe9+NT78456qiaH0PlqKTAEgBFApFAdosl8tlAgAT1eTGOd3WDWAm
+fLVt9ElNxGZOKDrxssLddfPh8En78IXTJ178F/zpCQekQN211v31pETXIXCHxKYm+xYtuWb06bOx
+M13H7giboYy8C05pqORoW7Nb171wGINlpKDqPru1uUkWKekeGZtoEgDg+1oOsYSFWMJC3NsOVZHV
+ha8fD5im5SzPvW788WWqMiOWPgdcCNVUe0SZXKJLDWdxvPMc3C2nAADzS0kEQ3tXLI55w8zY1Q2H
+ut2i2PP2/fTFtKVPeVUVNmN1W1YtyuGghBdbgdAUYxzgfPurKm4RhpmCpvuwsvob1M5fl3xKhSMH
+poko0qRhghIyuyXRr0lY/LZsM+4gsCMouXJ5kRCJaCTbrskS4olEOp9lQ8XEgD/4dy26npudm99Z
+ubtc9JeVQSAi8jbLxGY+Z22bjZ/v6fxAAeD+yMg/qZIkloO4+brROPomZfRyh3kVzTecZ/a9wgP8
+ATm03H7LiX+WAAAAAElFTkSuQmCC
+"
+     id="image10"
+     x="0"
+     y="0" />
+  <image
+     width="14"
+     height="14"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAS9JREFU KJGt0L9Kw1AUBvAvaSoEU9vgJq2DiA4ODooP4CQu4qB0chG6uLj6AP55ApfiIjgojg4ObQUdu6il i9VXKElI0mty77kOItyUm06e7YPvx7n3GBib2/ubbdMsXkiiZQAwDeODkzyp79Uf1J6hhmbzcq1Q nHpaXFoolctlAIDvBxgMPkPxnWw2Gkfdv66pwjCKT6u1uRIRod3qRO1WJyISmK9VnXAUn6ndDOSC b7iui957309ZspuyZKf32gsqbgXEaV3tWmogIieIPMRR5Nh26Xk4HEqYo+kg9CBIONo/vt1Bjh9K N6v7vyazcWXraiLqPx7mPFUw8OBai6yZg2xWgyQGwX0tLBDLhyQYeKqHlpgABTFw7mmhmLQRksOe PdZCSJ4Pv17O9eg/5wcczoJwmRaCBQAAAABJRU5ErkJggg== "
+     id="image10-2"
+     x="16.076271"
+     y="0.41525429" />
+</svg>

=== modified file 'lib/lp/app/browser/tales.py'
--- lib/lp/app/browser/tales.py	2012-11-12 13:45:58 +0000
+++ lib/lp/app/browser/tales.py	2012-11-14 18:17:22 +0000
@@ -738,38 +738,47 @@
         # This should be refactored.  We shouldn't have to do type-checking
         # using interfaces.
         context = self._context
+        sprite_string = None
         if IProduct.providedBy(context):
-            return 'sprite product'
+            sprite_string = 'product'
         elif IProjectGroup.providedBy(context):
-            return 'sprite project'
+            sprite_string = 'project'
         elif IPerson.providedBy(context):
             if context.is_team:
-                return 'sprite team'
+                sprite_string = 'team'
             else:
                 if context.is_valid_person:
-                    return 'sprite person'
+                    sprite_string = 'person'
                 else:
-                    return 'sprite person-inactive'
+                    sprite_string = 'person-inactive'
         elif IDistribution.providedBy(context):
-            return 'sprite distribution'
+            sprite_string = 'distribution'
         elif IDistributionSourcePackage.providedBy(context):
-            return 'sprite package-source'
+            sprite_string = 'package-source'
         elif ISprint.providedBy(context):
-            return 'sprite meeting'
+            sprite_string = 'meeting'
         elif IBug.providedBy(context):
-            return 'sprite bug'
+            sprite_string = 'bug'
         elif IPPA.providedBy(context):
             if context.enabled:
-                return 'sprite ppa-icon'
+                sprite_string = 'ppa-icon'
             else:
-                return 'sprite ppa-icon-inactive'
+                sprite_string = 'ppa-icon-inactive'
         elif IBranch.providedBy(context):
-            return 'sprite branch'
+            sprite_string = 'branch'
         elif ISpecification.providedBy(context):
-            return 'sprite blueprint'
+            sprite_string = 'blueprint'
         elif IBinaryAndSourcePackageName.providedBy(context):
-            return 'sprite package-source'
-        return None
+            sprite_string = 'package-source'
+
+        if sprite_string is None:
+            return None
+        else:
+            if hasattr(context, 'private') and context.private:
+                sprite_string = sprite_string + ' private'
+
+            return "sprite %s" % sprite_string
+
 
     def default_logo_resource(self, context):
         # XXX: mars 2008-08-22 bug=260468
@@ -1029,11 +1038,16 @@
 
     def sprite_css(self):
         """Return the CSS class for the sprite"""
+        sprite_str = "sprite blueprint"
+
         if self._context.priority:
             priority = self._context.priority.title.lower()
-            return "sprite blueprint-%s" % priority
-        else:
-            return "sprite blueprint"
+            sprite_str = sprite_str +  "-%s" % priority
+
+        if self._context.private:
+            sprite_str = sprite_str + ' private'
+
+        return sprite_str
 
     def badges(self):
 

=== modified file 'lib/lp/app/doc/tales.txt'
--- lib/lp/app/doc/tales.txt	2012-11-12 15:54:22 +0000
+++ lib/lp/app/doc/tales.txt	2012-11-14 18:17:22 +0000
@@ -160,7 +160,7 @@
     ...     name='pppa', private=True, owner=owner)
 
     >>> print test_tales("ppa/fmt:link", ppa=private_ppa)
-    <a href="/~joe/+archive/pppa" class="sprite ppa-icon">PPA named pppa
+    <a href="/~joe/+archive/pppa" class="sprite ppa-icon private">PPA named pppa
     for Joe Smith</a>
 
     >>> login(ANONYMOUS)
@@ -1571,7 +1571,7 @@
     >>> login('foo.bar@xxxxxxxxxxxxx')
     >>> myteam = getUtility(IPersonSet).getByName('myteam')
     >>> test_tales("team/fmt:link", team=myteam)
-    u'<a ...class="sprite team"...>My Team</a>'
+    u'<a ...class="sprite team private"...>My Team</a>'
 
     >>> test_tales("team/fmt:displayname", team=myteam)
     u'My Team'
@@ -1583,7 +1583,7 @@
 
     >>> login('owner@xxxxxxxxxxxxx')
     >>> test_tales("team/fmt:link", team=myteam)
-    u'<a ...class="sprite team"...>My Team</a>'
+    u'<a ...class="sprite team private"...>My Team</a>'
 
     >>> test_tales("team/fmt:displayname", team=myteam)
     u'My Team'

=== modified file 'lib/lp/app/tests/test_tales.py'
--- lib/lp/app/tests/test_tales.py	2012-03-02 16:17:46 +0000
+++ lib/lp/app/tests/test_tales.py	2012-11-14 18:17:22 +0000
@@ -236,7 +236,7 @@
 
     def test_can_view_icon(self):
         self._test_can_view_attribute(
-            'icon', '<span class="sprite team"></span>')
+            'icon', '<span class="sprite team private"></span>')
 
 
 class TestObjectFormatterAPI(TestCaseWithFactory):


Follow ups