Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2014-03-12 11:17:00 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-03-12 11:17:00 (GMT)
commitae31651d6ae31215db903530115bf340ae9f98f5 (patch)
tree7d5a5083eee504a74d4b5ca4c249959e83f78392 /sugar_network
parent47be127e9955013ddc5563013ded534cc3952ef1 (diff)
More cleanups
* iterate metadata props in the same order all time; * clear separation between original and posted props in db.Resource; * access to assetes directory from blobs iface.
Diffstat (limited to 'sugar_network')
-rw-r--r--sugar_network/assets/__init__.py19
-rw-r--r--sugar_network/assets/activity.svg68
-rw-r--r--sugar_network/assets/book.svg68
-rw-r--r--sugar_network/assets/favicon.icobin0 -> 1150 bytes
-rw-r--r--sugar_network/assets/group.svg68
-rw-r--r--sugar_network/assets/missing-logo.pngbin0 -> 4073 bytes
-rw-r--r--sugar_network/assets/missing.pngbin0 -> 1566 bytes
-rw-r--r--sugar_network/assets/missing.svg75
-rw-r--r--sugar_network/assets/package-logo.pngbin0 -> 2874 bytes
-rw-r--r--sugar_network/assets/package.pngbin0 -> 1199 bytes
-rw-r--r--sugar_network/assets/package.svg71
-rw-r--r--sugar_network/db/blobs.py24
-rw-r--r--sugar_network/db/directory.py16
-rw-r--r--sugar_network/db/metadata.py6
-rw-r--r--sugar_network/db/resource.py44
-rw-r--r--sugar_network/db/routes.py42
-rw-r--r--sugar_network/model/__init__.py28
-rw-r--r--sugar_network/model/context.py41
-rw-r--r--sugar_network/model/post.py2
-rw-r--r--sugar_network/toolkit/__init__.py5
20 files changed, 499 insertions, 78 deletions
diff --git a/sugar_network/assets/__init__.py b/sugar_network/assets/__init__.py
new file mode 100644
index 0000000..7ad1378
--- /dev/null
+++ b/sugar_network/assets/__init__.py
@@ -0,0 +1,19 @@
+# Copyright (C) 2014 Aleksey Lim
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from os.path import dirname
+
+
+PATH = dirname(__file__)
diff --git a/sugar_network/assets/activity.svg b/sugar_network/assets/activity.svg
new file mode 100644
index 0000000..c5302fd
--- /dev/null
+++ b/sugar_network/assets/activity.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#ffffff">
+ <!ENTITY fill_color "#000000">
+]>
+<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55.125 55"
+ height="55px"
+ id="Layer_1"
+ version="1.1"
+ viewBox="0 0 55.125 55"
+ width="55.125px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="activities.svg"><metadata
+ id="metadata3043"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3041" /><sodipodi:namedview
+ pagecolor="#ffff5f"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1364"
+ inkscape:window-height="725"
+ id="namedview3039"
+ showgrid="true"
+ inkscape:zoom="8.165204"
+ inkscape:cx="39.036816"
+ inkscape:cy="27.452329"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="g3049"><inkscape:grid
+ type="xygrid"
+ id="grid3045"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview><g
+ style="display:inline"
+ inkscape:label="orig"
+ id="g3049"
+ inkscape:groupmode="layer"><rect
+ style="fill:&stroke_color;"
+ id="rect3006"
+ width="51"
+ height="51"
+ x="2"
+ y="2"
+ ry="6.1807232" /><path
+ style="fill:&fill_color;"
+ inkscape:connector-curvature="0"
+ d="m 40.198922,16.862795 q 0,-0.85783 -0.600131,-1.458322 -0.600147,-0.600492 -1.457476,-0.600492 -0.85733,0 -1.457463,0.600492 -0.600136,0.600492 -0.600136,1.458322 0,0.85784 0.600136,1.458331 0.600133,0.600487 1.457463,0.600487 0.857329,0 1.457476,-0.600487 0.600131,-0.600491 0.600131,-1.458331 z M 45,10.686356 q 0,5.340075 -1.618229,9.232518 -1.61823,3.89245 -5.433358,7.731302 -1.736116,1.715676 -4.179526,3.774485 l -0.428689,8.128035 q -0.04283,0.343147 -0.342934,0.557592 l -8.23044,4.803918 Q 24.616786,45 24.423888,45 24.166686,45 23.930913,44.806981 l -1.37172,-1.37253 q -0.278657,-0.300246 -0.171452,-0.686288 l 1.82182,-5.919094 -6.022764,-6.026326 -5.915608,1.822902 q -0.06426,0.02143 -0.192906,0.02143 -0.300069,0 -0.492975,-0.193021 l -1.37172,-1.37253 Q 9.8492312,30.674052 10.106426,30.245118 l 4.801082,-8.235297 q 0.214326,-0.300247 0.557261,-0.34314 l 8.12324,-0.428936 Q 25.645611,18.79289 27.36027,17.055752 31.389762,13.045347 35.033409,11.522656 38.677045,9.999965 44.271206,10 q 0.30007,0 0.514389,0.203757 0.214328,0.203751 0.214328,0.482529 z"
+ id="path2995-9" /></g></svg>
diff --git a/sugar_network/assets/book.svg b/sugar_network/assets/book.svg
new file mode 100644
index 0000000..92fb811
--- /dev/null
+++ b/sugar_network/assets/book.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#ffffff">
+ <!ENTITY fill_color "#000000">
+]>
+<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55.125 55"
+ height="55px"
+ id="Layer_1"
+ version="1.1"
+ viewBox="0 0 55.125 55"
+ width="55.125px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="books.svg"><metadata
+ id="metadata3043"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3041" /><sodipodi:namedview
+ pagecolor="#ffff5f"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1364"
+ inkscape:window-height="725"
+ id="namedview3039"
+ showgrid="true"
+ inkscape:zoom="9.9636364"
+ inkscape:cx="18.33272"
+ inkscape:cy="27.485017"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"><inkscape:grid
+ type="xygrid"
+ id="grid3045"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview><g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Orig"
+ style="display:inline"><rect
+ style="fill:&stroke_color;"
+ id="rect3006"
+ width="51"
+ height="51"
+ x="2"
+ y="2"
+ ry="6.1807232" /><path
+ inkscape:connector-curvature="0"
+ d="m 44.457628,17.975387 q 0.840668,1.298804 0.378314,2.939427 l -5.77965,20.644433 q -0.399316,1.45831 -1.607781,2.449552 Q 36.240046,45.000041 34.873943,45 H 15.475341 q -1.618299,0 -3.121003,-1.219054 -1.502701,-1.219053 -2.091174,-2.99641 -0.5043946,-1.526698 -0.04204,-2.893852 0,-0.09115 0.06304,-0.615248 0.06304,-0.524093 0.08408,-0.843102 0.021,-0.182273 -0.06304,-0.48992 -0.08404,-0.307642 -0.06304,-0.444339 0.04204,-0.25066 0.16812,-0.478512 0.12608,-0.227853 0.346794,-0.535497 0.220714,-0.307646 0.346795,-0.535498 0.483393,-0.865869 0.945749,-2.084963 0.462355,-1.219091 0.630512,-2.084963 0.06305,-0.227852 0.01052,-0.683596 -0.05252,-0.455746 -0.01052,-0.638018 0.06305,-0.250663 0.357276,-0.638018 0.294235,-0.387356 0.357276,-0.524093 0.441356,-0.820292 0.882709,-2.096329 0.441354,-1.276034 0.525434,-2.050789 0.021,-0.205083 -0.05257,-0.729175 -0.07357,-0.524093 0.01052,-0.638018 0.08409,-0.29624 0.462357,-0.695001 0.378277,-0.398762 0.462356,-0.512689 0.399315,-0.592438 0.893227,-1.925457 0.493913,-1.33302 0.577955,-2.198891 0.021,-0.182273 -0.06305,-0.581035 -0.08405,-0.398759 -0.04205,-0.603842 0.04205,-0.182276 0.189157,-0.410167 0.147118,-0.227893 0.378315,-0.524092 0.231196,-0.296199 0.357276,-0.478513 0.168119,-0.273432 0.346795,-0.695002 0.178675,-0.42157 0.315237,-0.797522 0.136562,-0.375952 0.336275,-0.820294 0.199712,-0.444339 0.409834,-0.729173 0.210122,-0.284836 0.556953,-0.535497 0.346831,-0.250661 0.756592,-0.262026 0.409761,-0.01136 0.998307,0.125331 l -0.021,0.06834 Q 22.473973,10 22.747208,10 h 15.993845 q 1.55526,0 2.39593,1.276037 0.84067,1.276035 0.378315,2.962238 l -5.758612,20.644432 q -0.756592,2.711578 -1.502702,3.497697 -0.746109,0.786117 -2.700684,0.786117 H 13.289642 q -0.567472,0 -0.798631,0.341778 -0.231195,0.364588 -0.021,0.979796 0.504396,1.595046 3.026444,1.595046 h 19.398601 q 0.609473,0 1.176945,-0.353182 0.567472,-0.353185 0.735591,-0.945624 l 6.305082,-22.490139 q 0.147118,-0.501282 0.105079,-1.298807 0.798632,0.341779 1.239986,0.979798 z m -22.361969,0.04557 q -0.08408,0.29624 0.04205,0.512688 0.126117,0.216446 0.420354,0.216486 H 35.33634 q 0.273237,0 0.535915,-0.216486 0.262679,-0.216487 0.346795,-0.512688 l 0.441354,-1.45831 q 0.08409,-0.29624 -0.04205,-0.512687 -0.126114,-0.216449 -0.420351,-0.216489 H 23.419725 q -0.273237,0 -0.535916,0.216489 -0.262679,0.216487 -0.346794,0.512687 z m -1.74438,5.83328 q -0.08408,0.29624 0.04205,0.512689 0.126116,0.216446 0.420352,0.216486 h 12.778283 q 0.273235,0 0.535914,-0.216486 0.26268,-0.216489 0.346795,-0.512689 l 0.441354,-1.45831 q 0.08408,-0.29624 -0.04205,-0.512688 -0.126118,-0.216447 -0.420354,-0.216487 h -12.77828 q -0.273234,0 -0.535915,0.216487 -0.262679,0.216489 -0.346794,0.512688 z"
+ id="path2990"
+ style="fill:&fill_color;" /></g></svg>
diff --git a/sugar_network/assets/favicon.ico b/sugar_network/assets/favicon.ico
new file mode 100644
index 0000000..80e42ba
--- /dev/null
+++ b/sugar_network/assets/favicon.ico
Binary files differ
diff --git a/sugar_network/assets/group.svg b/sugar_network/assets/group.svg
new file mode 100644
index 0000000..c9a6b64
--- /dev/null
+++ b/sugar_network/assets/group.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#ffffff">
+ <!ENTITY fill_color "#000000">
+]>
+<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55.125 55"
+ height="55px"
+ id="Layer_1"
+ version="1.1"
+ viewBox="0 0 55.125 55"
+ width="55.125px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="groups.svg"><metadata
+ id="metadata3043"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3041" /><sodipodi:namedview
+ pagecolor="#ffff5f"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1364"
+ inkscape:window-height="725"
+ id="namedview3039"
+ showgrid="true"
+ inkscape:zoom="9.9636364"
+ inkscape:cx="15.364787"
+ inkscape:cy="26.136611"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"><inkscape:grid
+ type="xygrid"
+ id="grid3045"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview><g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Orig"
+ style="display:inline"><rect
+ style="fill:&stroke_color;"
+ id="rect3006"
+ width="51"
+ height="51"
+ x="2"
+ y="2"
+ ry="6.1807232" /><path
+ inkscape:connector-curvature="0"
+ d="m 20.80989,27.5 q -2.953112,0.09765 -4.830743,2.500005 h -2.442693 q -1.494787,0 -2.515621,-0.791021 Q 10,28.417965 10,26.894541 q 0,-6.894521 2.260412,-6.894521 0.109389,0 0.792964,0.410156 0.683576,0.410156 1.777334,0.830087 1.09376,0.419932 2.16927,0.419932 1.221365,0 2.424479,-0.449224 -0.09114,0.722662 -0.09114,1.289054 0,2.714858 1.476571,5.000009 z m 19.523435,12.441406 q 0,2.343736 -1.33072,3.701182 Q 37.671885,45.000034 35.466152,45 H 19.533848 q -2.205733,0 -3.536453,-1.357412 -1.330719,-1.357412 -1.330719,-3.701182 0,-1.035165 0.0638,-2.021489 0.0638,-0.986323 0.255209,-2.128916 0.191406,-1.142592 0.483077,-2.119141 0.291671,-0.976547 0.78384,-1.904287 0.492169,-0.927739 1.130221,-1.582041 0.638054,-0.654302 1.55859,-1.044907 0.920536,-0.390605 2.032543,-0.39064 0.182283,0 0.783839,0.419932 0.601559,0.419931 1.330721,0.937515 0.729162,0.517583 1.950525,0.937514 1.221363,0.419933 2.460942,0.419933 1.239578,0 2.460941,-0.419933 1.221363,-0.419931 1.950525,-0.937514 0.729163,-0.517584 1.33072,-0.937515 0.601558,-0.419932 0.783841,-0.419932 1.111974,0 2.032543,0.39064 0.920567,0.39064 1.558588,1.044907 0.638021,0.654268 1.130221,1.582041 0.492203,0.927773 0.783842,1.904287 0.291638,0.976514 0.483077,2.119141 0.191438,1.142628 0.255208,2.128916 0.06377,0.98629 0.0638,2.021489 z M 21.666657,15.00001 q 0,2.070297 -1.367184,3.535171 -1.367183,1.464873 -3.299493,1.464839 -1.932308,-3.5e-5 -3.299491,-1.464839 -1.367183,-1.464805 -1.367183,-3.535171 0,-2.070366 1.367183,-3.535171 Q 15.067672,10.000034 16.99998,10 q 1.93231,-3.4e-5 3.299493,1.464839 1.367184,1.464873 1.367184,3.535171 z m 12.833339,7.499981 q 0,3.105463 -2.05079,5.302738 -2.05079,2.197276 -4.949221,2.197276 -2.898434,0 -4.949224,-2.197276 -2.05079,-2.197275 -2.05079,-5.302738 0,-3.105464 2.05079,-5.30274 2.05079,-2.197276 4.949224,-2.197276 2.898431,0 4.949221,2.197276 2.05079,2.197276 2.05079,5.30274 z M 45,26.894541 q 0,1.523424 -1.020833,2.314443 -1.020834,0.791021 -2.515621,0.791021 H 39.020853 Q 37.143253,27.597652 34.19011,27.5 q 1.476571,-2.285152 1.476571,-5.000009 0,-0.566393 -0.09114,-1.289053 1.203114,0.449223 2.424479,0.449223 1.07551,0 2.16927,-0.419932 1.093758,-0.419931 1.777334,-0.830087 0.683575,-0.410157 0.792964,-0.410157 Q 45,19.999985 45,26.894507 z M 42.666663,15.00001 q 0,2.070297 -1.367183,3.535171 -1.367183,1.464873 -3.299493,1.464839 -1.93231,-3.5e-5 -3.299492,-1.464839 -1.367183,-1.464805 -1.367183,-3.535171 0,-2.070366 1.367183,-3.535171 Q 36.067677,10.000034 37.999987,10 q 1.93231,-3.4e-5 3.299493,1.464839 1.367183,1.464873 1.367183,3.535171 z"
+ id="path2988"
+ style="fill:&fill_color;" /></g></svg>
diff --git a/sugar_network/assets/missing-logo.png b/sugar_network/assets/missing-logo.png
new file mode 100644
index 0000000..98be121
--- /dev/null
+++ b/sugar_network/assets/missing-logo.png
Binary files differ
diff --git a/sugar_network/assets/missing.png b/sugar_network/assets/missing.png
new file mode 100644
index 0000000..91a65a8
--- /dev/null
+++ b/sugar_network/assets/missing.png
Binary files differ
diff --git a/sugar_network/assets/missing.svg b/sugar_network/assets/missing.svg
new file mode 100644
index 0000000..7e6a568
--- /dev/null
+++ b/sugar_network/assets/missing.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55.125 55"
+ height="55px"
+ id="Layer_1"
+ version="1.1"
+ viewBox="0 0 55.125 55"
+ width="55.125px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="missing.svg"><metadata
+ id="metadata3043"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3041" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1278"
+ inkscape:window-height="703"
+ id="namedview3039"
+ showgrid="true"
+ inkscape:zoom="11.313708"
+ inkscape:cx="22.254646"
+ inkscape:cy="27.69536"
+ inkscape:window-x="0"
+ inkscape:window-y="48"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ showborder="true"><inkscape:grid
+ type="xygrid"
+ id="grid3045"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /><sodipodi:guide
+ orientation="0,1"
+ position="21.375,63.75"
+ id="guide3095" /></sodipodi:namedview><g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Orig"
+ style="display:inline"><g
+ id="g3018"
+ transform="matrix(1.0024382,0,0,1.0033449,-0.06721282,-0.09913801)"
+ style="fill:#e5e5e5;fill-opacity:1"><path
+ inkscape:connector-curvature="0"
+ id="path3014"
+ d="M 7.312668,52.88195 C 6.7099324,52.779031 5.4955186,52.338195 5.0176599,52.048855 4.2658562,51.593644 3.2489622,50.517012 2.8351314,49.738115 2.0161815,48.196716 2.062668,49.534599 2.062668,27.506609 2.062668,5.6552305 2.0232307,6.8739053 2.7786566,5.3814313 3.498485,3.9592864 4.8883161,2.803557 6.4312977,2.3440372 7.264056,2.096031 7.5895024,2.09214 27.500168,2.09214 c 19.910665,0 20.236112,0.00389 21.06887,0.2518972 1.542982,0.4595198 2.932812,1.6152492 3.652641,3.0373941 0.755426,1.492474 0.715989,0.2737992 0.715989,22.1251777 0,22.017872 0.04589,20.691205 -0.768746,22.224531 -0.427042,0.803788 -1.433087,1.870171 -2.178743,2.309416 -0.280494,0.16523 -0.842994,0.427244 -1.25,0.582251 l -0.740011,0.281833 -20.1875,0.01534 c -11.103125,0.0084 -20.328125,-0.0087 -20.5,-0.03802 z"
+ style="fill:#e5e5e5;fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="csssssssssssscscc" /><path
+ inkscape:connector-curvature="0"
+ id="path3016"
+ d="M 24.978969,41.781971 C 16.145314,40.179195 10.799373,30.889246 13.900132,22.52964 c 1.747089,-4.710129 5.756064,-8.166365 10.744487,-9.263088 1.348135,-0.296392 4.362963,-0.296392 5.711098,0 4.894498,1.076073 8.905941,4.469126 10.634216,8.994886 0.585261,1.532597 0.788962,2.39317 0.936335,3.955702 0.698281,7.403629 -4.583521,14.270159 -11.973724,15.566266 -1.266075,0.222047 -3.745807,0.221332 -4.973575,-0.0014 l 0,2e-6 z m -3.452783,-5.086423 c 0.104108,-0.0864 0.415792,-0.633848 0.692631,-1.216546 1.070481,-2.253171 2.963376,-3.511862 5.281351,-3.511862 2.327261,0 4.210227,1.257339 5.291596,3.53343 0.502986,1.058694 0.831835,1.421421 1.333404,1.470764 0.622337,0.06123 0.961284,-0.02897 1.322817,-0.351999 0.785237,-0.701609 0.548547,-2.027396 -0.696221,-3.899794 -1.01576,-1.527921 -2.584326,-2.716596 -4.38378,-3.32207 -3.754919,-1.263443 -7.99672,0.129084 -10.119412,3.32207 -1.189591,1.7894 -1.465414,3.149908 -0.777967,3.837354 0.517901,0.517901 1.517382,0.585317 2.055581,0.138653 l 0,0 z M 23.027949,24.27353 c 1.062891,-0.529661 1.557446,-1.360203 1.562781,-2.624492 0.0074,-1.761863 -1.368456,-3.036782 -3.139072,-2.908708 -2.473463,0.178915 -3.621562,3.064289 -1.968455,4.947074 0.828346,0.943434 2.329588,1.191665 3.544746,0.586126 l 0,0 z m 11.598291,0.08549 c 2.072782,-0.941644 2.229132,-3.980824 0.267195,-5.193796 -1.98621,-1.22798 -4.49363,0.161006 -4.483828,2.483817 0.0036,0.856027 0.137445,1.275425 0.60089,1.883033 0.730373,0.95757 2.458305,1.352759 3.615743,0.826946 l 0,0 z"
+ style="fill:#e5e5e5;fill-opacity:1;stroke:none" /></g><path
+ inkscape:connector-curvature="0"
+ d="m 35.839852,35.087905 q 0.182274,0.569673 -0.09115,1.105131 -0.273431,0.53546 -0.843105,0.717774 -0.569673,0.182315 -1.116536,-0.09116 -0.546864,-0.273471 -0.729179,-0.865874 -0.569672,-1.822906 -2.107742,-2.950848 -1.538069,-1.127941 -3.452132,-1.127941 -1.914063,0 -3.452133,1.127941 -1.538069,1.127942 -2.107742,2.950848 -0.182274,0.592442 -0.717774,0.865874 -0.535499,0.273432 -1.105132,0.09116 -0.592442,-0.182274 -0.865874,-0.717774 -0.273432,-0.535498 -0.09116,-1.105131 0.843105,-2.757169 3.144527,-4.443379 2.301421,-1.686209 5.195324,-1.686209 2.893905,0 5.195326,1.686209 2.301421,1.68621 3.144526,4.443379 z M 24.583328,21.666654 q 0,1.207693 -0.85451,2.062163 -0.854509,0.85447 -2.062163,0.854509 -1.207654,4e-5 -2.062164,-0.854509 -0.85451,-0.854549 -0.85451,-2.062163 0,-1.207615 0.85451,-2.062165 0.85451,-0.854549 2.062164,-0.854509 1.207654,4e-5 2.062163,0.854509 0.85451,0.85447 0.85451,2.062165 z m 11.666692,0 q 0,1.207693 -0.85451,2.062163 -0.85451,0.85447 -2.062163,0.854509 -1.207654,4e-5 -2.062163,-0.854509 -0.85451,-0.854549 -0.85451,-2.062163 0,-1.207615 0.85451,-2.062165 0.854509,-0.854549 2.062163,-0.854509 1.207653,4e-5 2.062163,0.854509 0.85451,0.85447 0.85451,2.062165 z M 42.083327,27.5 q 0,-2.962252 -1.162116,-5.662437 -1.162115,-2.700184 -3.110352,-4.648422 -1.948238,-1.948237 -4.648421,-3.110352 -2.700185,-1.162116 -5.662437,-1.162116 -2.962252,0 -5.662437,1.162116 -2.700184,1.162115 -4.648422,3.110352 -1.948237,1.948238 -3.110352,4.648422 -1.162116,2.700185 -1.162116,5.662437 0,2.962252 1.162116,5.662437 1.162115,2.700184 3.110352,4.648422 1.948238,1.948237 4.648422,3.110352 2.700185,1.162115 5.662437,1.162115 2.962252,0 5.662437,-1.162115 2.700183,-1.162115 4.648421,-3.110352 1.948237,-1.948238 3.110352,-4.648422 Q 42.083327,30.462252 42.083327,27.5 z M 45,27.5 q 0,4.762388 -2.347001,8.784194 Q 40.306,40.306 36.284194,42.653 32.262389,45 27.500001,45 22.737613,45 18.715807,42.653 14.694002,40.306 12.347001,36.284194 10,32.262388 10,27.5 10,22.737612 12.347001,18.715806 14.694002,14.694 18.715807,12.347 q 4.021806,-2.3470003 8.784194,-2.3470003 4.762388,0 8.784193,2.3470003 4.021806,2.347 6.368805,6.368806 Q 45,22.737612 45,27.5 z"
+ id="path3844"
+ style="fill:#ffffff;fill-opacity:1" /></g></svg> \ No newline at end of file
diff --git a/sugar_network/assets/package-logo.png b/sugar_network/assets/package-logo.png
new file mode 100644
index 0000000..c6cf086
--- /dev/null
+++ b/sugar_network/assets/package-logo.png
Binary files differ
diff --git a/sugar_network/assets/package.png b/sugar_network/assets/package.png
new file mode 100644
index 0000000..24bd5ac
--- /dev/null
+++ b/sugar_network/assets/package.png
Binary files differ
diff --git a/sugar_network/assets/package.svg b/sugar_network/assets/package.svg
new file mode 100644
index 0000000..a5fd32d
--- /dev/null
+++ b/sugar_network/assets/package.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55.125 55"
+ height="55px"
+ id="Layer_1"
+ version="1.1"
+ viewBox="0 0 55.125 55"
+ width="55.125px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="package.svg"><metadata
+ id="metadata3043"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3041" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1364"
+ inkscape:window-height="725"
+ id="namedview3039"
+ showgrid="true"
+ inkscape:zoom="8"
+ inkscape:cx="25.537668"
+ inkscape:cy="28.88286"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ showborder="true"><inkscape:grid
+ type="xygrid"
+ id="grid3045"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /><sodipodi:guide
+ orientation="0,1"
+ position="21.375,63.75"
+ id="guide3095" /></sodipodi:namedview><g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Orig"
+ style="display:inline"><rect
+ style="fill:#fdd99b;fill-opacity:1"
+ id="rect3006"
+ width="51"
+ height="51"
+ x="-53"
+ y="2"
+ ry="6.1807232"
+ transform="scale(-1,1)" /><path
+ inkscape:connector-curvature="0"
+ d="m 21.272799,37.045483 q 0,-1.107944 -0.809649,-1.917636 -0.80965,-0.809686 -1.917636,-0.809649 -1.107979,3.6e-5 -1.917628,0.809649 -0.80965,0.809613 -0.80965,1.917636 0,1.108022 0.80965,1.917635 0.809649,0.809614 1.917628,0.809649 1.107986,3.6e-5 1.917636,-0.809649 0.809649,-0.809686 0.809649,-1.917635 z M 13.090987,26.136378 h 8.181855 v -5.454569 h -3.366501 q -0.277004,0 -0.468734,0.191772 l -4.154854,4.154854 q -0.191766,0.191765 -0.191766,0.468734 v 0.639209 z m 27.272772,10.909105 q 0,-1.107944 -0.80965,-1.917636 -0.80965,-0.809686 -1.917635,-0.809649 -1.107986,3.6e-5 -1.917636,0.809649 -0.809649,0.809613 -0.809649,1.917636 0,1.108022 0.809649,1.917635 0.80965,0.809614 1.917636,0.809649 1.107985,3.6e-5 1.917635,-0.809649 0.80965,-0.809686 0.80965,-1.917635 z m 5.45457,-23.181866 v 21.818244 q 0,0.319583 -0.08524,0.564634 -0.08524,0.245052 -0.287631,0.394159 -0.202393,0.149114 -0.35158,0.245016 -0.149185,0.09591 -0.500729,0.12786 -0.351543,0.03198 -0.479396,0.04259 -0.12786,0.01069 -0.543315,0 -0.415448,-0.01069 -0.479397,-0.01069 0,2.258515 -1.598009,3.856561 -1.59801,1.598045 -3.85656,1.598009 -2.258552,-3.6e-5 -3.856562,-1.598009 -1.598009,-1.597973 -1.598009,-3.856561 h -8.181854 q 0,2.258515 -1.59801,3.856561 -1.598008,1.598045 -3.856562,1.598009 -2.258541,-3.2e-5 -3.856557,-1.598004 -1.59801,-1.597974 -1.59801,-3.856562 h -1.363621 q -0.06388,0 -0.479395,0.01069 -0.415493,0.01069 -0.543318,0 -0.127816,-0.01069 -0.479394,-0.04259 Q 9.8736003,36.981554 9.72445,36.885674 9.5753064,36.789764 9.372871,36.640654 9.1704416,36.491547 9.08524,36.246495 9.000042,36.001444 9,35.681861 q 0,-0.553979 0.4048281,-0.9588 0.404821,-0.404827 0.9587929,-0.404827 v -6.818191 q 0,-0.170441 -0.01069,-0.745745 -0.01069,-0.575298 0,-0.809649 0.01069,-0.234346 0.05328,-0.735075 0.04259,-0.500729 0.13848,-0.78836 0.09586,-0.28763 0.298299,-0.649872 0.20243,-0.362248 0.479397,-0.639217 l 4.218767,-4.218766 q 0.40483,-0.404821 1.075991,-0.681825 0.671169,-0.277011 1.246473,-0.277011 h 3.40911 v -4.090906 q 0,-0.553972 0.404829,-0.958799 0.404821,-0.404822 0.9588,-0.404822 h 21.818236 q 0.553979,0 0.958801,0.404822 0.404827,0.404827 0.404827,0.958799 z"
+ id="path4"
+ style="fill:#816647" /></g></svg> \ No newline at end of file
diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py
index 084ffde..cfbe517 100644
--- a/sugar_network/db/blobs.py
+++ b/sugar_network/db/blobs.py
@@ -20,7 +20,7 @@ import mimetypes
from contextlib import contextmanager
from os.path import exists, abspath, join, dirname, isdir
-from sugar_network import toolkit
+from sugar_network import toolkit, assets
from sugar_network.toolkit.router import File
from sugar_network.toolkit import http, ranges, enforce
@@ -40,11 +40,16 @@ class Blobs(object):
def root(self):
return self._root
- def path(self, *args):
- if len(args) == 1 and len(args[0]) == 40 and '.' not in args[0]:
- return self._blob_path(args[0])
- else:
- return join(self._root, 'files', *args)
+ def path(self, path=None):
+ if path is None:
+ return join(self._root, 'files')
+ if isinstance(path, basestring):
+ path = path.split(os.sep)
+ if len(path) == 1 and len(path[0]) == 40 and '.' not in path[0]:
+ return self._blob_path(path[0])
+ if path[0] == 'assets':
+ return join(assets.PATH, *path[1:])
+ return join(self._root, 'files', *path)
def post(self, content, mime_type=None, digest_to_assert=None, meta=None):
if meta is None:
@@ -110,9 +115,11 @@ class Blobs(object):
return File(path, digest, _read_meta(path))
elif isdir(path):
return _lsdir(path, digest)
+ elif exists(path):
+ return File(path, digest)
def delete(self, path):
- self._delete(path, None)
+ self._delete(self.path(path), None)
def populate(self, path=None, recursive=True):
for __ in self.diff([[1, None]], path or '', recursive):
@@ -127,7 +134,7 @@ class Blobs(object):
enforce(not [i for i in path if i == '..'],
http.BadRequest, 'Relative paths are not allowed')
is_files = True
- root = self.path(*path)
+ root = self.path(path)
checkin_seqno = None
for root, __, files in os.walk(root):
@@ -203,7 +210,6 @@ class Blobs(object):
os.utime(path, (seqno, seqno))
def _delete(self, path, seqno):
- path = self.path(path)
if exists(path + _META_SUFFIX):
if seqno is None:
seqno = self._seqno.next()
diff --git a/sugar_network/db/directory.py b/sugar_network/db/directory.py
index 3ef4b91..9ebf907 100644
--- a/sugar_network/db/directory.py
+++ b/sugar_network/db/directory.py
@@ -202,7 +202,7 @@ class Directory(object):
if doc.post_seqno is not None and doc.exists:
# No need in after-merge event, further commit event
# is enough to avoid increasing events flow
- self._index.store(guid, doc.props, self._preindex)
+ self._index.store(guid, doc.origs, self._preindex)
return seqno
@@ -227,18 +227,16 @@ class Directory(object):
doc = self.resource(guid, self._storage.get(guid), changes)
for prop in self.metadata:
enforce(doc[prop] is not None, 'Empty %r property', prop)
- return doc.props
+ return doc
def _prestore(self, guid, changes, event):
- doc = self.resource(guid, self._storage.get(guid))
+ doc = self.resource(guid, self._storage.get(guid), posts=changes)
doc.post_seqno = self._seqno.next()
+ for prop in changes.keys():
+ doc.post(prop, changes[prop])
for prop in self.metadata.keys():
- value = changes.get(prop)
- if value is None:
- enforce(doc[prop] is not None, 'Empty %r property', prop)
- else:
- doc.post(prop, value)
- return doc.props
+ enforce(doc[prop] is not None, 'Empty %r property', prop)
+ return doc
def _postdelete(self, guid, event):
self._storage.delete(guid)
diff --git a/sugar_network/db/metadata.py b/sugar_network/db/metadata.py
index ecefdab..31cace1 100644
--- a/sugar_network/db/metadata.py
+++ b/sugar_network/db/metadata.py
@@ -102,11 +102,17 @@ class Metadata(dict):
self[prop.name] = prop
+ self._keys = dict.keys(self)
+ self._keys.sort()
+
@property
def name(self):
"""Resource type name."""
return self._name
+ def keys(self):
+ return self._keys
+
def __getitem__(self, prop_name):
enforce(prop_name in self, http.NotFound,
'There is no %r property in %r', prop_name, self.name)
diff --git a/sugar_network/db/resource.py b/sugar_network/db/resource.py
index 9d94929..d17637d 100644
--- a/sugar_network/db/resource.py
+++ b/sugar_network/db/resource.py
@@ -29,8 +29,9 @@ class Resource(object):
#: Whether these resources should be migrated from slave-to-master only
one_way = False
- def __init__(self, guid, record, cached_props=None):
- self.props = cached_props or {}
+ def __init__(self, guid, record, origs=None, posts=None):
+ self.origs = origs or {}
+ self.posts = posts or {}
self.guid = guid
self.is_new = not bool(guid)
self.record = record
@@ -69,7 +70,7 @@ class Resource(object):
@layer.setter
def layer(self, value):
- orig = self['layer']
+ orig = self.orig('layer')
if 'deleted' in value:
if this.request.method != 'POST' and 'deleted' not in orig:
self.deleted()
@@ -91,7 +92,7 @@ class Resource(object):
def restored(self):
pass
- def get(self, prop):
+ def get(self, prop, default=None):
"""Get document's property value.
:param prop:
@@ -100,15 +101,31 @@ class Resource(object):
`prop` value
"""
+ value = self.posts.get(prop)
+ if value is None:
+ value = self.orig(prop)
+ if value is None:
+ value = default
+ return value
+
+ def orig(self, prop):
+ """Get document's property original value.
+
+ :param prop:
+ property name to get value
+ :returns:
+ `prop` value
+
+ """
prop = self.metadata[prop]
- value = self.props.get(prop.name)
+ value = self.origs.get(prop.name)
if value is None and self.record is not None:
meta = self.record.get(prop.name)
if meta is not None:
value = meta.get('value')
else:
value = prop.default
- self.props[prop.name] = value
+ self.origs[prop.name] = value
return value
def properties(self, props):
@@ -168,18 +185,15 @@ class Resource(object):
for agg in value.values():
agg['seqno'] = self.post_seqno
if isinstance(prop, Composite):
- old_value = self[prop.name]
- if old_value:
- old_value.update(value)
- value = old_value
+ orig_value = self.orig(prop.name)
+ if orig_value:
+ orig_value.update(value)
+ value = orig_value
self.record.set(prop.name, value=value, seqno=self.post_seqno, **meta)
- self.props[prop.name] = value
-
- def _set(self, prop, value):
- self.props[prop] = value
+ self.posts[prop.name] = value
def __contains__(self, prop):
- return prop in self.props
+ return prop in self.origs or prop in self.posts
def __getitem__(self, prop):
return self.get(prop)
diff --git a/sugar_network/db/routes.py b/sugar_network/db/routes.py
index 153e0a7..e1f190c 100644
--- a/sugar_network/db/routes.py
+++ b/sugar_network/db/routes.py
@@ -40,8 +40,8 @@ class Routes(object):
@route('POST', [None], acl=ACL.AUTH, mime_type='application/json')
def create(self, request):
with self._post(request, ACL.CREATE) as doc:
- self.on_create(request, doc.props)
- self.volume[request.resource].create(doc.props)
+ self.on_create(request, doc.posts)
+ self.volume[request.resource].create(doc.posts)
self.after_post(doc)
return doc['guid']
@@ -78,10 +78,10 @@ class Routes(object):
@route('PUT', [None, None], acl=ACL.AUTH | ACL.AUTHOR)
def update(self, request):
with self._post(request, ACL.WRITE) as doc:
- if not doc.props:
+ if not doc.posts:
return
- self.on_update(request, doc.props)
- self.volume[request.resource].update(doc.guid, doc.props)
+ self.on_update(request, doc.posts)
+ self.volume[request.resource].update(doc.guid, doc.posts)
self.after_post(doc)
@route('PUT', [None, None, None], acl=ACL.AUTH | ACL.AUTHOR)
@@ -209,32 +209,28 @@ class Routes(object):
enforce(_GUID_RE.match(guid) is not None,
http.BadRequest, 'Malformed %s GUID', guid)
else:
- doc.props['guid'] = toolkit.uuid()
+ doc.posts['guid'] = toolkit.uuid()
for name, prop in directory.metadata.items():
if name not in content and prop.default is not None:
- doc.props[name] = prop.default
- orig = None
- this.resource = doc
+ doc.posts[name] = prop.default
else:
doc = directory.get(request.guid)
- orig = directory.get(request.guid)
- this.resource = orig
+ this.resource = doc
- def teardown(new):
- if orig is None:
- return
- for name, orig_value in orig.props.items():
- if doc[name] == orig_value:
- continue
- prop = directory.metadata[name]
- prop.teardown(doc[name] if new else orig_value)
+ def teardown(new, old):
+ for name, value in new.items():
+ if old.get(name) != value:
+ directory.metadata[name].teardown(value)
try:
for name, value in content.items():
prop = directory.metadata[name]
- prop.assert_access(access, orig[name] if orig else None)
+ prop.assert_access(access, doc.orig(name))
+ if value is None:
+ doc.posts[name] = prop.default
+ continue
try:
- doc.props[name] = prop.typecast(value)
+ doc.posts[name] = prop.typecast(value)
except Exception, error:
error = 'Value %r for %r property is invalid: %s' % \
(value, prop.name, error)
@@ -242,10 +238,10 @@ class Routes(object):
raise http.BadRequest(error)
yield doc
except Exception:
- teardown(True)
+ teardown(doc.posts, doc.origs)
raise
else:
- teardown(False)
+ teardown(doc.origs, doc.posts)
def _preget(self, request):
reply = request.get('reply')
diff --git a/sugar_network/model/__init__.py b/sugar_network/model/__init__.py
index 5068a63..77a322c 100644
--- a/sugar_network/model/__init__.py
+++ b/sugar_network/model/__init__.py
@@ -58,6 +58,9 @@ RESOURCES = (
'sugar_network.model.user',
)
+ICON_SIZE = 55
+LOGO_SIZE = 140
+
_logger = logging.getLogger('model')
@@ -118,16 +121,6 @@ def generate_node_stats(volume):
volume['post'].update(topic.guid, {'rating': rating})
-def populate_context_images(props, svg):
- if 'guid' in props:
- from sugar_network.toolkit.sugar import color_svg
- svg = color_svg(svg, props['guid'])
- blobs = this.volume.blobs
- props['artifact_icon'] = blobs.post(svg, 'image/svg+xml').digest
- props['icon'] = blobs.post(svg_to_png(svg, 55, 55), 'image/png').digest
- props['logo'] = blobs.post(svg_to_png(svg, 140, 140), 'image/png').digest
-
-
def load_bundle(blob, context=None, initial=False, extra_deps=None):
contexts = this.volume['context']
context_type = None
@@ -215,7 +208,7 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None):
patch = context_doc.format_patch(context_meta)
if patch:
this.call(method='PUT', path=['context', context], content=patch)
- context_doc.props.update(patch)
+ context_doc.posts.update(patch)
# TRANS: Release notes title
title = i18n._('%(name)s %(version)s release')
else:
@@ -250,8 +243,19 @@ def _load_context_metadata(bundle, spec):
result['guid'] = spec['context']
try:
+ from sugar_network.toolkit.sugar import color_svg
+
icon_file = bundle.extractfile(join(bundle.rootdir, spec['icon']))
- populate_context_images(result, icon_file.read())
+ svg = color_svg(icon_file.read(), result['guid'])
+ blobs = this.volume.blobs
+
+ result['artefact_icon'] = \
+ blobs.post(svg, 'image/svg+xml').digest
+ result['icon'] = \
+ blobs.post(svg_to_png(svg, ICON_SIZE), 'image/png').digest
+ result['logo'] = \
+ blobs.post(svg_to_png(svg, LOGO_SIZE), 'image/png').digest
+
icon_file.close()
except Exception:
exception(_logger, 'Failed to load icon')
diff --git a/sugar_network/model/context.py b/sugar_network/model/context.py
index 951aad1..3aceacc 100644
--- a/sugar_network/model/context.py
+++ b/sugar_network/model/context.py
@@ -16,6 +16,7 @@
from sugar_network import db, model
from sugar_network.toolkit.coroutine import this
from sugar_network.toolkit.router import ACL
+from sugar_network.toolkit import svg_to_png
class Context(db.Resource):
@@ -27,8 +28,34 @@ class Context(db.Resource):
@type.setter
def type(self, value):
- if 'package' in value and 'common' not in self['layer']:
- self.post('layer', self['layer'] + ['common'])
+ if 'package' in value:
+ self.post('icon', 'assets/package.png')
+ self.post('logo', 'assets/package-logo.png')
+ self.post('artefact_icon', 'assets/package.svg')
+ return value
+
+ svg = None
+ blobs = this.volume.blobs
+ if not self['artefact_icon']:
+ for type_ in ('activity', 'book', 'group'):
+ if type_ in value:
+ with file(blobs.get('assets/%s.svg' % type_).path) as f:
+ svg = f.read()
+ from sugar_network.toolkit.sugar import color_svg
+ svg = color_svg(svg, self['guid'])
+ self.post('artefact_icon',
+ blobs.post(svg, 'image/svg+xml').digest)
+ break
+ for prop, png, size in (
+ ('icon', 'assets/missing.png', model.ICON_SIZE),
+ ('logo', 'assets/missing-logo.svg', model.LOGO_SIZE),
+ ):
+ if self[prop]:
+ continue
+ if svg is not None:
+ png = blobs.post(svg_to_png(svg, size), 'image/png').digest
+ self.post(prop, png)
+
return value
@db.indexed_property(db.Localized, slot=1, prefix='S', full_text=True)
@@ -51,17 +78,15 @@ class Context(db.Resource):
def mime_types(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/png', default='missing.png')
+ @db.stored_property(db.Blob, mime_type='image/png')
def icon(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/svg+xml',
- default='missing.svg')
- def artifact_icon(self, value):
+ @db.stored_property(db.Blob, mime_type='image/svg+xml')
+ def artefact_icon(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/png',
- default='missing-logo.png')
+ @db.stored_property(db.Blob, mime_type='image/png')
def logo(self, value):
return value
diff --git a/sugar_network/model/post.py b/sugar_network/model/post.py
index 107f354..21046f2 100644
--- a/sugar_network/model/post.py
+++ b/sugar_network/model/post.py
@@ -70,7 +70,7 @@ class Post(db.Resource):
return value
@db.stored_property(db.Blob, mime_type='image/png',
- default='missing-logo.png')
+ default='assets/missing-logo.png')
def preview(self, value):
return value
diff --git a/sugar_network/toolkit/__init__.py b/sugar_network/toolkit/__init__.py
index 89a9d0f..67ee7da 100644
--- a/sugar_network/toolkit/__init__.py
+++ b/sugar_network/toolkit/__init__.py
@@ -432,10 +432,13 @@ class mkdtemp(str):
shutil.rmtree(self)
-def svg_to_png(data, w, h):
+def svg_to_png(data, w, h=None):
import rsvg
import cairo
+ if h is None:
+ h = w
+
svg = rsvg.Handle(data=data)
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
context = cairo.Context(surface)