116 lines
4.1 KiB
Python
116 lines
4.1 KiB
Python
# import the library and its Marker clusterization service
|
|
import folium
|
|
from database import SessionLocal
|
|
from folium.plugins import MarkerCluster
|
|
import models
|
|
import logging
|
|
from geopy.geocoders import Bing
|
|
from sqlalchemy import *
|
|
import logging
|
|
import webbrowser
|
|
import re
|
|
|
|
|
|
def payment_slip_delivered(member: models.Members, year: int):
|
|
return db.query(models.Deliveries.delivery_date)\
|
|
.filter(models.Deliveries.member_id == member.id, extract('year', models.Deliveries.delivery_date) == year)\
|
|
.count()
|
|
|
|
def update_missing_locs():
|
|
members = db.query(models.Members).filter(models.Members.member_geo_latitude == None).all()
|
|
|
|
for member in members:
|
|
address = f'{member.member_street} {member.member_streetnumber}, {member.member_zip} {member.member_city}, Austria'
|
|
location = geolocator.geocode(address)
|
|
|
|
if location != None:
|
|
#member.member_coordinates = [location.latitude, location.longitude]
|
|
member.member_geo_latitude = location.latitude
|
|
member.member_geo_longitude = location.longitude
|
|
|
|
logger.info(f'Member: {member.id} updated with geo-coordinates')
|
|
else:
|
|
logger.info(f'Member: {member.id} address couldn\'t be found')
|
|
|
|
db.commit()
|
|
|
|
def checkEmail(email):
|
|
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
|
|
|
|
if email is None: return False
|
|
|
|
# pass the regular expression
|
|
# and the string into the fullmatch() method
|
|
if(re.fullmatch(regex, email)):
|
|
return True
|
|
|
|
else:
|
|
return False
|
|
|
|
logger = logging.getLogger(__name__)
|
|
logger.info("An info")
|
|
logger.warning("A warning")
|
|
|
|
#geolocator = Nominatim(user_agent="sust", timeout=10)
|
|
geolocator = Bing(api_key='ApbTfEJ024nQCu6DC7TPIlqAcRMfZT8lPjAyMnVRcmo9rqxde5x-IS4fW-nGu0FI')
|
|
|
|
db = SessionLocal()
|
|
#models.Base.metadata.create_all(bind=engine)
|
|
|
|
update_missing_locs()
|
|
|
|
#members = db.query(models.Members).filter(models.Members.id.in_([2,4,5,6])).all()
|
|
|
|
#TODO try
|
|
""" members = Members.query.all()
|
|
for member in members:
|
|
for delivery in members.deliveries:
|
|
print(f'{delivery.delivery_date}') """
|
|
|
|
members = db.query(models.Members.member_geo_latitude,
|
|
models.Members.member_geo_longitude,
|
|
models.Members.member_firstname,
|
|
models.Members.member_surname,
|
|
models.Members.id,
|
|
models.Members.member_email)\
|
|
.filter(models.Members.member_geo_latitude != None, models.Members.member_count != 0)\
|
|
.all()
|
|
|
|
# .join(models.Members.member_deliveries)\
|
|
# Create a map object and center it to the avarage coordinates to m
|
|
coords = [48.284793, 13.880550]
|
|
map = folium.Map(location=coords, zoom_start = 13)
|
|
|
|
# if the points are too close to each other, cluster them, create a cluster overlay with MarkerCluster, add to m
|
|
marker_cluster = MarkerCluster().add_to(map)
|
|
|
|
# draw the markers and assign popup and hover texts
|
|
# add the markers the the cluster layers so that they are automatically clustered
|
|
#folium.Marker([lat, lon], popup=str(name)+': '+color+'-'+str(clname), icon=folium.Icon(color='black',icon_color='#FFFF00')).add_to(feature_group)
|
|
for member in members:
|
|
if member.member_geo_latitude != None and member.member_geo_latitude != None:
|
|
delivered = payment_slip_delivered(member, 2024)
|
|
|
|
iconColor = "blue"
|
|
hasMail = checkEmail(member.member_email)
|
|
if hasMail:
|
|
iconColor = "orange"
|
|
elif delivered:
|
|
iconColor = "green"
|
|
|
|
if hasMail and delivered:
|
|
iconColor = "darkgreen"
|
|
|
|
#delivered = member.member_deliveries
|
|
location = (member.member_geo_latitude, member.member_geo_longitude)
|
|
folium.Marker(location=location,
|
|
popup=f'{member.member_firstname} {member.member_surname}',
|
|
tooltip=f'\nZugestellt' if delivered else 'Nicht zugestellt',
|
|
icon=folium.Icon(color=iconColor))\
|
|
.add_to(marker_cluster)
|
|
|
|
#Display the map
|
|
map.save("map.html")
|
|
webbrowser.open("map.html")
|
|
|
|
#func.count(models.Members.member_deliveries).label("count"))\ |