def doDeleteResource(wfile, base_tag): wlib = store.getWeblib() log.info('Deleting Tag %s' % unicode(base_tag)) wlib.tag_merge_del(base_tag, None) response.redirect(wfile, '/updateParent?url=/weblib')
def doLaunchURL(wfile, req): wlib = store.getWeblib() item = wlib.webpages.getById(req.rid) if not item: wfile.write('404 not found\r\n\r\n%s not found' % req.rid) return if util.isFileURL(item.url): # TODO: HACK win32 only?? # TODO: It is dangerous to launch anything could be executable or script from minds.weblib.win32 import ntfs_util ntfs_util.launch(item.url) wfile.write('content-type: text/html\r\n') wfile.write('Cache-control: no-cache\r\n') wfile.write('\r\n') wfile.write('''<html> <head> <script>window.close();</script> </head> <body> File launched in separate window. Please close this window. </body> </html> ''') else: response.redirect(wfile, item.url)
def main(wfile, req): # this is called from the controller weblib # if rid is defined, make sure it is valid if req.rid > 0: if not store.getWeblib().webpages.getById(req.rid): wfile.write('404 not found\r\n\r\n') wfile.write('rid %s not found' % req.rid) if req.method == 'PUT': bean = Bean(req) doPutResource(wfile, req, bean) elif req.method == 'POST': wfile.write('404 Method Not Allowed\r\n\r\n') wfile.write('Use PUT to update the item.') elif req.method == 'DELETE': doDeleteResource(wfile, req) else: # otherwise it is GET bean = Bean(req) if req.rid == -1 and bean.oldItem: # if bookmarklet to an existing item, redirect to the appropiate rid url = '%s?%s' % (request.rid_url(bean.item.id), req.env.get('QUERY_STRING','')) response.redirect(wfile, url) else: doGetResource(wfile, req, bean)
def doDeleteResource(wfile, req): wlib = store.getWeblib() item = wlib.webpages.getById(req.rid) if item: log.info('Deleting WebPage %s' % unicode(item)) store.getStore().removeItem(item) response.redirect(wfile, '/updateParent')
def doDelete(wfile, req): wlib = store.getWeblib() entries = _buildEntries(req) for item in entries: try: log.debug('Delete web page: %s', unicode(item)) store.getStore().removeItem(item) except: log.exception('Unable to delete: %s', unicode(item)) response.redirect(wfile, '/updateParent')
def doPost(wfile, req): wlib = store.getWeblib() # TODO: parse and check for error? text = req.param('category_description') # setDescription() has a quick & dirty way to get rid of illegal characters wlib.category.setDescription(text) response.redirect(wfile, '/weblib')
def main(rfile, wfile, env): req = request.Request(rfile, env) path = env.get('PATH_INFO', '') errors = [] # initialize current state state = upgrade_checker._getSystemState() form = { 'feed_url': state.feed_url, 'fetch_frequency': str(state.fetch_frequency), 'current_version': state.current_version, 'upgrade_info': state.upgrade_info, } log.debug('%s %s' % (path, str(state.upgrade_info))) if path == '/dismiss': upgrade_checker.set_config(dismiss=True) url = req.param('url','') if url: response.redirect(wfile, url) else: response.redirect(wfile, '/updateParent') return elif path == '/check': # 2006-04-02 23:50:26 DEBUG>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #state.current_version = '0.1' # assume it is an older version # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< upgrade_checker.pollUpgradeInfo(force_check=True) form['upgrade_info'] = state.upgrade_info # hack, do not redirect to /setting # we want the /check in the URL so that we can tell user no new version #response.redirect(wfile, '/upgrade/setting') elif req.method == 'POST': _freq_str = req.param('fetch_frequency',str(upgrade_checker.DEFAULT_FETCH_FREQUENCY)) if not _freq_str: _freq_str = '0' try: frequency = int(_freq_str) if frequency < 0: raise ValueError() except ValueError: form['fetch_frequency'] = _freq_str errors = ['Please enter a positive integer for check frequency.'] else: upgrade_checker.set_config(frequency=int(_freq_str)) form['fetch_frequency'] = str(state.fetch_frequency) renderer = UpgradeRenderer(wfile) renderer.setLayoutParam('MindRetrieve - Upgrade Notification Setting') renderer.output(errors, form, path)
def doGoResource(wfile, req): # the path are really for user's information only. # rid alone determines where to go. wlib = store.getWeblib() item = wlib.webpages.getById(req.rid) if not item: wfile.write('404 not found\r\n\r\n%s not found' % req.rid) return item = wlib.visit(item) response.redirect(wfile, item.url)
def main(rfile, wfile, env): wlib = store.getWeblib() req = request.WeblibRequest(rfile, env) log.debug(unicode(req)) path = req.path if req.rid: # rid based (note rid maybe -1) if path and path.startswith('go;'): doGoResource(wfile, req) elif path and path == 'url': doLaunchURL(wfile, req) elif path and path.startswith('snapshot'): weblibSnapshot.main(wfile, env, req.method, req.form, req.rid, path) elif path == 'form': doWeblibForm(wfile, req) else: # show form by default doWeblibForm(wfile, req) elif req.tid: doweblibTagForm(wfile, req) else: if path == 'load': doLoad(wfile, req) elif path == 'save': doSave(wfile, req) else: # query querytxt = req.param('query') tag = req.param('tag') # redirect to default tag (if it is defined) if not ('tag' in req.form or querytxt): dt = wlib.getDefaultTag() if dt: url = request.tag_url([dt]) response.redirect(wfile, url) return # if req.param('action') == 'cancel': # response.redirect(wfile, request.WEBLIB_URL) if tag: queryTag(wfile, req, tag) elif querytxt: queryWebLib(wfile, req, tag, querytxt) else: queryRoot(wfile, req)
def doSnapshot(wfile, form, str_rid, item): url = form.getfirst('url') if not url and item: url = item.url shot = snapshot.Snapshot() shot.fetch(url) spath = cfg.getpath('weblibsnapshot')/('%s.mhtml' % str_rid) fp = spath.open('wb') try: shot.generate(fp) finally: fp.close() if item: t = datetime.datetime.now() item.cached = str(t)[:10] response.redirect(wfile, '../snapshotFrame')
def doShowSnapshot(wfile, rid, rid_path): # the rid_path are really for user's information only. # rid alone determines where to go. wlib = store.getWeblib() item = wlib.webpages.getById(rid) if not item: wfile.write('404 not found\r\n\r\n%s not found' % rid) return filename = rid == -1 and '_.mhtml' or '%s.mhtml' % rid # TODO: check file exist, move to weblib? getSnapshotFile()? fp = (cfg.getpath('weblibsnapshot')/filename).open('rb') obj = mhtml.LoadedWebArchive.load_fp(fp) # do visit? # wlib.visit(item) response.redirect(wfile, obj.root_uri)
def queryWebLib(wfile, req, tag, querytxt): go_direct = req.param('submit') == '>' if querytxt.endswith('>'): querytxt = querytxt[:-1] go_direct = True wlib = store.getWeblib() tags, _ = weblib.parseTags(wlib, tag) # query result = query_wlib.query(wlib, querytxt, tags) # quick jump? if go_direct and result: top_item = result[0][0] #top_item = wlib.visit(top_item) response.redirect(wfile, top_item.url) return # category pane categoryList = _buildCategoryList(wlib) tag = tags and wlib.getTagByName(tags[-1]) or None # webitem pane webItems = [] if querytxt: tags_matched = query_wlib.query_tags(wlib, querytxt, tags) for tag in tags_matched: node = WebItemTagNode(tag) node.suffix = '...' webItems.append(node) for item,_ in result: webItems.append(WebItemNode(item)) renderer = WeblibRenderer(wfile) renderer.setLayoutParam(querytxt=querytxt) renderer.output( wlib.tags, None, wlib.getDefaultTag(), categoryList, webItems)
def doPutResource(wfile, req, bean): wlib = store.getWeblib() if not bean.validate(): FormRenderer(wfile).output(bean) return item = bean.item if bean.newTags: assert bean.create_tags item.tags = weblib.makeTags(store.getStore(), item.tags_description) if item.id < 0: log.info('Adding WebPage: %s' % unicode(item)) store.getStore().writeWebPage(item) else: log.info('Updating WebPage: %s' % unicode(item)) store.getStore().writeWebPage(item) response.redirect(wfile, '/updateParent')
def doQuery(wfile, req): wlib = store.getWeblib() querytxt = req.param('query') tag = req.param('tag') sort = _get_sort_preference(req) # No tag specified? Use fallback: 1. cookie, 2. default tag if not ('tag' in req.form or querytxt): def_tag = _tag_from_cookie(req) or wlib.getDefaultTag() if def_tag: url = request.tag_url([def_tag]) if sort: url = '%s&sort=%s' % (url, sort) response.redirect(wfile, url) return if tag: queryTag(wfile, req, tag, sort) elif querytxt: queryWebLib(wfile, req, tag, sort, querytxt) else: queryRoot(wfile, req, sort)
def doPost(wfile, req): wlib = store.getWeblib() entries = _buildEntries(req) checklist = _buildChecklist(req) errors = [] # parse add tags tags_description = req.param('add_tags') if weblib.Tag.hasIllegalChar(tags_description.replace(',',' ')): errors.append('These characters are not allowed in tag name: ' + weblib.Tag.ILLEGAL_CHARACTERS) tags_description = '' # check for new tags and the create_tags flag _, unknown = weblib.parseTags(wlib, tags_description) if unknown and (not req.param('create_tags')): tags = u', '.join(unknown) errors.append('These tags are not previous used: ' + tags) tags_description = '' # note: validation should be done, new tags will be created here set_tags = weblib.makeTags(store.getStore(), tags_description) remove_tags = [] # going through checklist, add to set_tags, delete_tags for tag, flag in checklist: if flag: if tag not in set_tags: set_tags.append(tag) else: remove_tags.append(tag) if errors: doShowForm(wfile, req, errors, checklist=checklist, new_tags=unknown) return log.debug('EditTags for %s entries set(%s) remove(%s).', len(entries), set_tags, remove_tags) wlib.editTags(entries, [], set_tags, remove_tags) store.getStore().refresh_when_needed() response.redirect(wfile, '/updateParent')
def doPostResource(wfile, base_tag, form_tag): wlib = store.getWeblib() newName = form_tag.name.strip() if not newName: errors = ['Please enter a name'] FormRenderer(wfile).output(errors, form_tag) return if weblib.Tag.hasIllegalChar(newName): errors = ['These characters are not allowed in tag name: ' + weblib.Tag.ILLEGAL_CHARACTERS] FormRenderer(wfile).output(errors, form_tag) return merge_tag = wlib.tags.getByName(newName) if merge_tag and merge_tag.id != base_tag.id: wlib.tag_merge_del(base_tag, merge_tag) # merge with existing tag new_id = merge_tag.id else: wlib.tag_rename(base_tag, newName) # just a rename (or change of capitalization) new_id = base_tag.id response.redirect(wfile, '/updateParent?url=' + urllib.quote('/weblib?tag=@%s' % new_id))
def doIndexNow(wfile, req): transformed, indexed, discarded = qmsg_processor.backgroundIndexTask(forceIndex=True) response.redirect(wfile, '/history')
def queryWebLib(wfile, req, tag, sort, querytxt): go_direct = req.param('submit') == '>' if querytxt.endswith('>'): querytxt = querytxt[:-1] go_direct = True wlib = store.getWeblib() tags, _ = weblib.parseTags(wlib, tag) # query result = query_wlib.query(wlib, querytxt, tags) # quick jump? if go_direct and result: top_item = result[0][0] #top_item = wlib.visit(top_item) response.redirect(wfile, top_item.url) return # category pane categoryList = _buildCategoryList(wlib) tag = tags and wlib.getTagByName(tags[-1]) or None # upgrade_info upgrade_info = upgrade_checker.pollUpgradeInfo() # webitem pane webItems = [] if querytxt: tags_matched = query_wlib.query_tags(wlib, querytxt, tags) for tag in tags_matched: node = WebItemTagNode(tag) node.suffix = '...' webItems.append(node) # sort result? col, order = SORT.parse_token(sort) if col == SORT.TITLE or col == SORT.DATE: lst = [] for r in result: item = r[0] if col == SORT.TITLE: key = item.name.lower() else: key = item.created lst.append((key,r)) lst.sort(reverse=(order==SORT.DESC)) result = [r for _,r in lst] for item,_ in result: webItems.append(WebItemNode(item)) # reconstuct the base url qs = urllib.quote_plus(querytxt.encode('utf8')) base_url = '/weblib?query=' + qs renderer = WeblibRenderer(wfile) if sort: renderer.cookie['weblib_sort'] = sort renderer.setLayoutParam(querytxt=querytxt) renderer.output( base_url, wlib.tags, None, wlib.getDefaultTag(), categoryList, upgrade_info, sort, webItems, )
def test_redirect(self): url = u'http://www.\N{euro sign}.com/' buf = StringIO.StringIO() response.redirect(buf, url) # this URL is actually registered! self.assert_('http://www.%E2%82%AC.com/' in buf.getvalue())