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)
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
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'])
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)
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)
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)
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
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'])
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)
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)
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))
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"])
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
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
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)
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
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)
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)
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)))
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))
def page_not_found(e): set_language_switch_link("index") return render_template( 'page.html', content=gettext('Contents could not be found!')), 404