Esempio n. 1
0
def make_editor_session(pad, path, is_attachment=None, alt=PRIMARY_ALT,
                        datamodel=None):
    """Creates an editor session for the given path object."""
    if alt != PRIMARY_ALT and not pad.db.config.is_valid_alternative(alt):
        raise BadEdit('Attempted to edit an invalid alternative (%s)' % alt)

    raw_data = pad.db.load_raw_data(path, cls=OrderedDict, alt=alt,
                                    fallback=False)
    raw_data_fallback = None
    if alt != PRIMARY_ALT:
        raw_data_fallback = pad.db.load_raw_data(path, cls=OrderedDict)
        all_data = OrderedDict()
        all_data.update(raw_data_fallback or ())
        all_data.update(raw_data or ())
    else:
        all_data = raw_data

    id = posixpath.basename(path)
    if not is_valid_id(id):
        raise BadEdit('Invalid ID')

    record = None
    exists = all_data is not None
    if raw_data is None:
        raw_data = OrderedDict()

    if is_attachment is None:
        if not exists:
            is_attachment = False
        else:
            is_attachment = bool(all_data.get('_attachment_for'))
    elif bool(all_data.get('_attachment_for')) != is_attachment:
        raise BadEdit('The attachment flag passed is conflicting with the '
                      'record\'s attachment flag.')

    if exists:
        # XXX: what about changing the datamodel after the fact?
        if datamodel is not None:
            raise BadEdit('When editing an existing record, a datamodel '
                          'must not be provided.')
        datamodel = pad.db.get_datamodel_for_raw_data(all_data, pad)
    else:
        if datamodel is None:
            datamodel = pad.db.get_implied_datamodel(path, is_attachment, pad)
        elif isinstance(datamodel, six.string_types):
            datamodel = pad.db.datamodels[datamodel]

    if exists:
        record = pad.instance_from_data(dict(all_data), datamodel)

    for key in implied_keys:
        raw_data.pop(key, None)
        if raw_data_fallback:
            raw_data_fallback.pop(key, None)

    return EditorSession(pad, id, six.text_type(path), raw_data, raw_data_fallback,
                         datamodel, record, exists, is_attachment, alt)
Esempio n. 2
0
def make_editor_session(pad,
                        path,
                        is_attachment=None,
                        alt=PRIMARY_ALT,
                        datamodel=None):
    """Creates an editor session for the given path object."""
    if alt != PRIMARY_ALT and not pad.db.config.is_valid_alternative(alt):
        raise BadEdit('Attempted to edit an invalid alternative (%s)' % alt)

    raw_data = pad.db.load_raw_data(path, cls=OrderedDict, alt=alt)
    id = posixpath.basename(path)
    if not is_valid_id(id):
        raise BadEdit('Invalid ID')

    record = None
    exists = raw_data is not None
    if raw_data is None:
        raw_data = OrderedDict()

    if is_attachment is None:
        if not exists:
            is_attachment = False
        else:
            is_attachment = bool(raw_data.get('_attachment_for'))
    elif bool(raw_data.get('_attachment_for')) != is_attachment:
        raise BadEdit('The attachment flag passed is conflicting with the '
                      'record\'s attachment flag.')

    if exists:
        # XXX: what about changing the datamodel after the fact?
        if datamodel is not None:
            raise BadEdit('When editing an existing record, a datamodel '
                          'must not be provided.')
        datamodel = pad.db.get_datamodel_for_raw_data(raw_data, pad)
    else:
        if datamodel is None:
            datamodel = pad.db.get_implied_datamodel(path, is_attachment, pad)
        elif isinstance(datamodel, basestring):
            datamodel = pad.db.datamodels[datamodel]

    if exists:
        record = pad.instance_from_data(dict(raw_data), datamodel)

    for key in implied_keys:
        raw_data.pop(key, None)

    return EditorSession(pad, id, unicode(path), raw_data, datamodel, record,
                         exists, is_attachment, alt)
Esempio n. 3
0
File: api.py Progetto: jab/lektor
def add_new_record():
    values = request.get_json()
    exists = False

    if not is_valid_id(values['id']):
        return jsonify(valid_id=False, exists=False, path=None)

    path = posixpath.join(values['path'], values['id'])

    ts = g.admin_context.pad.edit(path, datamodel=values.get('model'))
    with ts:
        if ts.exists:
            exists = True
        else:
            ts.update(values.get('data') or {})

    return jsonify({'valid_id': True, 'exists': exists, 'path': path})
Esempio n. 4
0
def add_new_record():
    values = request.get_json()
    alt = values.get("alt") or PRIMARY_ALT
    exists = False

    if not is_valid_id(values["id"]):
        return jsonify(valid_id=False, exists=False, path=None)

    path = posixpath.join(values["path"], values["id"])

    ts = g.admin_context.tree.edit(path, datamodel=values.get("model"), alt=alt)
    with ts:
        if ts.exists:
            exists = True
        else:
            ts.update(values.get("data") or {})

    return jsonify({"valid_id": True, "exists": exists, "path": path})
Esempio n. 5
0
File: editor.py Progetto: jab/lektor
def make_editor_session(pad, path, is_attachment=None, datamodel=None):
    """Creates an editor session for the given path object."""
    raw_data = pad.db.load_raw_data(path, cls=OrderedDict)
    id = posixpath.basename(path)
    if not is_valid_id(id):
        raise BadEdit('Invalid ID')

    record = None
    exists = raw_data is not None
    if raw_data is None:
        raw_data = OrderedDict()

    if is_attachment is None:
        if not exists:
            is_attachment = False
        else:
            is_attachment = bool(raw_data.get('_attachment_for'))
    elif bool(raw_data.get('_attachment_for')) != is_attachment:
        raise BadEdit('The attachment flag passed is conflicting with the '
                      'record\'s attachment flag.')

    if exists:
        # XXX: what about changing the datamodel after the fact?
        if datamodel is not None:
            raise BadEdit('When editing an existing record, a datamodel '
                          'must not be provided.')
        datamodel = pad.db.get_datamodel_for_raw_data(raw_data, pad)
    else:
        if datamodel is None:
            datamodel = pad.db.get_implied_datamodel(path, is_attachment, pad)
        elif isinstance(datamodel, basestring):
            datamodel = pad.db.datamodels[datamodel]

    if exists:
        record = pad.instance_from_data(dict(raw_data), datamodel)

    for key in implied_keys:
        raw_data.pop(key, None)

    return EditorSession(pad, id, unicode(path), raw_data, datamodel, record,
                         exists, is_attachment)
Esempio n. 6
0
File: api.py Progetto: jab/lektor
def add_new_record():
    values = request.get_json()
    exists = False

    if not is_valid_id(values['id']):
        return jsonify(valid_id=False, exists=False, path=None)

    path = posixpath.join(values['path'], values['id'])

    ts = g.admin_context.pad.edit(path, datamodel=values.get('model'))
    with ts:
        if ts.exists:
            exists = True
        else:
            ts.update(values.get('data') or {})

    return jsonify({
        'valid_id': True,
        'exists': exists,
        'path': path
    })
Esempio n. 7
0
def make_editor_session(pad,
                        path,
                        is_attachment=None,
                        alt=PRIMARY_ALT,
                        datamodel=None):
    """Creates an editor session for the given path object."""
    if alt != PRIMARY_ALT and not pad.db.config.is_valid_alternative(alt):
        raise BadEdit("Attempted to edit an invalid alternative (%s)" % alt)

    raw_data = pad.db.load_raw_data(path,
                                    cls=OrderedDict,
                                    alt=alt,
                                    fallback=False)
    raw_data_fallback = None
    if alt != PRIMARY_ALT:
        raw_data_fallback = pad.db.load_raw_data(path, cls=OrderedDict)
        all_data = OrderedDict()
        all_data.update(raw_data_fallback or ())
        all_data.update(raw_data or ())
    else:
        all_data = raw_data

    id = posixpath.basename(path)
    if not is_valid_id(id):
        raise BadEdit("Invalid ID")

    record = None
    exists = all_data is not None
    if raw_data is None:
        raw_data = OrderedDict()

    if is_attachment is None:
        if not exists:
            is_attachment = False
        else:
            is_attachment = bool(all_data.get("_attachment_for"))
    elif bool(all_data.get("_attachment_for")) != is_attachment:
        raise BadEdit("The attachment flag passed is conflicting with the "
                      "record's attachment flag.")

    if exists:
        # XXX: what about changing the datamodel after the fact?
        if datamodel is not None:
            raise BadEdit("When editing an existing record, a datamodel "
                          "must not be provided.")
        datamodel = pad.db.get_datamodel_for_raw_data(all_data, pad)
    else:
        if datamodel is None:
            datamodel = pad.db.get_implied_datamodel(path, is_attachment, pad)
        elif isinstance(datamodel, string_types):
            datamodel = pad.db.datamodels[datamodel]

    if exists:
        record = pad.instance_from_data(dict(all_data), datamodel)

    for key in implied_keys:
        raw_data.pop(key, None)
        if raw_data_fallback:
            raw_data_fallback.pop(key, None)

    return EditorSession(
        pad,
        id,
        text_type(path),
        raw_data,
        raw_data_fallback,
        datamodel,
        record,
        exists,
        is_attachment,
        alt,
    )