Пример #1
0
def author(result=None):
    set_language_switch_link("articleauthor_index")
    rule = request.url_rule
    lang = 'sv' if 'sv' in rule.rule else 'en'
    # Try to get authorinfo in correct language (with Swedish as fallback)
    firstname = result.split(", ")[-1].strip()
    lastname = result.split(", ")[0].strip()
    authorinfo = authors_dict.get(firstname + " " + lastname)
    if authorinfo:
        authorinfo = [
            authorinfo.get(lang, authorinfo.get("sv")),
            [
                helpers.markdown_html(i)
                for i in authorinfo.get("publications", [])
            ]
        ]
    query = "extended||and|artikel_forfattare_fornamn.lowerbucket|equals|%s||and|artikel_forfattare_efternamn.lowerbucket|equals|%s" % (
        firstname.encode("UTF-8"), lastname.encode("UTF-8"))
    page = computeviews.searchresult(result,
                                     name='articleauthor',
                                     query=query,
                                     imagefolder='authors',
                                     authorinfo=authorinfo,
                                     show_lang_switch=False)
    return set_cache(page)
Пример #2
0
def compute_activity(lang="", cache=True, url=''):
    set_language_switch_link("activity_index", lang=lang)
    art, lang = getcache('activity', lang, cache)

    if art is not None:
        return art

    infotext = helpers.get_infotext("activity", request.url_rule.rule)

    # Fix list with references to be inserted in results
    reference_list = static_info.activities_reference_list
    [ref.append("reference") for ref in reference_list]

    art = bucketcall(queryfield='verksamhetstext',
                     name='activity',
                     title=gettext("Activities"),
                     infotext=infotext,
                     alphabetical=True,
                     description=helpers.get_shorttext(infotext),
                     insert_entries=reference_list,
                     page_url=url)
    try:
        with mc_pool.reserve() as client:
            client.set(cache_name('activity', lang),
                       art,
                       time=app.config['CACHE_TIME'])
    except:
        # TODO what to do?
        pass
    return art
Пример #3
0
def keyword_index():
    infotext = helpers.get_infotext("keyword", request.url_rule.rule)
    set_language_switch_link("keyword_index")
    lang = 'sv' if 'sv' in request.url_rule.rule else 'en'
    pagename = 'keyword'
    art = check_cache(pagename, lang=lang)
    if art is not None:
        return art

    if lang == "en":
        reference_list = []
        queryfield = "nyckelord_eng"
    else:
        # Fix list with references to be inserted in results
        reference_list = static_info.keywords_reference_list
        [ref.append("reference") for ref in reference_list]
        queryfield = "nyckelord"

    art = computeviews.bucketcall(queryfield=queryfield,
                                  name='keyword',
                                  title='Keywords',
                                  infotext=infotext,
                                  alphabetical=True,
                                  insert_entries=reference_list,
                                  description=helpers.get_shorttext(infotext))
    return set_cache(art,
                     name=pagename,
                     lang=lang,
                     no_hits=app.config['CACHE_HIT_LIMIT'])
Пример #4
0
def institution_index():
    # There are no links to this page, but might be wanted later on
    # Exists only to support institution/<result> below
    set_language_switch_link("institution_index")
    page = computeviews.bucketcall(queryfield='prisbeskrivning',
                                   name='award',
                                   title='Institution',
                                   infotext='')
    return set_cache(page)
Пример #5
0
def empty_article():
    set_language_switch_link("article_empty")
    rule = request.url_rule
    if 'sv' in rule.rule:
        content = u"""Den här kvinnan saknas än så länge."""
    else:
        content = u"""This entry does not exist yet."""
    page = render_template('page.html', content=content)
    return set_cache(page)
Пример #6
0
def start():
    page = check_cache("start")
    if page is not None:
        return page
    infotext = helpers.get_infotext("start", request.url_rule.rule)
    set_language_switch_link("index")
    page = render_template('start.html',
                           title="Svenskt kvinnobiografiskt lexikon",
                           infotext=infotext,
                           description=helpers.get_shorttext(infotext))
    return set_cache(page)
Пример #7
0
def compute_artikelforfattare(infotext='',
                              description='',
                              lang="",
                              cache=True,
                              url=''):
    set_language_switch_link("articleauthor_index", lang=lang)
    art, lang = getcache('author', lang, cache)
    if art is not None:
        return art
    q_data = {
        'buckets':
        'artikel_forfattare_fornamn.bucket,artikel_forfattare_efternamn.bucket'
    }
    data = karp_query('statlist', q_data)
    # strip kw0 to get correct sorting
    stat_table = [[kw[0].strip()] + kw[1:] for kw in data['stat_table']
                  if kw[0] != ""]
    stat_table = [[kw[1] + ',', kw[0], kw[2]] for kw in stat_table]

    # Remove duplicates and some wrong ones (because of backend limitation):
    stoplist = {
        u"Grevesmühl,Kajsa": True,
        u"Ohrlander,Anders": True,
        u"Myrberg Burström,Mats": True,
        u"Burström,Nanouschka": True,
        u"Ljung,Yvonne": True,
        u"Lindholm,Barbro": True
    }
    added = {}
    new_stat_table = []
    for item in stat_table:
        fullname = item[0] + item[1]
        if fullname not in added and fullname not in stoplist:
            new_stat_table.append(item)
            added[fullname] = True
    art = render_template('bucketresults.html',
                          results=new_stat_table,
                          alphabetical=True,
                          title=gettext('Article authors'),
                          name='articleauthor',
                          infotext=infotext,
                          description=description,
                          sortnames=True,
                          page_url=url)
    try:
        with mc_pool.reserve() as client:
            client.set(cache_name('author', lang),
                       art,
                       time=app.config['CACHE_TIME'])
    except:
        # TODO what to do?
        pass
    return art
Пример #8
0
def award_index():
    # There are no links to this page, but might be wanted later on
    # Exists only to support award/<result> below
    set_language_switch_link("award_index")
    pagename = 'award'
    art = check_cache(pagename)
    if art is not None:
        return art
    art = computeviews.bucketcall(queryfield='prisbeskrivning',
                                  name='award',
                                  title='Award',
                                  infotext='')
    return set_cache(art, name=pagename, no_hits=app.config['CACHE_HIT_LIMIT'])
Пример #9
0
def compute_contact_form():
    set_language_switch_link("contact")

    email = request.form['email'].strip()
    required_fields = ["name", "email"]

    if request.form['mode_switch'] == 'suggest_new':
        mode = "suggestion"
        required_fields.extend([
            "subject_name", "subject_lifetime", "subject_activity",
            "motivation"
        ])
    elif request.form['mode_switch'] == 'correction':
        mode = "correction"
        required_fields.append("message")
    else:
        mode = "other"
        required_fields.append("message")

    error_msgs = []
    errors = []
    for field in required_fields:
        if not request.form[field]:
            error_msgs.append(gettext("Please enter all the fields!"))
            errors.append(field)

    if email and not helpers.is_email_address_valid(email):
        error_msgs.append(gettext("Please enter a valid email address!"))

    # Render error messages and tell user what went wrong
    error_msgs = list(set(error_msgs))
    if error_msgs:
        return render_template(
            "contact.html",
            title=gettext("Contact"),
            headline=gettext("Contact SKBL"),
            errors=error_msgs,
            name_error=True if "name" in errors else False,
            email_error=True if "email" in errors else False,
            message_error=True if "message" in errors else False,
            subject_name_error=True if "subject_name" in errors else False,
            subject_lifetime_error=True
            if "subject_lifetime" in errors else False,
            subject_activity_error=True
            if "subject_activity" in errors else False,
            motivation_error=True if "motivation" in errors else False,
            form_data=request.form,
            mode=mode)

    else:
        return make_email(request.form, mode)
Пример #10
0
def contact():
    set_language_switch_link("contact")

    # Set suggestion checkbox
    if request.args.get('suggest') == 'true':
        mode = "suggestion"
    else:
        mode = "other"
    page = render_template("contact.html",
                           title=gettext("Contact"),
                           headline=gettext("Contact SKBL"),
                           form_data={},
                           mode=mode)
    return set_cache(page)
Пример #11
0
def more_women():
    page = check_cache("morewoman")
    if page is not None:
        return page
    infotext = helpers.get_infotext("more-women", request.url_rule.rule)
    set_language_switch_link("more-women")
    page = render_template('more_women.html',
                           women=static_info.more_women,
                           infotext=infotext,
                           linked_from=request.args.get('linked_from'),
                           title=gettext("More women"))
    return set_cache(page,
                     name="morewoman",
                     no_hits=len(static_info.more_women))
Пример #12
0
def search():
    set_language_switch_link("search")
    search = request.args.get('q', '').encode('utf-8')
    pagename = 'search' + urllib.quote(search)

    page = check_cache(pagename)
    if page is not None:
        return page

    advanced_search_text = ''
    if search:
        show = ','.join(
            ['name', 'url', 'undertitel', 'undertitel_eng', 'lifespan'])
        karp_q = {
            'highlight': True,
            'size': app.config['SEARCH_RESULT_SIZE'],
            'show': show
        }
        if '*' in search:
            search = re.sub('(?<!\.)\*', '.*', search)
            karp_q['q'] = "extended||and|anything|regexp|%s" % search
        else:
            karp_q['q'] = "extended||and|anything|contains|%s" % search

        data = karp_query('minientry', karp_q, mode='skbl')
        with app.open_resource("static/pages/advanced-search/%s.html" %
                               (g.language)) as f:
            advanced_search_text = f.read()
        karp_url = "https://spraakbanken.gu.se/karp/#?mode=skbl&advanced=false&hpp=25&extended=and%7Cnamn%7Cequals%7C&searchTab=simple&page=1&search=simple%7C%7C" + search.decode(
            "utf-8")
    else:
        data = {"hits": {"total": 0, "hits": []}}
        karp_url = ""
        search = u'\u200b'.encode('utf8')

    t = render_template(
        'list.html',
        headline="",
        subheadline=gettext('Hits for "%s"') % search.decode("UTF-8"),
        hits_name=data["hits"],
        hits=data["hits"],
        advanced_search_text=advanced_search_text.decode("UTF-8"),
        search=search.decode("UTF-8"),
        alphabetic=True,
        karp_url=karp_url,
        more=data["hits"]["total"] > app.config["SEARCH_RESULT_SIZE"],
        show_lang_switch=False)

    return set_cache(t, name=pagename, no_hits=data["hits"]["total"])
Пример #13
0
def compute_place(lang="", cache=True, url=''):
    set_language_switch_link("place_index", lang=lang)
    art, lang = getcache('place', lang, cache)
    if art is not None:
        return art
    infotext = helpers.get_infotext("place", request.url_rule.rule)

    def parse(kw):
        place = kw.get('key')
        # May be used to parse names with or without coordinates:
        # "Lysekil" or "Lysekil|58.275573|11.435558"
        if '|' in place:
            name, lat, lon = place.split('|')
        else:
            name = place.strip()
            lat, lon = 0, 0
        placename = name if name else '%s, %s' % (lat, lon)
        return {
            'name': placename,
            'lat': lat,
            'lon': lon,
            'count': kw.get('doc_count')
        }

    def has_name(kw):
        name = kw.get('key').split('|')[0]
        if name and u"(osäker uppgift)" not in name:
            return name
        else:
            return None

    # To use the coordinates, use 'getplaces' instead of 'getplacenames'
    data = karp_query('getplacenames', {})
    stat_table = [parse(kw) for kw in data['places'] if has_name(kw)]
    art = render_template('places.html',
                          places=stat_table,
                          title=gettext("Placenames"),
                          infotext=infotext,
                          description=helpers.get_shorttext(infotext),
                          page_url=url)
    try:
        with mc_pool.reserve() as client:
            client.set(cache_name('place', lang),
                       art,
                       time=app.config['CACHE_TIME'])
    except:
        # TODO what to do?
        pass
    return art
Пример #14
0
def compute_article(lang="", cache=True, url=''):
    set_language_switch_link("article_index", lang=lang)
    art, lang = getcache('article', lang, cache)
    if art is not None:
        return art

    show = ','.join(
        ['name', 'url', 'undertitel', 'lifespan', 'undertitel_eng'])
    infotext = helpers.get_infotext("article", request.url_rule.rule)
    if lang == 'sv':
        data = karp_query('minientry', {
            'q':
            "extended||and|namn|exists",
            'show':
            show,
            'sort':
            'sorteringsnamn.sort,sorteringsnamn.init,sorteringsnamn,tilltalsnamn.sort,tilltalsnamn'
        },
                          mode="skbllinks")
    else:
        data = karp_query('minientry', {
            'q':
            "extended||and|namn|exists",
            'show':
            show,
            'sort':
            'sorteringsnamn.eng_sort,sorteringsnamn.eng_init,sorteringsnamn,tilltalsnamn.sort,tilltalsnamn'
        },
                          mode="skbllinks")

    art = render_template('list.html',
                          hits=data["hits"],
                          headline=gettext(u'Women A-Z'),
                          alphabetic=True,
                          split_letters=True,
                          infotext=infotext,
                          title='Articles',
                          page_url=url)
    try:
        with mc_pool.reserve() as client:
            client.set(cache_name('article', lang),
                       art,
                       time=app.config['CACHE_TIME'])
    except:
        # TODO what to do?
        pass
    return art
Пример #15
0
def article(id=None):
    rule = request.url_rule
    if 'sv' in rule.rule:
        lang = "sv"
    else:
        lang = "en"
    pagename = 'article_' + id
    page = check_cache(pagename, lang=lang)
    if page is not None:
        return page
    data = karp_query('query', {'q': "extended||and|url|equals|%s" % (id)})
    if data['hits']['total'] == 0:
        data = karp_query('query',
                          {'q': "extended||and|id.search|equals|%s" % (id)})
    set_language_switch_link("article_index", id)
    page = show_article(data, lang)
    return set_cache(page, name=pagename, lang=lang, no_hits=1)
Пример #16
0
def compute_organisation(lang="", infotext="", cache=True, url=''):
    set_language_switch_link("organisation_index", lang=lang)
    art, lang = getcache('organisation', lang, cache)
    if art is not None:
        return art

    infotext = helpers.get_infotext("organisation", request.url_rule.rule)
    if lang == "en":
        data = karp_query(
            'minientry', {
                'q': 'extended||and|anything|regexp|.*',
                'show': 'organisationsnamn,organisationstyp_eng'
            })
        typefield = "type_eng"
    else:
        data = karp_query(
            'minientry', {
                'q': 'extended||and|anything|regexp|.*',
                'show': 'organisationsnamn,organisationstyp'
            })
        typefield = "type"
    nested_obj = {}
    for hit in data['hits']['hits']:
        for org in hit['_source'].get('organisation', []):
            orgtype = helpers.unescape(org.get(typefield, '-'))
            if orgtype not in nested_obj:
                nested_obj[orgtype] = defaultdict(set)
            nested_obj[orgtype][org.get('name', '-')].add(hit['_id'])
    art = render_template('nestedbucketresults.html',
                          results=nested_obj,
                          title=gettext("Organisations"),
                          infotext=infotext,
                          name='organisation',
                          page_url=url)
    try:
        with mc_pool.reserve() as client:
            client.set(cache_name('organisation', lang),
                       art,
                       time=app.config['CACHE_TIME'])
    except:
        # TODO what to do?
        pass
    return art
Пример #17
0
def article_index(search=None):
    # search is only used by links in article text

    set_language_switch_link("article_index")
    search = search or request.args.get('search')
    if search is not None:
        search = search.encode("UTF-8")
        data, id = find_link(search)
        if id:
            # only one hit is found, redirect to that page
            page = redirect(url_for('article_' + g.language, id=id))
            return set_cache(page)
        elif data["hits"]["total"] > 1:
            # more than one hit is found, redirect to a listing
            page = redirect(url_for('search_' + g.language, q=search))
            return set_cache(page)
        else:
            # no hits are found redirect to a 'not found' page
            return render_template(
                'page.html',
                content=gettext('Contents could not be found!')), 404

    art = computeviews.compute_article()
    return set_cache(art)
Пример #18
0
def place(place=None):
    pagename = urllib.quote('place_' + place.encode('utf8'))
    art = check_cache(pagename)
    if art is not None:
        return art
    lat = request.args.get('lat')
    lon = request.args.get('lon')
    set_language_switch_link("place_index", place)
    hits = karp_query('query', {
        'q':
        "extended||and|plats.searchraw|equals|%s" % (place.encode('utf-8'))
    })
    no_hits = hits['hits']['total']
    if no_hits > 0:
        page = render_template('placelist.html',
                               title=place,
                               lat=lat,
                               lon=lon,
                               headline=place,
                               hits=hits["hits"])
    else:
        page = render_template('page.html',
                               content=gettext('Contents could not be found!'))
    return set_cache(page, name=pagename, no_hits=no_hits)
Пример #19
0
def authors():
    infotext = helpers.get_infotext("articleauthor", request.url_rule.rule)
    set_language_switch_link("articleauthor_index")
    return set_cache(
        computeviews.compute_artikelforfattare(
            infotext=infotext, description=helpers.get_shorttext(infotext)))
Пример #20
0
def searchresult(result,
                 name='',
                 searchfield='',
                 imagefolder='',
                 query='',
                 searchtype='equals',
                 title='',
                 authorinfo=False,
                 lang='',
                 show_lang_switch=True,
                 cache=True):
    set_language_switch_link("%s_index" % name, result)
    try:
        result = result.encode("UTF-8")
        pagename = name + '_' + urllib.quote(result)
        art = check_cache(pagename, lang)
        if art is not None:
            return art
        show = ','.join(
            ['name', 'url', 'undertitel', 'lifespan', 'undertitel_eng'])
        if query:
            hits = karp_query('minientry', {'q': query, 'show': show})
        else:
            hits = karp_query(
                'minientry', {
                    'q':
                    "extended||and|%s.search|%s|%s" %
                    (searchfield, searchtype, result),
                    'show':
                    show
                })
        title = title or result.decode("UTF-8")

        no_hits = hits['hits']['total']
        if no_hits > 0:
            picture = None
            if os.path.exists(app.config.root_path +
                              '/static/images/%s/%s.jpg' %
                              (imagefolder, result)):
                picture = '/static/images/%s/%s.jpg' % (imagefolder, result)
            page = render_template('list.html',
                                   picture=picture,
                                   alphabetic=True,
                                   title=title,
                                   headline=title,
                                   hits=hits["hits"],
                                   authorinfo=authorinfo,
                                   show_lang_switch=show_lang_switch)
            if no_hits >= app.config['CACHE_HIT_LIMIT']:
                try:
                    with mc_pool.reserve() as client:
                        client.set(cache_name(pagename, lang),
                                   page,
                                   time=app.config['CACHE_TIME'])
                except:
                    # TODO what to do?
                    pass
            return page

        else:
            return render_template(
                'page.html', content=gettext('Contents could not be found!'))

    except Exception as e:
        return render_template(
            'page.html',
            content="%s\n%s: extended||and|%s.search|%s|%s" %
            (e, app.config['KARP_BACKEND'], searchfield, searchtype, result))
Пример #21
0
def page_not_found(e):
    set_language_switch_link("index")
    return render_template(
        'page.html', content=gettext('Contents could not be found!')), 404