add emergency feature
This commit is contained in:
		
							parent
							
								
									ec82ce8b24
								
							
						
					
					
						commit
						d84e937c1f
					
				@ -183,6 +183,18 @@ def dashboard_bb_write(call, dmr_id, time, bulletin):
 | 
				
			|||||||
            user_bb_file.close()
 | 
					            user_bb_file.close()
 | 
				
			||||||
    logger.info('User bulletin entry saved.')
 | 
					    logger.info('User bulletin entry saved.')
 | 
				
			||||||
    #logger.info(dash_bb)
 | 
					    #logger.info(dash_bb)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					def sos_write(dmr_id, time, message):
 | 
				
			||||||
 | 
					    user_settings = ast.literal_eval(os.popen('cat ./user_settings.txt').read())
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        sos_call = user_settings[dmr_id][0]['call'] + '-' + user_settings[dmr_id][1]['ssid']
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        sos_call = str(get_alias((dmr_id), subscriber_ids))
 | 
				
			||||||
 | 
					    sos_info = {'call': sos_call, 'dmr_id': dmr_id, 'time': time, 'message':message}
 | 
				
			||||||
 | 
					    with open("/tmp/gps_data_user_sos.txt", 'w') as sos_file:
 | 
				
			||||||
 | 
					            sos_file.write(str(sos_info))
 | 
				
			||||||
 | 
					            sos_file.close()
 | 
				
			||||||
 | 
					    logger.info('Saved SOS.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Send email via SMTP function
 | 
					# Send email via SMTP function
 | 
				
			||||||
def send_email(to_email, email_subject, email_message):
 | 
					def send_email(to_email, email_subject, email_message):
 | 
				
			||||||
@ -264,6 +276,11 @@ def process_sms(_rf_src, sms):
 | 
				
			|||||||
            logger.info('Failed to send email.')
 | 
					            logger.info('Failed to send email.')
 | 
				
			||||||
            logger.info(error_exception)
 | 
					            logger.info(error_exception)
 | 
				
			||||||
            logger.info(str(traceback.extract_tb(error_exception.__traceback__)))
 | 
					            logger.info(str(traceback.extract_tb(error_exception.__traceback__)))
 | 
				
			||||||
 | 
					    elif '@SOS' in sms:
 | 
				
			||||||
 | 
					        sos_write(int_id(_rf_src), 'time', sms)
 | 
				
			||||||
 | 
					    elif '@REM SOS' == sms:
 | 
				
			||||||
 | 
					        os.remove('/tmp/gps_data_user_sos.txt')
 | 
				
			||||||
 | 
					        logger.info('Removing SOS')
 | 
				
			||||||
    elif '@MH' in sms:
 | 
					    elif '@MH' in sms:
 | 
				
			||||||
        grid_square = re.sub('@MH ', '', sms)
 | 
					        grid_square = re.sub('@MH ', '', sms)
 | 
				
			||||||
        if len(grid_square) < 6:
 | 
					        if len(grid_square) < 6:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								gps_data.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								gps_data.py
									
									
									
									
									
								
							@ -177,6 +177,18 @@ def dashboard_bb_write(call, dmr_id, time, bulletin):
 | 
				
			|||||||
    logger.info('User bulletin entry saved.')
 | 
					    logger.info('User bulletin entry saved.')
 | 
				
			||||||
    #logger.info(dash_bb)
 | 
					    #logger.info(dash_bb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def sos_write(dmr_id, time, message):
 | 
				
			||||||
 | 
					    user_settings = ast.literal_eval(os.popen('cat ./user_settings.txt').read())
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        sos_call = user_settings[dmr_id][0]['call'] + '-' + user_settings[dmr_id][1]['ssid']
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        sos_call = str(get_alias((dmr_id), subscriber_ids))
 | 
				
			||||||
 | 
					    sos_info = {'call': sos_call, 'dmr_id': dmr_id, 'time': time, 'message':message}
 | 
				
			||||||
 | 
					    with open("/tmp/gps_data_user_sos.txt", 'w') as sos_file:
 | 
				
			||||||
 | 
					            sos_file.write(str(sos_info))
 | 
				
			||||||
 | 
					            sos_file.close()
 | 
				
			||||||
 | 
					    logger.info('Saved SOS.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Send email via SMTP function
 | 
					# Send email via SMTP function
 | 
				
			||||||
def send_email(to_email, email_subject, email_message):
 | 
					def send_email(to_email, email_subject, email_message):
 | 
				
			||||||
    global smtp_server
 | 
					    global smtp_server
 | 
				
			||||||
@ -233,7 +245,7 @@ def user_setting_write(dmr_id, setting, value):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def process_sms(_rf_src, sms):
 | 
					def process_sms(_rf_src, sms):
 | 
				
			||||||
    if sms == 'ID':
 | 
					    if sms == 'ID':
 | 
				
			||||||
        logger.info(str(get_alias(int_id(from_id), subscriber_ids)) + ' - ' + str(int_id(from_id)))
 | 
					        logger.info(str(get_alias(int_id(_rf_src), subscriber_ids)) + ' - ' + str(int_id(_rf_src)))
 | 
				
			||||||
    elif sms == 'TEST':
 | 
					    elif sms == 'TEST':
 | 
				
			||||||
        logger.info('It works!')
 | 
					        logger.info('It works!')
 | 
				
			||||||
    elif '@ICON' in sms:
 | 
					    elif '@ICON' in sms:
 | 
				
			||||||
@ -257,6 +269,11 @@ def process_sms(_rf_src, sms):
 | 
				
			|||||||
            logger.info('Failed to send email.')
 | 
					            logger.info('Failed to send email.')
 | 
				
			||||||
            logger.info(error_exception)
 | 
					            logger.info(error_exception)
 | 
				
			||||||
            logger.info(str(traceback.extract_tb(error_exception.__traceback__)))
 | 
					            logger.info(str(traceback.extract_tb(error_exception.__traceback__)))
 | 
				
			||||||
 | 
					    elif '@SOS' in sms:
 | 
				
			||||||
 | 
					        sos_write(int_id(_rf_src), 'time', sms)
 | 
				
			||||||
 | 
					    elif '@REM SOS' == sms:
 | 
				
			||||||
 | 
					        os.remove('/tmp/gps_data_user_sos.txt')
 | 
				
			||||||
 | 
					        logger.info('Removing SOS')
 | 
				
			||||||
    elif '@MH' in sms:
 | 
					    elif '@MH' in sms:
 | 
				
			||||||
        grid_square = re.sub('@MH ', '', sms)
 | 
					        grid_square = re.sub('@MH ', '', sms)
 | 
				
			||||||
        if len(grid_square) < 6:
 | 
					        if len(grid_square) < 6:
 | 
				
			||||||
 | 
				
			|||||||
@ -21,7 +21,7 @@
 | 
				
			|||||||
This is a web dashboard for the GPS/Data application.
 | 
					This is a web dashboard for the GPS/Data application.
 | 
				
			||||||
'''
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from flask import Flask, render_template, request, Response
 | 
					from flask import Flask, render_template, request, Response, Markup
 | 
				
			||||||
import ast, os
 | 
					import ast, os
 | 
				
			||||||
from dashboard_settings import *
 | 
					from dashboard_settings import *
 | 
				
			||||||
import folium
 | 
					import folium
 | 
				
			||||||
@ -114,6 +114,39 @@ def get_bb_data():
 | 
				
			|||||||
        return str('<h1 style="text-align: center;">Bulletin Board</h1>' + tbl_hdr + bb_hdr + tmp_bb + tbl_ftr)
 | 
					        return str('<h1 style="text-align: center;">Bulletin Board</h1>' + tbl_hdr + bb_hdr + tmp_bb + tbl_ftr)
 | 
				
			||||||
    except:
 | 
					    except:
 | 
				
			||||||
        return str('<h1 style="text-align: center;">No data</h1>')
 | 
					        return str('<h1 style="text-align: center;">No data</h1>')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def check_emergency():
 | 
				
			||||||
 | 
					    # open emergency txt
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        sos_file = ast.literal_eval(os.popen('cat /tmp/gps_data_user_sos.txt').read())
 | 
				
			||||||
 | 
					        value = Markup("""
 | 
				
			||||||
 | 
					        <h1 style="text-align: center;"><span style="background-color: #ff0000; color: #ffffff;">EMERGENCY ACTIVATION</span></h1>
 | 
				
			||||||
 | 
					        <p> </p>
 | 
				
			||||||
 | 
					        <table style="width: 441px; margin-left: auto; margin-right: auto;" border="3">
 | 
				
			||||||
 | 
					        <tbody>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					        <td style="width: 78.3667px;"><span style="text-decoration: underline;"><strong>From:</strong></span></td>
 | 
				
			||||||
 | 
					        <td style="width: 345.633px; text-align: center;"><strong>""" + sos_file['call'] + """ - """ + str(sos_file['dmr_id']) + """</strong></td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					        <td style="width: 78.3667px;"><span style="text-decoration: underline;"><strong>Message:</strong></span></td>
 | 
				
			||||||
 | 
					        <td style="width: 345.633px; text-align: center;"><strong>""" + sos_file['message'] + """</strong></td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					        <td style="width: 78.3667px;"><span style="text-decoration: underline;"><strong>Time:</strong></span></td>
 | 
				
			||||||
 | 
					        <td style="width: 345.633px; text-align: center;"><strong>""" + sos_file['time'] + """</strong></td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        </tbody>
 | 
				
			||||||
 | 
					        </table>
 | 
				
			||||||
 | 
					        <p> </p>
 | 
				
			||||||
 | 
					         <button onclick="window.open('view_map?track=""" + sos_file['call'] + """&reload=30','_blank' );" type="button" class="emergency_button"><h1>View Station on Map</h1></button>
 | 
				
			||||||
 | 
					         <hr />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        """)
 | 
				
			||||||
 | 
					        return value
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        return ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def aprs_to_latlon(x):
 | 
					def aprs_to_latlon(x):
 | 
				
			||||||
    degrees = int(x) // 100
 | 
					    degrees = int(x) // 100
 | 
				
			||||||
    minutes = x - 100*degrees
 | 
					    minutes = x - 100*degrees
 | 
				
			||||||
@ -121,8 +154,9 @@ def aprs_to_latlon(x):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@app.route('/')
 | 
					@app.route('/')
 | 
				
			||||||
def index():
 | 
					def index():
 | 
				
			||||||
 | 
					    value = Markup('<strong>The HTML String</strong>')
 | 
				
			||||||
    #return get_data()
 | 
					    #return get_data()
 | 
				
			||||||
    return render_template('index.html', title = dashboard_title, logo = logo)
 | 
					    return render_template('index.html', title = dashboard_title, logo = logo, emergency = check_emergency())
 | 
				
			||||||
@app.route('/bulletin_board')
 | 
					@app.route('/bulletin_board')
 | 
				
			||||||
def dash_bb():
 | 
					def dash_bb():
 | 
				
			||||||
    return get_bb_data()
 | 
					    return get_bb_data()
 | 
				
			||||||
@ -130,10 +164,7 @@ def dash_bb():
 | 
				
			|||||||
@app.route('/positions')
 | 
					@app.route('/positions')
 | 
				
			||||||
def dash_loc():
 | 
					def dash_loc():
 | 
				
			||||||
    return get_loc_data()
 | 
					    return get_loc_data()
 | 
				
			||||||
    #return render_template('index.html', data = str(get_data()))
 | 
					
 | 
				
			||||||
##@app.route('/<string:page_name>/')
 | 
					 | 
				
			||||||
##def render_static(page_name):
 | 
					 | 
				
			||||||
##    return render_template('%s.html' % page_name, title = dashboard_title, logo = logo, description = description)
 | 
					 | 
				
			||||||
@app.route('/help/')
 | 
					@app.route('/help/')
 | 
				
			||||||
def help():
 | 
					def help():
 | 
				
			||||||
    #return get_data()
 | 
					    #return get_data()
 | 
				
			||||||
@ -148,70 +179,71 @@ def view_map():
 | 
				
			|||||||
    track_call = request.args.get('track')
 | 
					    track_call = request.args.get('track')
 | 
				
			||||||
    user_loc = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read())
 | 
					    user_loc = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read())
 | 
				
			||||||
    last_known_list = []
 | 
					    last_known_list = []
 | 
				
			||||||
    if track_call:
 | 
					    try:
 | 
				
			||||||
        #folium_map = folium.Map(location=map_center, zoom_start=int(zoom_level))
 | 
					        if track_call:
 | 
				
			||||||
        #marker_cluster = MarkerCluster().add_to(folium_map)
 | 
					            #folium_map = folium.Map(location=map_center, zoom_start=int(zoom_level))
 | 
				
			||||||
        for user_coord in user_loc:
 | 
					            #marker_cluster = MarkerCluster().add_to(folium_map)
 | 
				
			||||||
            user_lat = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lat'])))
 | 
					            for user_coord in user_loc:
 | 
				
			||||||
            user_lon = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lon'])))
 | 
					                user_lat = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lat'])))
 | 
				
			||||||
            if 'S' in user_coord['lat']:
 | 
					                user_lon = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lon'])))
 | 
				
			||||||
                user_lat = -user_lat
 | 
					                if 'S' in user_coord['lat']:
 | 
				
			||||||
            if 'W' in user_coord['lon']:
 | 
					                    user_lat = -user_lat
 | 
				
			||||||
                user_lon = -user_lon
 | 
					                if 'W' in user_coord['lon']:
 | 
				
			||||||
            if user_coord['call'] not in last_known_list and user_coord['call'] == track_call:
 | 
					                    user_lon = -user_lon
 | 
				
			||||||
                folium_map = folium.Map(location=[user_lat, user_lon], tiles="Stamen Toner", zoom_start=15)
 | 
					                if user_coord['call'] not in last_known_list and user_coord['call'] == track_call:
 | 
				
			||||||
                marker_cluster = MarkerCluster().add_to(folium_map)
 | 
					                    folium_map = folium.Map(location=[user_lat, user_lon], tiles="Stamen Toner", zoom_start=15)
 | 
				
			||||||
   #             folium.Marker([user_lat, user_lon], popup="<i>" + '<strong>Last Location: \n' + str(user_coord['call']) + '</strong>' + '\n' + user_coord['time'] + "</i>", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
					                    marker_cluster = MarkerCluster().add_to(folium_map)
 | 
				
			||||||
                folium.Marker([user_lat, user_lon], popup="""<i>
 | 
					                    folium.Marker([user_lat, user_lon], popup="""<i>
 | 
				
			||||||
                <table style="width: 150px;">
 | 
					                    <table style="width: 150px;">
 | 
				
			||||||
                <tbody>
 | 
					                    <tbody>
 | 
				
			||||||
                <tr>
 | 
					                    <tr>
 | 
				
			||||||
                <td style="text-align: center;">Last Location:</td>
 | 
					                    <td style="text-align: center;">Last Location:</td>
 | 
				
			||||||
                </tr>
 | 
					                    </tr>
 | 
				
			||||||
                <tr>
 | 
					                    <tr>
 | 
				
			||||||
                <td style="text-align: center;"><strong>"""+ str(user_coord['call']) +"""</strong></td>
 | 
					                    <td style="text-align: center;"><strong>"""+ str(user_coord['call']) +"""</strong></td>
 | 
				
			||||||
                </tr>
 | 
					                    </tr>
 | 
				
			||||||
                <tr>
 | 
					                    <tr>
 | 
				
			||||||
                <td style="text-align: center;"><em>"""+ user_coord['time'] +"""</em></td>
 | 
					                    <td style="text-align: center;"><em>"""+ user_coord['time'] +"""</em></td>
 | 
				
			||||||
                </tr>
 | 
					                    </tr>
 | 
				
			||||||
                </tbody>
 | 
					                    </tbody>
 | 
				
			||||||
                </table>
 | 
					                    </table>
 | 
				
			||||||
                </i>
 | 
					                    </i>
 | 
				
			||||||
                """, icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
					                    """, icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
				
			||||||
                last_known_list.append(user_coord['call'])
 | 
					                    last_known_list.append(user_coord['call'])
 | 
				
			||||||
            if user_coord['call'] in last_known_list and user_coord['call'] == track_call:
 | 
					                if user_coord['call'] in last_known_list and user_coord['call'] == track_call:
 | 
				
			||||||
                #folium.Marker([user_lat, user_lon], popup="<i>" + '<strong>' + str(user_coord['call']) + '</strong>' + '\n' + user_coord['time'] + "</i>", tooltip=str(user_coord['call'])).add_to(marker_cluster)
 | 
					                    folium.CircleMarker([user_lat, user_lon], popup="""
 | 
				
			||||||
                folium.CircleMarker([user_lat, user_lon], popup="""
 | 
					                    <table style="width: 150px;">
 | 
				
			||||||
                <table style="width: 150px;">
 | 
					                    <tbody>
 | 
				
			||||||
                <tbody>
 | 
					                    <tr>
 | 
				
			||||||
                <tr>
 | 
					                    <td style="text-align: center;"><strong>""" + user_coord['call'] + """</strong></td>
 | 
				
			||||||
                <td style="text-align: center;"><strong>""" + user_coord['call'] + """</strong></td>
 | 
					                    </tr>
 | 
				
			||||||
                </tr>
 | 
					                    <tr>
 | 
				
			||||||
                <tr>
 | 
					                    <td style="text-align: center;"><em>""" + user_coord['time'] + """</em></td>
 | 
				
			||||||
                <td style="text-align: center;"><em>""" + user_coord['time'] + """</em></td>
 | 
					                    </tr>
 | 
				
			||||||
                </tr>
 | 
					                    </tbody>
 | 
				
			||||||
                </tbody>
 | 
					                    </table>
 | 
				
			||||||
                </table>
 | 
					                    """, tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster)
 | 
				
			||||||
                """, tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster)
 | 
					            #return folium_map._repr_html_()
 | 
				
			||||||
        #return folium_map._repr_html_()
 | 
					                if not reload_time:
 | 
				
			||||||
            if not reload_time:
 | 
					                    reload_time = 120
 | 
				
			||||||
                reload_time = 120
 | 
					            return  '{} {}'.format('''<head>
 | 
				
			||||||
        return  '{} {}'.format('''<head>
 | 
					                        <meta charset="UTF-8">
 | 
				
			||||||
                    <meta charset="UTF-8">
 | 
					                        <meta http-equiv="refresh" content="''' + str(reload_time) + """" > 
 | 
				
			||||||
                    <meta http-equiv="refresh" content="''' + str(reload_time) + """" > 
 | 
					                        <title>""" + dashboard_title + """ - Tracking """+ track_call + """</title></head><p style="text-align: center;"><strong>""" + dashboard_title + """ - Tracking """ + track_call + """</strong></p>
 | 
				
			||||||
                    <title>""" + dashboard_title + """ - Tracking """+ track_call + """</title></head><p style="text-align: center;"><strong>""" + dashboard_title + """ - Tracking """ + track_call + """</strong></p>
 | 
					                    <p style="text-align: center;"><em>Page automatically reloads every """ + str(reload_time) + """ seconds.</em></p>
 | 
				
			||||||
                <p style="text-align: center;"><em>Page automatically reloads every """ + str(reload_time) + """ seconds.</em></p>
 | 
					                    <p style="text-align: center;">
 | 
				
			||||||
                <p style="text-align: center;">
 | 
					                        <select name="sample" onchange="location = this.value;">
 | 
				
			||||||
                    <select name="sample" onchange="location = this.value;">
 | 
					                         <option value="view_map?track=""" + track_call + """&reload=120">2 Minutes</option>
 | 
				
			||||||
                     <option value="view_map?track=""" + track_call + """&reload=120">2 Minutes</option>
 | 
					                         <option value="view_map?track=""" + track_call + """&reload=">Don't Reload</option>
 | 
				
			||||||
                     <option value="view_map?track=""" + track_call + """&reload=">Don't Reload</option>
 | 
					                         <option value="view_map?track=""" + track_call + """&reload=30">30 Seconds</option>
 | 
				
			||||||
                     <option value="view_map?track=""" + track_call + """&reload=30">30 Seconds</option>
 | 
					                         <option value="view_map?track=""" + track_call + """&reload=5">5 Minutes</option>
 | 
				
			||||||
                     <option value="view_map?track=""" + track_call + """&reload=5">5 Minutes</option>
 | 
					                         <option value="view_map?track=""" + track_call + """&reload=600">10 Minutes</option> 
 | 
				
			||||||
                     <option value="view_map?track=""" + track_call + """&reload=600">10 Minutes</option> 
 | 
					                        </select> 
 | 
				
			||||||
                    </select> 
 | 
					                    <p style="text-align: center;"><button onclick="self.close()">Close</button>
 | 
				
			||||||
                <p style="text-align: center;"><button onclick="self.close()">Close</button>
 | 
					                    </p>""", folium_map._repr_html_())
 | 
				
			||||||
                </p>""", folium_map._repr_html_())
 | 
					    except:
 | 
				
			||||||
 | 
					        return """<h1 style="text-align: center;">Station not found.</h1>
 | 
				
			||||||
 | 
					                  <p style="text-align: center;"><button onclick="self.close()">Close Window</button></p>"""
 | 
				
			||||||
    if not track_call:
 | 
					    if not track_call:
 | 
				
			||||||
        folium_map = folium.Map(location=map_center, tiles="Stamen Toner", zoom_start=int(zoom_level))
 | 
					        folium_map = folium.Map(location=map_center, tiles="Stamen Toner", zoom_start=int(zoom_level))
 | 
				
			||||||
        marker_cluster = MarkerCluster().add_to(folium_map)
 | 
					        marker_cluster = MarkerCluster().add_to(folium_map)
 | 
				
			||||||
@ -223,7 +255,6 @@ def view_map():
 | 
				
			|||||||
            if 'W' in user_coord['lon']:
 | 
					            if 'W' in user_coord['lon']:
 | 
				
			||||||
                user_lon = -user_lon
 | 
					                user_lon = -user_lon
 | 
				
			||||||
            if user_coord['call'] not in last_known_list:
 | 
					            if user_coord['call'] not in last_known_list:
 | 
				
			||||||
                #folium.Marker([user_lat, user_lon], popup="<i>" + '<strong>Last Location: \n' + str(user_coord['call']) + '</strong>' + '\n' + user_coord['time'] + '\n<A href="view_map?track=' + user_coord['call'] + """" target="_blank">Track Station</A></i>""", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
					 | 
				
			||||||
                folium.Marker([user_lat, user_lon], popup="""<i>
 | 
					                folium.Marker([user_lat, user_lon], popup="""<i>
 | 
				
			||||||
                <table style="width: 150px;">
 | 
					                <table style="width: 150px;">
 | 
				
			||||||
                <tbody>
 | 
					                <tbody>
 | 
				
			||||||
@ -245,8 +276,6 @@ def view_map():
 | 
				
			|||||||
                </i>""", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
					                </i>""", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
 | 
				
			||||||
                last_known_list.append(user_coord['call'])
 | 
					                last_known_list.append(user_coord['call'])
 | 
				
			||||||
            if user_coord['call'] in last_known_list:
 | 
					            if user_coord['call'] in last_known_list:
 | 
				
			||||||
                #folium.Marker([user_lat, user_lon], popup="<i>" + '<strong>' + str(user_coord['call']) + '</strong>' + '\n' + user_coord['time'] + "</i>", tooltip=str(user_coord['call'])).add_to(marker_cluster)
 | 
					 | 
				
			||||||
                #folium.CircleMarker([user_lat, user_lon], popup="<i>" + '<strong>' + str(user_coord['call']) + '</strong>' + '\n' + user_coord['time'] + "</i>", tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster)
 | 
					 | 
				
			||||||
                folium.CircleMarker([user_lat, user_lon], popup="""
 | 
					                folium.CircleMarker([user_lat, user_lon], popup="""
 | 
				
			||||||
                <table style="width: 150px;">
 | 
					                <table style="width: 150px;">
 | 
				
			||||||
                <tbody>
 | 
					                <tbody>
 | 
				
			||||||
 | 
				
			|||||||
@ -16,12 +16,23 @@ p {
 | 
				
			|||||||
  max-width: 1200px;
 | 
					  max-width: 1200px;
 | 
				
			||||||
  min-width: 1200px;
 | 
					  min-width: 1200px;
 | 
				
			||||||
  margin: auto;
 | 
					  margin: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					 .emergency_button {
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  border: none;
 | 
				
			||||||
 | 
					  background-color: ##ff0000;
 | 
				
			||||||
 | 
					  padding: 14px 28px;
 | 
				
			||||||
 | 
					  font-size: 16px;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<div class="content">
 | 
					<div class="content">
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
{% include 'header.html' %}
 | 
					{% include 'header.html' %}
 | 
				
			||||||
 | 
					{{emergency}}
 | 
				
			||||||
<p style="text-align: center;"><em>Page automatically reloads every 2 minutes.</em></p>
 | 
					<p style="text-align: center;"><em>Page automatically reloads every 2 minutes.</em></p>
 | 
				
			||||||
<h4 style="text-align: center;"><a href="bulletin_rss.xml"><em>Bulletin Board RSS Feed</em></a><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QIcFBAOXAevLAAAAZZJREFUSMftlbtKA0EUhj8jWhi8gaIEC29oxEoRFESLgIXYiWVSKoj6CCrBBwj6CBHNE1hEWy21ETQqiIW1wXhPo81ZOBw2apbdVPvDsDPnP8M/5zKzECJEQKivYO8DFoAYEAGKtTpQEvhW4w3IA+tAVy2F9fgEskA8COHUL8LOKAMZoMmLQF0FewcwImmNAzPANBB18b0BFoGroNLfBiyLgI2+BMwF3XgNwCrwYsQ//BBPSRPdAoeybjE+A8ClS+Sjfnf1E5A2dW4FzoxfwWvD/XWd7oAxI24jz3gVnpS7eiEpt+KvQEL5D5qal/245zFgU+pnXzMd+Zrh9/3q5l7g3CXtTs0bgWvFffn5vDa7iKcVv2K4DS8i3cAOsAuMm8h12ovqqrVL/R3upFrRKPBgHgctvm0iSynuWNnf5bf6byy5dPKe4nukhg6XU9yW2TfsJlDpNCUX27OaP8pD4WBCzQtmX381EUeAI3Xqe6m5xoHpYAezJuJkNb9Fh0tI4+SlXhpTwJBaZ+XbCcwr+6kcPESI2uAHmAijFaMnEmYAAAAASUVORK5CYII=" /></h4>
 | 
					<h4 style="text-align: center;"><a href="bulletin_rss.xml"><em>Bulletin Board RSS Feed</em></a><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QIcFBAOXAevLAAAAZZJREFUSMftlbtKA0EUhj8jWhi8gaIEC29oxEoRFESLgIXYiWVSKoj6CCrBBwj6CBHNE1hEWy21ETQqiIW1wXhPo81ZOBw2apbdVPvDsDPnP8M/5zKzECJEQKivYO8DFoAYEAGKtTpQEvhW4w3IA+tAVy2F9fgEskA8COHUL8LOKAMZoMmLQF0FewcwImmNAzPANBB18b0BFoGroNLfBiyLgI2+BMwF3XgNwCrwYsQ//BBPSRPdAoeybjE+A8ClS+Sjfnf1E5A2dW4FzoxfwWvD/XWd7oAxI24jz3gVnpS7eiEpt+KvQEL5D5qal/245zFgU+pnXzMd+Zrh9/3q5l7g3CXtTs0bgWvFffn5vDa7iKcVv2K4DS8i3cAOsAuMm8h12ovqqrVL/R3upFrRKPBgHgctvm0iSynuWNnf5bf6byy5dPKe4nukhg6XU9yW2TfsJlDpNCUX27OaP8pD4WBCzQtmX381EUeAI3Xqe6m5xoHpYAezJuJkNb9Fh0tI4+SlXhpTwJBaZ+XbCcwr+6kcPESI2uAHmAijFaMnEmYAAAAASUVORK5CYII=" /></h4>
 | 
				
			||||||
<table>
 | 
					<table>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user