Files
SUST/member_map.py
T
2024-03-13 11:31:10 +01:00

124 lines
4.5 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 payment_made(member: models.Members, year: int):
return db.query(models.Payments.payment_date)\
.filter(models.Payments.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)
paid = payment_made(member, 2024)
iconColor = "blue"
hasMail = checkEmail(member.member_email)
if not paid:
iconColor = "red"
elif delivered:
iconColor = "green"
elif hasMail:
iconColor = "orange"
# 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 & bezahlt' if (delivered and paid) else 'Nicht bezahlt' if not paid 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"))\