# 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"))\