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-04-29 07:53:52 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-04-29 16:40:28 (GMT)
commit7b650854958d03386ae54e87cbbb2bc82053661e (patch)
tree486f54e50d58e21aedda86fcbc19237d921f401a /sugar_network
parentfe07c5f9f1da79059f8fcd5e33e0f043b7cc6814 (diff)
Fix aslo-sync script
Diffstat (limited to 'sugar_network')
-rw-r--r--sugar_network/client/routes.py14
-rw-r--r--sugar_network/db/blobs.py5
-rw-r--r--sugar_network/model/context.py59
-rw-r--r--sugar_network/node/__init__.py2
-rw-r--r--sugar_network/node/model.py51
-rw-r--r--sugar_network/node/slave.py4
-rw-r--r--sugar_network/toolkit/application.py4
-rw-r--r--sugar_network/toolkit/i18n.py14
8 files changed, 90 insertions, 63 deletions
diff --git a/sugar_network/client/routes.py b/sugar_network/client/routes.py
index 8a037ee..4bdd10f 100644
--- a/sugar_network/client/routes.py
+++ b/sugar_network/client/routes.py
@@ -53,8 +53,8 @@ class ClientRoutes(FrontRoutes, JournalRoutes):
self._connect_jobs = coroutine.Pool()
self._sync_jobs = coroutine.Pool()
self._no_subscription = no_subscription
- self._pull_r = toolkit.Bin(
- join(home_volume.root, 'var', 'pull'), [[1, None]])
+ self._refresh_r = toolkit.Bin(
+ join(home_volume.root, 'var', 'refresh'), [[1, None]])
def connect(self, api=None):
if self._connect_jobs:
@@ -71,7 +71,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes):
self._connect_jobs.kill()
self._got_offline()
self._local.volume.close()
- self._pull_r.commit()
+ self._refresh_r.commit()
@fallbackroute('GET', ['hub'])
def hub(self):
@@ -370,14 +370,14 @@ class ClientRoutes(FrontRoutes, JournalRoutes):
contexts.delete(local_context.guid)
def _pull_checkin(self, request, response, header_key):
- request.headers[header_key] = self._pull_r.value
+ request.headers[header_key] = self._refresh_r.value
packet = packets.decode(self.fallback(request, response))
volume = self._local.volume
volume[request.resource].patch(request.guid, packet['patch'])
for blob in packet:
volume.blobs.patch(blob)
- ranges.exclude(self._pull_r.value, packet['ranges'])
+ ranges.exclude(self._refresh_r.value, packet['ranges'])
def _pull(self):
_logger.debug('Start pulling checkin updates')
@@ -389,7 +389,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes):
request = Request(method='GET',
path=[directory.metadata.name], cmd='diff')
while True:
- request.headers['ranges'] = self._pull_r.value
+ request.headers['ranges'] = self._refresh_r.value
diff = self.fallback(request, response)
if not diff:
break
@@ -397,7 +397,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes):
checkin = Request(method='GET',
path=[request.resource, guid], cmd='diff')
self._pull_checkin(checkin, response, 'ranges')
- ranges.exclude(self._pull_r.value, r)
+ ranges.exclude(self._refresh_r.value, r)
def _push(self):
volume = self._local.volume
diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py
index 6426341..2faedb0 100644
--- a/sugar_network/db/blobs.py
+++ b/sugar_network/db/blobs.py
@@ -247,7 +247,8 @@ class Blobs(object):
return
if not exists(dirname(path)):
os.makedirs(dirname(path))
- os.rename(patch.path, path)
+ if patch.path:
+ os.rename(patch.path, path)
if exists(path + _META_SUFFIX):
meta = _read_meta(path)
meta.update(patch.meta)
@@ -282,7 +283,7 @@ def _write_meta(path, meta, seqno):
for key, value in meta.items() if isinstance(meta, dict) else meta:
if seqno is None and key == 'x-seqno':
seqno = int(value)
- f.write('%s: %s\n' % (key, toolkit.ascii(value)))
+ f.write(toolkit.ascii(key) + ': ' + toolkit.ascii(value) + '\n')
os.utime(path, (seqno, seqno))
diff --git a/sugar_network/model/context.py b/sugar_network/model/context.py
index cf24650..457281f 100644
--- a/sugar_network/model/context.py
+++ b/sugar_network/model/context.py
@@ -32,30 +32,9 @@ class Context(db.Resource):
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)
-
+ elif 'activity' not in value:
+ if not self['artefact_icon']:
+ self._generate_default_icons(value)
return value
@db.indexed_property(db.Localized, slot=1, prefix='S', full_text=True)
@@ -78,15 +57,18 @@ class Context(db.Resource):
def mime_types(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/png')
+ @db.stored_property(db.Blob, mime_type='image/png',
+ default='assets/missing.png')
def icon(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/svg+xml')
+ @db.stored_property(db.Blob, mime_type='image/svg+xml',
+ default='assets/missing.svg')
def artefact_icon(self, value):
return value
- @db.stored_property(db.Blob, mime_type='image/png')
+ @db.stored_property(db.Blob, mime_type='image/png',
+ default='assets/missing-logo.png')
def logo(self, value):
return value
@@ -118,3 +100,26 @@ class Context(db.Resource):
"""
return value
+
+ def _generate_default_icons(self, types):
+ blobs = this.volume.blobs
+ svg = None
+ for type_ in ('activity', 'book', 'group'):
+ if type_ in types:
+ 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
+ else:
+ return
+ for prop, size in (
+ ('icon', model.ICON_SIZE),
+ ('logo', model.LOGO_SIZE),
+ ):
+ if self[prop]:
+ continue
+ png = blobs.post(svg_to_png(svg, size), 'image/png').digest
+ self.post(prop, png)
diff --git a/sugar_network/node/__init__.py b/sugar_network/node/__init__.py
index 66bd37e..82cb8a9 100644
--- a/sugar_network/node/__init__.py
+++ b/sugar_network/node/__init__.py
@@ -47,4 +47,4 @@ mode = Option(
master_api = Option(
'master API url either to connect to (for slave or proxy nodes), or, '
- 'to provide from (for master nodes)')
+ 'to provide from (for master nodes)', name='master-api')
diff --git a/sugar_network/node/model.py b/sugar_network/node/model.py
index d2a6475..310d2db 100644
--- a/sugar_network/node/model.py
+++ b/sugar_network/node/model.py
@@ -84,7 +84,7 @@ class _Release(object):
class Context(_context.Context):
@db.stored_property(db.Aggregated, subtype=_Release(),
- acl=ACL.READ | ACL.INSERT | ACL.REMOVE | ACL.REPLACE | ACL.LOCAL)
+ acl=ACL.READ | ACL.INSERT | ACL.REMOVE | ACL.REPLACE)
def releases(self, value):
return value
@@ -423,9 +423,11 @@ def presolve(presolve_path):
def load_bundle(blob, context=None, initial=False, extra_deps=None,
- license=None, release_notes=None):
+ license=None, release_notes=None, update_context=True):
context_type = None
context_meta = None
+ context_icon = None
+ context_updated = False
version = None
release = _ReleaseValue()
release.guid = blob.digest
@@ -456,7 +458,7 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None,
changelog = None
unpack_size += bundle.getmember(arcname).size
spec = bundle.get_spec()
- context_meta = _load_context_metadata(bundle, spec)
+ context_meta, context_icon = _load_context_metadata(bundle, spec)
if not context:
context = spec['context']
@@ -489,10 +491,13 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None,
enforce(context_meta, http.BadRequest, 'No way to initate context')
context_meta['guid'] = context
context_meta['type'] = [context_type]
+ if context_icon:
+ _generate_icons(context_icon, context_meta)
with this.principal as principal:
principal.cap_create_with_guid = True
this.call(method='POST', path=['context'], content=context_meta,
principal=principal)
+ context_updated = True
else:
enforce(doc.available, http.NotFound, 'No context')
enforce(context_type in doc['type'],
@@ -513,12 +518,15 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None,
_logger.debug('Load %r release: %r', context, release)
- if this.principal in doc['author']:
- patch = doc.format_patch(context_meta)
- if patch:
- this.call(method='PUT', path=['context', context], content=patch,
- principal=this.principal)
- doc.posts.update(patch)
+ if this.principal in doc['author'] or this.principal.cap_author_override:
+ if not context_updated and update_context:
+ patch = doc.format_patch(context_meta) or {}
+ if context_icon and doc['artefact_icon'] == 'assets/missing.svg':
+ _generate_icons(context_icon, patch)
+ if patch:
+ this.call(method='PUT', path=['context', context],
+ content=patch, principal=this.principal)
+ doc.posts.update(patch)
# TRANS: Release notes title
title = i18n._('%(name)s %(version)s release')
else:
@@ -571,21 +579,12 @@ def _load_context_metadata(bundle, spec):
if spec[prop]:
result[prop] = spec[prop]
result['guid'] = spec['context']
+ icon_svg = None
try:
from sugar_network.toolkit.sugar import color_svg
-
icon_file = bundle.extractfile(join(bundle.rootdir, spec['icon']))
- 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_svg = color_svg(icon_file.read(), result['guid'])
icon_file.close()
except Exception:
_logger.exception('Failed to load icon')
@@ -618,7 +617,7 @@ def _load_context_metadata(bundle, spec):
except Exception:
_logger.exception('Gettext failed to read %r', mo_path[-1])
- return result
+ return result, icon_svg
def _resolve_package_alias(doc, value):
@@ -669,6 +668,16 @@ def _resolve_package_alias(doc, value):
doc.post('releases', {'resolves': resolves})
+def _generate_icons(svg, props):
+ blobs = this.volume.blobs
+ props['artefact_icon'] = \
+ blobs.post(svg, 'image/svg+xml').digest
+ props['icon'] = \
+ blobs.post(svg_to_png(svg, ICON_SIZE), 'image/png').digest
+ props['logo'] = \
+ blobs.post(svg_to_png(svg, LOGO_SIZE), 'image/png').digest
+
+
_STABILITY_RATES = {
'insecure': 0,
'buggy': 1,
diff --git a/sugar_network/node/slave.py b/sugar_network/node/slave.py
index babf1f0..a1195ab 100644
--- a/sugar_network/node/slave.py
+++ b/sugar_network/node/slave.py
@@ -52,8 +52,8 @@ class SlaveRoutes(NodeRoutes):
f.write(guid)
NodeRoutes.__init__(self, guid, volume=volume, **kwargs)
vardir = join(volume.root, 'var')
- self._push_r = toolkit.Bin(join(vardir, 'push.ranges'), [[1, None]])
- self._pull_r = toolkit.Bin(join(vardir, 'pull.ranges'), [[1, None]])
+ self._push_r = toolkit.Bin(join(vardir, 'push'), [[1, None]])
+ self._pull_r = toolkit.Bin(join(vardir, 'pull'), [[1, None]])
self._master_guid = urlsplit(master_api).netloc
self._master_api = master_api
diff --git a/sugar_network/toolkit/application.py b/sugar_network/toolkit/application.py
index 06d55a6..bc6b99c 100644
--- a/sugar_network/toolkit/application.py
+++ b/sugar_network/toolkit/application.py
@@ -168,6 +168,9 @@ class Application(object):
init_logging(debug.value)
+ def prolog(self):
+ pass
+
def epilog(self):
pass
@@ -186,6 +189,7 @@ class Application(object):
if cmd.options.get('keep_stdout') and not foreground.value:
self._keep_stdout()
+ self.prolog()
exit(cmd() or 0)
except Exception:
printf.exception('%s %s', _('Aborted'), self.name)
diff --git a/sugar_network/toolkit/i18n.py b/sugar_network/toolkit/i18n.py
index 86d3cae..57f242f 100644
--- a/sugar_network/toolkit/i18n.py
+++ b/sugar_network/toolkit/i18n.py
@@ -23,7 +23,7 @@ from gettext import translation
_ = lambda x: x
_logger = logging.getLogger('i18n')
-_i18n = {}
+_i18n = None
def default_lang():
@@ -107,10 +107,18 @@ def decode(value, accept_language=None):
def encode(msgid, *args, **kwargs):
- if not _i18n:
+ global _i18n
+
+ if _i18n is None:
from sugar_network.toolkit.languages import LANGUAGES
+
+ _i18n = {}
for lang in LANGUAGES:
- _i18n[lang] = translation('sugar-network', languages=[lang])
+ try:
+ _i18n[lang] = translation('sugar-network', languages=[lang])
+ except IOError, error:
+ _logger.error('Failed to open %r locale: %s', lang, error)
+
result = {}
for lang, trans in _i18n.items():