Пример #1
0
def _put_tiddler(environ, start_response, tiddler):
    """
    The guts of putting a tiddler into the store.

    There's a fair bit of special handling done here
    depending on whether the tiddler already exists or
    not.
    """
    store = environ['tiddlyweb.store']

    try:
        bag = Bag(tiddler.bag)
        tiddler.revision = _check_and_validate_tiddler(environ, bag, tiddler)

        user = environ['tiddlyweb.usersign']['name']
        if not user == 'GUEST':
            tiddler.modifier = user
        tiddler.modified = current_timestring()

        try:
            _check_bag_constraint(environ, bag, 'accept')
        except (PermissionsError), exc:
            _validate_tiddler_content(environ, tiddler)

        store.put(tiddler)
Пример #2
0
def _put_tiddler(environ, start_response, tiddler):
    """
    The guts of putting a tiddler into the store.

    There's a fair bit of special handling done here
    depending on whether the tiddler already exists or
    not.
    """
    store = environ['tiddlyweb.store']

    try:
        bag = Bag(tiddler.bag)
        tiddler.revision = _check_and_validate_tiddler(environ, bag, tiddler)

        user = environ['tiddlyweb.usersign']['name']
        if not user == 'GUEST':
            tiddler.modifier = user
        tiddler.modified = current_timestring()

        try:
            _check_bag_constraint(environ, bag, 'accept')
        except (PermissionsError), exc:
            _validate_tiddler_content(environ, tiddler)

        store.put(tiddler)
Пример #3
0
def touch(args):
    """create a new empty tiddler or update modfied time on existing tiddler: <bag> <tiddler>"""
    source_bag, source_tiddler = _parse_args(args, 2, 2)
    source_tiddler = _reify_entities(source_bag,
                                     source_tiddler,
                                     source_exist=False)
    source_tiddler.modified = current_timestring()
    _write_new_tiddler(source_tiddler)
def test_parse_date():
    """ some of these will fail on some midnights """
    nowstring = current_timestring()
    assert parse_date('2009') == '20090000000000'
    assert parse_date('1d')[0:6] == nowstring[0:6]
    assert parse_date('1h')[0:8] == nowstring[0:8]
    assert parse_date('1m')[0:10] == nowstring[0:10]
    assert parse_date('1s')[0:12] == nowstring[0:12]
    assert int(parse_date('1y')[0:4]) == int(nowstring[0:4]) - 1
    assert py.test.raises(FilterError, "parse_date('1x')")
    assert py.test.raises(FilterError, "parse_date('0.2s')")
Пример #5
0
def http_date_from_timestamp(timestamp):
    """
    Turn a modifier or created tiddler ``timestamp``
    into a properly formatted HTTP date. If the timestamp
    is invalid use the current time as the timestamp.
    """
    try:
        timestamp_datetime = timestring_to_datetime(timestamp)
    except ValueError:
        timestamp_datetime = timestring_to_datetime(current_timestring())
    return timestamp_datetime.strftime('%a, %d %b %Y %H:%M:%S GMT')
Пример #6
0
def http_date_from_timestamp(timestamp):
    """
    Turn a modifier or created tiddler ``timestamp``
    into a properly formatted HTTP date. If the timestamp
    is invalid use the current time as the timestamp.
    """
    try:
        timestamp_datetime = timestring_to_datetime(timestamp)
    except ValueError:
        timestamp_datetime = timestring_to_datetime(current_timestring())
    return timestamp_datetime.strftime('%a, %d %b %Y %H:%M:%S GMT')
Пример #7
0
def _update_gym_info(environ, tiddler):
    store = environ['tiddlyweb.store']
    query = environ['tiddlyweb.query']
    for key in ['fullname', 'tagline', 'geo.lat', 'geo.long']:
        value = query.get(key, [''])[0]
        tiddler.fields[key] = value
    tiddler.modifier = environ['tiddlyweb.usersign']['name']
    tiddler.modified = current_timestring()
    try:
        store.put(tiddler)
    except StoreError, exc:
        raise HTTP400('Unable to save gym: %s' % exc)
Пример #8
0
def test_current_timestring():
    """
    Confirm timestring has desired format and is at least in
    the ballpark of now.
    """

    current_time = datetime.datetime.utcnow()
    year = current_time.year
    month = current_time.month
    timestring = current_timestring()

    assert len(timestring) == 14
    assert timestring.startswith('%d%02d' % (year, month))
Пример #9
0
def test_current_timestring():
    """
    Confirm timestring has desired format and is at least in
    the ballpark of now.
    """

    current_time = datetime.datetime.utcnow()
    year = current_time.year
    month = current_time.month
    timestring = current_timestring()

    assert len(timestring) == 14
    assert timestring.startswith('%d%02d' % (year, month))
Пример #10
0
def _put_tiddler(environ, start_response, tiddler):
    """
    The guts of putting a tiddler into the store.

    There's a fair bit of special handling done here
    depending on whether the tiddler already exists or
    not.
    """
    store = environ['tiddlyweb.store']

    try:
        bag = Bag(tiddler.bag)
        _check_and_validate_tiddler(environ, bag, tiddler)

        user = environ['tiddlyweb.usersign']['name']
        if not user == 'GUEST':
            tiddler.modifier = user
        tiddler.modified = current_timestring()

        try:
            check_bag_constraint(environ, bag, 'accept')
        except (PermissionsError) as exc:
            _validate_tiddler_content(environ, tiddler)

        store.put(tiddler)
    except NoBagError as exc:
        raise HTTP409("Unable to put tiddler, %s. There is no bag named: "
                "%s (%s). Create the bag." %
                (tiddler.title, tiddler.bag, exc))
    except NoTiddlerError as exc:
        raise HTTP404('Unable to put tiddler, %s. %s' % (tiddler.title, exc))
    except TypeError as exc:
        raise HTTP409('Unable to put badly formed tiddler, %s:%s. %s'
                % (tiddler.bag, tiddler.title, exc))

    etag = ('ETag', tiddler_etag(environ, tiddler))
    response = [('Location', tiddler_url(environ, tiddler))]
    if etag:
        response.append(etag)
    start_response("204 No Content", response)

    return []
Пример #11
0
def _put_tiddler(environ, start_response, tiddler):
    """
    The guts of putting a tiddler into the store.

    There's a fair bit of special handling done here
    depending on whether the tiddler already exists or
    not.
    """
    store = environ['tiddlyweb.store']

    try:
        bag = Bag(tiddler.bag)
        _check_and_validate_tiddler(environ, bag, tiddler)

        user = environ['tiddlyweb.usersign']['name']
        tiddler.modifier = user
        tiddler.modified = current_timestring()

        try:
            check_bag_constraint(environ, bag, 'accept')
        except (PermissionsError):
            _validate_tiddler_content(environ, tiddler)

        store.put(tiddler)
    except NoBagError as exc:
        raise HTTP409("Unable to put tiddler, %s. There is no bag named: "
                "%s (%s). Create the bag." %
                (tiddler.title, tiddler.bag, exc))
    except NoTiddlerError as exc:
        raise HTTP404('Unable to put tiddler, %s. %s' % (tiddler.title, exc))
    except TypeError as exc:
        raise HTTP409('Unable to put badly formed tiddler, %s:%s. %s'
                % (tiddler.bag, tiddler.title, exc))

    etag = ('ETag', tiddler_etag(environ, tiddler))
    response = [('Location', tiddler_url(environ, tiddler))]
    if etag:
        response.append(etag)
    start_response("204 No Content", response)

    return []
def test_select():
    # cook some known modified strings in the past
    nowstring = current_timestring()
    now = int(nowstring)
    yearago = str(now - 10000000101)
    dayago = str(now - 1000101)

    tiddlers = []

    tiddler = Tiddler('now')
    tiddler.modified = nowstring
    tiddlers.append(tiddler)

    tiddler = Tiddler('year')
    tiddler.modified = yearago
    tiddlers.append(tiddler)

    tiddler = Tiddler('day')
    tiddler.modified = dayago
    tiddlers.append(tiddler)

    results = list(filter_tiddlers(tiddlers, 'select=modified:<1y'))
    assert len(results) == 1
    assert results[0].title == 'year'

    results = list(filter_tiddlers(tiddlers, 'select=modified:>1y'))
    assert len(results) == 2
    assert sorted(tiddler.title for tiddler in results) == ['day', 'now']

    results = list(filter_tiddlers(tiddlers, 'select=modified:<1d'))
    assert len(results) == 2
    assert sorted(tiddler.title for tiddler in results) == ['day', 'year']

    results = list(filter_tiddlers(tiddlers, 'select=modified:>1m'))
    assert len(results) == 1
    assert results[0].title == 'now'
Пример #13
0
    bag = store.get(bag)
    try:
        if tiddler_new:
            bag.policy.allows(user, 'create')
        else:
            bag.policy.allows(user, 'write')
    except (UserRequiredError, ForbiddenError):
        challenge_url = _challenge_url(environ)
        message = """
You do not have permission. Copy your edits, <a href="%s">login</a>, then try again.
""" % challenge_url
        return _editor_display(environ, tiddler, message=message)

    tiddler.modifier = user['name']
    tiddler.modified = current_timestring()
    store.put(tiddler)
    location = '%s%s/%s' % (server_base_url(environ),
            _route_base(config), tiddler.title)
    raise HTTP303(location)


@do_html()
def editor(environ, start_response):
    """
    Display an editing interface for the tiddler named in the URL.
    """
    tiddler = _determine_tiddler(environ)
    return _editor_display(environ, tiddler)

Пример #14
0
def edit(environ, start_response):
    """
    XXX: Lots of duplication from editor.
    """
    store = environ['tiddlyweb.store']
    usersign = environ['tiddlyweb.usersign']
    query = environ['tiddlyweb.query']

    try:
        bag_name = query['bag'][0]
        title = query['title'][0]
        text = query['text'][0]
        tiddler_type = query['type'][0]
        tags = query['tags'][0]
        etag = query['etag'][0]
    except KeyError as exc:
        raise HTTP400('bad query: incomplete form, %s' % exc)

    tags = [tag.strip() for tag in tags.split(',')]

    if not (bag_name and title):
        raise HTTP400('bad query: bag and title required')

    bag = Bag(bag_name)
    try:
        bag = store.get(bag)
    except NoBagError:
        raise HTTP404('that tank does not exist')

    tiddler = Tiddler(title, bag_name)
    tiddler_new = False
    conflict = False
    try:
        tiddler = store.get(tiddler)
        existing_etag = tiddler_etag(environ, tiddler).replace('"',
                '').split(':', 1)[0]
        if etag != existing_etag:
            conflict = True
    except NoTiddlerError:
        tiddler.type = tiddler_type
        tiddler_new = True

    if tiddler_new:
        bag.policy.allows(usersign, 'create')
    else:
        bag.policy.allows(usersign, 'write')

    tiddler.text = text
    tiddler.tags = tags
    tiddler.modifier = usersign['name']
    tiddler.modified = current_timestring()

    if conflict:
        return editor(environ, start_response, tiddler,
                message='conflict')

    try:
        validate_tiddler(tiddler, environ)
    except InvalidTiddlerError as exc:
        return editor(environ, start_response, tiddler,
                message='Tiddler content is invalid: %s' % exc)

    store.put(tiddler)

    redirect_uri = tank_page_uri(environ, tiddler.bag, tiddler.title)

    start_response('303 See Other', [
        ('Location', str(redirect_uri))])

    return []
Пример #15
0
def touch(args):
    """create a new empty tiddler or update modfied time on existing tiddler: <bag> <tiddler>"""
    source_bag, source_tiddler = _parse_args(args, 2, 2)
    source_tiddler = _reify_entities(source_bag, source_tiddler, source_exist=False)
    source_tiddler.modified = current_timestring()
    _write_new_tiddler(source_tiddler)