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)
示例#12
0
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')
示例#14
0
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')
示例#18
0
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())