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)
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')")
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')
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)
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))
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 []
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'
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)
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 []