You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
5.8 KiB
Python

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

"""main flask app routes handlers
There are two types of routes, first the 'static' routes :
- /
- /about
- /actes
- /contact
- /privacy
- /termsofservice
Then the 'dynamic' (calculated) routes :
- /actes
- /actes/<house>
- /actes/<house>/<prince>
- /acte/<house>/<prince>/<dateitem>
- /geoloc
"""
import typing as t
from flask import Blueprint, abort, render_template, request, send_from_directory
import folium
from pymongo import ASCENDING
from .helper import *
from .dbinit import *
main = Blueprint("main", __name__, url_prefix="/")
# ______________________________________________________________________________
# routes
@main.route("/")
def home():
"""home route"""
return render_template("home.html")
@main.route("/about/")
def about():
"""about route"""
return render_template("about.html")
@main.route("/actes/")
def corpora_all():
"""copora all
lists houses
sample_house_names = ["Bourbon", "Berry", "Anjou", ...]
"""
houses = list(housecol.find())
return render_template("corpora_all.html", houses=houses)
@main.route("/actes/<house>") # dont put a slash at the end
def actes(house):
"""actes route
shows the princes in the selected house
:param: the house in the url is the house name
with a capital letter at the beginning
example: `house = "Berry"`
"""
# house in the store shall be in lower case, but let's force it, just in case
house = house.lower()
# sample result:
# [('Louis II de Bourbon', 'lo_ii'), ('Anne Dauphine', 'ann_i'), ('Agnès de Bourgogne', 'agn_i'), ('Charles Ier de Bourbon', 'ch_i')]
# [('Agnès de Bourgogne', 'agn_i'), ('Anne Dauphine', 'ann_i'), ('Charles Ier de Bourbon', 'ch_i'), ('Louis II de Bourbon', 'lo_ii')
princes = princes_in_houses[house]
# TODO : modify the jinja template's design in order to suppress this ugly line
princes = [(prc['prince_name'], prc['prince_code']) for prc in princes]
return render_template("corpus.html", house=house.capitalize(), princes=princes)
@main.route("/actes/<house>/<prince>") # don't put a slash at the end
def prince_corpus(house=None, prince=None):
"""copora prince, *timeline* view
"""
prince_code = prince.lower()
house = house.lower()
prince_long_name = extract_prince_in_house(house, prince_code)['prince_name']
query = list(actecol.aggregate([
{
"$match": {"house": house, "prince_code": prince_code}
},
{
"$sort": {"date_time": ASCENDING}
},
{
'$group': {'_id': {'prince_name': '$prince_name',
'prince_code': '$prince_code',
'filename': '$filename',
'date': '$date',
"date_time": "$date_time",
"analysis": '$analysis',
"place": "$place.name",
#"ref_acte": "$ref_acte"
"diplo_state": "$diplo_state",
"diplo_type": "$diplo_type"
}
}
}
]))
transformed_query = [pr['_id'] for pr in query]
# constructing the dateitem
for trs in transformed_query:
trs['timeitem'] = make_timeitem_from_filename(trs['filename'])
return render_template("prince_corpus.html", house=house, duke_name=prince_long_name,
prince_code=prince_code.capitalize(), actes=transformed_query)
@main.route("/acte/<house>/<prince>/<dateitem>") # don't put a slash at the end
def acte(house=None, prince=None, dateitem=None):
"""specific prince's acte view
:params: - house
- prince
- date + item (sample: 1441_08_05a)
:url location sample: /acte/Anjou/Isabelle_i/1441_08_05a
url transcription samples:
/acte/Anjou/Isabelle_i/1441_08_05a -> anj_isa_i_1441_08_05a
/acte/Bourbon/Anne_i/1388_09_15a -> brb_ann_i_1388_09_15a
"""
filestem = make_acteid_from_route(house, prince, dateitem)
result = actecol.find_one({'_id': filestem})
return render_template("acte.html", house=house, prince=prince,
#infos=None, place=None, doc=None, arch=None,
#diplo=diplo_t[0].replace("_", " "), state=state[0],
output_doc=result.get('xmlcontent'), name_prince=result.get("prince_name"),
folium=result.get("folium"),
transcribers=result.get('transcribers'))
@main.route("/geoloc")
def geoloc():
"global folium/leaflet map"
m = folium.Map(location=[46.603354, 1.888334], zoom_start=6)
for result in actecol.find():
place = result['place']
if place.get('latitude') is not None:
folium.Marker(
location=[place['latitude'], place['longitude']],
popup=place['name'],
icon=folium.Icon(color='lightgray', icon="circle", prefix='fa')
#icon=folium.Icon(color='lightgray', icon='home', prefix='fa')
).add_to(m)
geolocalisation = m._repr_html_()
return render_template("map.html", geolocalisation=geolocalisation)
#geolocalisation = folium_map.find_one()
#geolocalisation = geolocalisation['globalmap']
#return render_template("map.html", geolocalisation=geolocalisation)
@main.route("/contact")
def contact() -> t.Text:
"""Displays the Contact page"""
return render_template("contact.html", title="Contact")
@main.route("/termsofservice")
def terms() -> t.Text:
"""Displaysthe T&C page."""
return render_template("terms.html", title="Mentions légales")
@main.route("/privacy")
def privacy() -> t.Text:
"""Displays the privacy policy page."""
return render_template("privacy.html", title="Politique de confidentialité")