Пример #1
0
    def get_many(self, keys, raw=False):
        """When raw=True, the raw data is returned instead of objects.
        """
        if not keys:
            return []
        
        # simple hack to avoid crossing URL length limit.
        if len(keys) > 100:
            things = []
            while keys:
                things += self.get_many(keys[:100], raw=raw)
                keys = keys[100:]
            return things

        data = dict(keys=simplejson.dumps(keys))
        result = self._request('/get_many', data=data)
        things = []
        
        for key in keys:
            #@@ what if key is not there?
            if key in result:
                data = result[key]
                if raw:
                    things.append(data)
                else:
                    data = web.storage(common.parse_query(data))
                    self._cache[key, None] = data
                    things.append(create_thing(self, key, self._process_dict(data)))
        return things
Пример #2
0
    def get_many(self, keys):
        if not keys:
            return []
            
        # simple hack to avoid crossing URL length limit.
        if len(keys) > 100:
            things = []
            while keys:
                things += self.get_many(keys[:100])
                keys = keys[100:]
            return things

        data = dict(keys=simplejson.dumps(keys))
        result = self._request('/get_many', data=data)
        things = []
        
        import copy
        for key in keys:
            #@@ what if key is not there?
            if key in result:
                data = result[key]
                data = web.storage(common.parse_query(data))
                self._cache[key, None] = data
                things.append(create_thing(self, key, self._process_dict(copy.deepcopy(data))))
        return things
Пример #3
0
    def process(self, key, data):
        if 'key' not in data:
            data['key'] = key

        assert data['key'] == key

        data = common.parse_query(data)
        self.validate_properties(data)
        
        if not web.ctx.get('disable_permission_check', False) and not has_permission(self.store, self.author, key):
            raise common.PermissionDenied(message='Permission denied to modify %s' % repr(key))
        
        type = data.get('type')
        if type is None:
            raise common.BadData(message="missing type")
        type = self.process_value(type, self.get_property(None, 'type'))
        type = get_thing(self.store, type)
        
        thing = get_thing(self.store, key)
        prev_data = thing and thing._get_data()

        # when type is changed, consider as all object is modified and don't compare with prev data.
        if prev_data and prev_data.get('type') != type.key:
            prev_data = None

        data = self.process_data(data, type, prev_data)

        for k in common.READ_ONLY_PROPERTIES:
            data.pop(k, None)
            prev_data and prev_data.pop(k, None)
            
        if data == prev_data:
            return None
        else:
            return data
Пример #4
0
    def get_many(self, keys, raw=False):
        """When raw=True, the raw data is returned instead of objects.
        """
        if not keys:
            return []

        # simple hack to avoid crossing URL length limit.
        if len(keys) > 100:
            things = []
            while keys:
                things += self.get_many(keys[:100], raw=raw)
                keys = keys[100:]
            return things

        data = dict(keys=simplejson.dumps(keys))
        result = self._request('/get_many', data=data)
        things = []

        for key in keys:
            #@@ what if key is not there?
            if key in result:
                data = result[key]
                if raw:
                    things.append(data)
                else:
                    data = web.storage(common.parse_query(data))
                    self._cache[key, None] = data
                    things.append(
                        create_thing(self, key, self._process_dict(data)))
        return things
Пример #5
0
def make_query(store, query, prefix=""):
    """Creates a query object from query dict.
        >>> store = common.create_test_store()
        >>> make_query(store, {'type': '/type/page'})
        <query: ['type = ref:/type/page']>
        >>> make_query(store, {'type': '/type/page', 'title~': 'foo', 'life': 42})
        <query: ['life = int:42', 'type = ref:/type/page', 'title ~ str:foo']>
        >>> make_query(store, {'type': '/type/page', 'title~': 'foo', 'a:life<': 42, "b:life>": 420})        
        <query: ['life < int:42', 'type = ref:/type/page', 'title ~ str:foo', 'life > int:420']>
    """
    query = common.parse_query(query)
    q = Query()
    q.prefix = prefix
    q.offset = common.safeint(query.pop('offset', None), 0)
    q.limit = common.safeint(query.pop('limit', 20), 20)
    if q.limit > 1000:
        q.limit = 1000
    sort = query.pop('sort', None)

    nested = (prefix != "")

    for k, v in query.items():
        # key foo can also be written as label:foo
        k = k.split(':')[-1]
        if v is None:
            q.requested[k] = v
        elif isinstance(v, dict):
            # make sure op is ==
            v = dict((k + '.' + key, value) for key, value in v.items())
            q2 = make_query(store, v, prefix=prefix + k + ".")
            #@@ Anand: Quick-fix
            # dbstore.things looks for key to find whether type is required or not.
            q2.key = k
            if q2.conditions:
                q.conditions.append(q2)
            else:
                q.requested[k] = q2
        else:
            k, op = parse_key(k)
            q.add_condition(k, op, None, v)

    if not nested:
        q.assert_type_required()

    type = get_thing(store, q.get_type())
    #assert type is not None, 'Not found: ' + q.get_type()
    for c in q.conditions:
        if not isinstance(c, Query):
            c.datatype = find_datatype(type, c.key, c.value)

    if sort:
        parse_key(sort)  # to validate key
        q.sort = web.storage(key=sort,
                             datatype=find_datatype(type, sort, None))
    else:
        q.sort = None

    return q
Пример #6
0
def make_query(store, query, prefix=""):
    """Creates a query object from query dict.
        >>> store = common.create_test_store()
        >>> make_query(store, {'type': '/type/page'})
        <query: ['type = ref:/type/page']>
        >>> make_query(store, {'type': '/type/page', 'title~': 'foo', 'life': 42})
        <query: ['life = int:42', 'type = ref:/type/page', 'title ~ str:foo']>
        >>> make_query(store, {'type': '/type/page', 'title~': 'foo', 'a:life<': 42, "b:life>": 420})        
        <query: ['life < int:42', 'type = ref:/type/page', 'title ~ str:foo', 'life > int:420']>
    """
    query = common.parse_query(query)
    q = Query()
    q.prefix = prefix
    q.offset = common.safeint(query.pop('offset', None), 0)
    q.limit = common.safeint(query.pop('limit', 20), 20)
    if q.limit > 1000:
        q.limit = 1000
    sort = query.pop('sort', None)
    
    nested = (prefix != "")
    
    for k, v in query.items():
        # key foo can also be written as label:foo
        k = k.split(':')[-1]
        if v is None:
            q.requested[k] = v
        elif isinstance(v, dict):
            # make sure op is ==
            v = dict((k + '.' + key, value) for key, value in v.items())
            q2 = make_query(store, v, prefix=prefix + k + ".")
            #@@ Anand: Quick-fix
            # dbstore.things looks for key to find whether type is required or not. 
            q2.key = k 
            if q2.conditions:
                q.conditions.append(q2)
            else:
                q.requested[k] = q2
        else:
            k, op = parse_key(k)
            q.add_condition(k, op, None, v)
             
    if not nested:
        q.assert_type_required()
        
    type = get_thing(store, q.get_type())
    #assert type is not None, 'Not found: ' + q.get_type()
    for c in q.conditions:
        if not isinstance(c, Query):
            c.datatype = find_datatype(type, c.key, c.value)
            
    if sort:
        parse_key(sort) # to validate key
        q.sort = web.storage(key=sort, datatype=find_datatype(type, sort, None))
    else:
        q.sort = None
            
    return q
Пример #7
0
 def get_user(self):
     # avoid hitting infobase when there is no cookie.
     if web.cookies().get(config.login_cookie_name) is None:
         return None
     try:
         data = self._request('/account/get_user')
     except ClientException:
         return None
         
     user = data and create_thing(self, data['key'], self._process_dict(common.parse_query(data)))
     return user
Пример #8
0
 def get_user(self):
     # avoid hitting infobase when there is no cookie.
     if web.cookies().get(config.login_cookie_name) is None:
         return None
     try:
         data = self._request('/account/get_user')
     except ClientException:
         return None
         
     user = data and create_thing(self, data['key'], self._process_dict(common.parse_query(data)))
     return user
Пример #9
0
    def _process(self, key, data, prev_data=None):
        self.key = key # hack to make key available when raising exceptions.
        
        
        if 'key' not in data:
            data['key'] = key
            
        if web.ctx.get('infobase_bootstrap', False):
            return data

        assert data['key'] == key

        data = common.parse_query(data)
        self.validate_properties(data)
        prev_data = prev_data and common.parse_query(prev_data)
        
        if not web.ctx.get('disable_permission_check', False) and not self.has_permission(self.author, key):
            raise common.PermissionDenied(message='Permission denied to modify %s' % repr(key))
        
        type = data.get('type')
        if type is None:
            raise common.BadData(message="missing type", at=dict(key=key))
        type = self.process_value(type, self.get_property(None, 'type'))
        type = self.get_thing(type)
        
        # when type is changed, consider as all object is modified and don't compare with prev data.
        if prev_data and prev_data.get('type') != type.key:
            prev_data = None

        data = self.process_data(data, type, prev_data)

        for k in common.READ_ONLY_PROPERTIES:
            data.pop(k, None)
            prev_data and prev_data.pop(k, None)
            
        if data == prev_data:
            return None
        else:
            return data
Пример #10
0
    def _process(self, key, data, prev_data=None):
        self.key = key  # hack to make key available when raising exceptions.

        if "key" not in data:
            data["key"] = key

        if web.ctx.get("infobase_bootstrap", False):
            return data

        assert data["key"] == key

        data = common.parse_query(data)
        self.validate_properties(data)
        prev_data = prev_data and common.parse_query(prev_data)

        if not web.ctx.get("disable_permission_check", False) and not self.has_permission(self.author, key):
            raise common.PermissionDenied(message="Permission denied to modify %s" % repr(key))

        type = data.get("type")
        if type is None:
            raise common.BadData(message="missing type", at=dict(key=key))
        type = self.process_value(type, self.get_property(None, "type"))
        type = self.get_thing(type)

        # when type is changed, consider as all object is modified and don't compare with prev data.
        if prev_data and prev_data.get("type") != type.key:
            prev_data = None

        data = self.process_data(data, type, prev_data)

        for k in common.READ_ONLY_PROPERTIES:
            data.pop(k, None)
            prev_data and prev_data.pop(k, None)

        if data == prev_data:
            return None
        else:
            return data
Пример #11
0
 def _get(self, key, revision=None):
     """Returns properties of the thing with the specified key."""
     revision = revision and int(revision)
     
     if (key, revision) not in self._cache:
         data = dict(key=key, revision=revision)
         try:
             result = self._request('/get', data=data)
         except ClientException, e:
             if e.status.startswith('404'):
                 raise NotFound, key
             else:
                 raise
         self._cache[key, revision] = web.storage(common.parse_query(result))
Пример #12
0
 def _get(self, key, revision=None):
     """Returns properties of the thing with the specified key."""
     revision = revision and int(revision)
     
     if (key, revision) not in self._cache:
         data = dict(key=key, revision=revision)
         try:
             result = self._request('/get', data=data)
         except ClientException, e:
             if e.status.startswith('404'):
                 raise NotFound, key
             else:
                 raise
         self._cache[key, revision] = web.storage(common.parse_query(result))
Пример #13
0
def main(wf):
    import common
    common.log = log

    log.debug('-' * 40)

    common.set_locale()

    lc, encoding = locale.getlocale()
    log.debug('args : {}'.format(wf.args))
    log.debug('locale : {}  encoding : {}'.format(lc, encoding))

    if len(wf.args):
        query = wf.args[0]
    else:
        query = None

    log.debug('query : {}'.format(query))

    if not query or query in ('0', 'now', 'today'):
        dt = date.today()
    else:
        dt = common.parse_query(query)

    if not dt:  # Didn't understand query
        wf.add_item("Couldn't understand '{}'".format(query),
                    "Use 'datehelp' for help on formatting",
                    valid=False, icon=ICON_ERROR)
        wf.send_feedback()
        return 0
    log.debug('date : {0.year}-{0.month}-{0.day}'.format(dt))
    # get date formats
    for i, fmt in enumerate(common.get_formats()):
        value = unicode(common.date_with_format(dt, fmt), encoding)
        wf.add_item(value,
                    'Copy to clipboard',
                    arg=value,
                    valid=True,
                    uid='date-{:02d}'.format(i),
                    icon='icon.png')
    wf.send_feedback()
    log.debug('finished.')
Пример #14
0
    def process(self, query):
        p = SaveProcessor(self.store, self.author)
        
        for q in serialize(query):
            q = common.parse_query(q)
            
            if not isinstance(q, dict) or q.get('key') is None:
                continue

            key = q['key']                
            thing = get_thing(self.store, key)
            create = q.pop('create', None)
            
            if thing is None:
                if create:
                    q = self.remove_connects(q)
                else:
                    raise common.NotFound(key=key)
            else:
                q = self.connect_all(thing._data, q)
            
            yield p.process(key, q)
Пример #15
0
    def process(self, query):
        p = SaveProcessor(self.store, self.author)
        
        for q in serialize(query):
            q = common.parse_query(q)
            
            if not isinstance(q, dict) or q.get('key') is None:
                continue

            key = q['key']                
            thing = get_thing(self.store, key)
            create = q.pop('create', None)
            
            if thing is None:
                if create:
                    q = self.remove_connects(q)
                else:
                    raise common.NotFound(key=key)
            else:
                q = self.connect_all(thing._data, q)
            
            yield p.process(key, q)
Пример #16
0
    def get_many(self, keys):
        if not keys:
            return []
        
        # simple hack to avoid crossing URL length limit.
        if len(keys) > 100:
            things = []
            while keys:
                things += self.get_many(keys[:100])
                keys = keys[100:]
            return things

        data = dict(keys=simplejson.dumps(keys))
        result = self._request('/get_many', data=data)
        things = []
        
        for key in keys:
            #@@ what if key is not there?
            if key in result:
                data = result[key]
                data = web.storage(common.parse_query(data))
                self._cache[key, None] = data
                things.append(create_thing(self, key, self._process_dict(data)))
        return things
Пример #17
0
 def from_dict(store, key, data):
     import common
     data = common.parse_query(data)        
     return Thing(store, key, data)
Пример #18
0
 def update(self, data):
     data = common.parse_query(data)
     data = self._site._process_dict(data)
     self._getdata().update(data)
Пример #19
0
 def new(self, key, data=None):
     """Creates a new thing in memory.
     """
     data = common.parse_query(data)
     data = self._process_dict(data or {})
     return create_thing(self, key, data)
Пример #20
0
 def from_dict(store, key, data):
     import common
     data = common.parse_query(data)
     return Thing(store, key, data)
Пример #21
0
 def update(self, data):
     data = common.parse_query(data)
     data = self._site._process_dict(data)
     self._getdata().update(data)
Пример #22
0
 def new(self, key, data=None):
     """Creates a new thing in memory.
     """
     data = common.parse_query(data)
     data = self._process_dict(data or {})
     return create_thing(self, key, data)