diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-03-12 11:17:00 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-03-12 11:17:00 (GMT) |
commit | ae31651d6ae31215db903530115bf340ae9f98f5 (patch) | |
tree | 7d5a5083eee504a74d4b5ca4c249959e83f78392 /sugar_network | |
parent | 47be127e9955013ddc5563013ded534cc3952ef1 (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__.py | 19 | ||||
-rw-r--r-- | sugar_network/assets/activity.svg | 68 | ||||
-rw-r--r-- | sugar_network/assets/book.svg | 68 | ||||
-rw-r--r-- | sugar_network/assets/favicon.ico | bin | 0 -> 1150 bytes | |||
-rw-r--r-- | sugar_network/assets/group.svg | 68 | ||||
-rw-r--r-- | sugar_network/assets/missing-logo.png | bin | 0 -> 4073 bytes | |||
-rw-r--r-- | sugar_network/assets/missing.png | bin | 0 -> 1566 bytes | |||
-rw-r--r-- | sugar_network/assets/missing.svg | 75 | ||||
-rw-r--r-- | sugar_network/assets/package-logo.png | bin | 0 -> 2874 bytes | |||
-rw-r--r-- | sugar_network/assets/package.png | bin | 0 -> 1199 bytes | |||
-rw-r--r-- | sugar_network/assets/package.svg | 71 | ||||
-rw-r--r-- | sugar_network/db/blobs.py | 24 | ||||
-rw-r--r-- | sugar_network/db/directory.py | 16 | ||||
-rw-r--r-- | sugar_network/db/metadata.py | 6 | ||||
-rw-r--r-- | sugar_network/db/resource.py | 44 | ||||
-rw-r--r-- | sugar_network/db/routes.py | 42 | ||||
-rw-r--r-- | sugar_network/model/__init__.py | 28 | ||||
-rw-r--r-- | sugar_network/model/context.py | 41 | ||||
-rw-r--r-- | sugar_network/model/post.py | 2 | ||||
-rw-r--r-- | sugar_network/toolkit/__init__.py | 5 |
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 Binary files differnew file mode 100644 index 0000000..80e42ba --- /dev/null +++ b/sugar_network/assets/favicon.ico 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 Binary files differnew file mode 100644 index 0000000..98be121 --- /dev/null +++ b/sugar_network/assets/missing-logo.png diff --git a/sugar_network/assets/missing.png b/sugar_network/assets/missing.png Binary files differnew file mode 100644 index 0000000..91a65a8 --- /dev/null +++ b/sugar_network/assets/missing.png 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 Binary files differnew file mode 100644 index 0000000..c6cf086 --- /dev/null +++ b/sugar_network/assets/package-logo.png diff --git a/sugar_network/assets/package.png b/sugar_network/assets/package.png Binary files differnew file mode 100644 index 0000000..24bd5ac --- /dev/null +++ b/sugar_network/assets/package.png 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) |