2020-03-08 07:48:40 +00:00
import os
2020-01-22 15:18:38 +00:00
import flask
2020-03-08 07:48:40 +00:00
from flask import request , render_template , jsonify
2020-01-22 15:18:38 +00:00
import MySQLdb as my
import json
2020-11-08 10:44:50 +00:00
from dxtelnet import who
2020-02-01 06:12:53 +00:00
__author__ = ' IU1BOW - Corrado '
2020-01-22 15:18:38 +00:00
app = flask . Flask ( __name__ )
2020-11-08 10:44:50 +00:00
app . config [ " DEBUG " ] = False
2020-02-01 06:12:53 +00:00
app . config [ ' SECRET_KEY ' ] = ' secret! '
2020-01-22 15:18:38 +00:00
2020-03-08 07:48:40 +00:00
#load config file
with open ( ' cfg/config.json ' ) as json_data_file :
2020-01-22 16:24:20 +00:00
cfg = json . load ( json_data_file )
2020-03-08 07:48:40 +00:00
#load bands file
with open ( ' cfg/bands.json ' ) as json_bands :
band_frequencies = json . load ( json_bands )
2020-10-17 04:36:07 +00:00
#load mode file
with open ( ' cfg/modes.json ' ) as json_modes :
modes_frequencies = json . load ( json_modes )
2020-03-08 15:04:02 +00:00
#load continents-cq file
with open ( ' cfg/continents.json ' ) as json_continents :
continents_cq = json . load ( json_continents )
2020-03-08 07:48:40 +00:00
#load country file (and send it to front-end)
def load_country ( ) :
filename = os . path . join ( app . static_folder , ' country.json ' )
with open ( filename ) as country_file :
return json . load ( country_file )
2020-03-08 15:04:02 +00:00
#find id in json : ie frequency / continent
def find_id_json ( json_object , name ) :
2020-03-08 07:48:40 +00:00
return [ obj for obj in json_object if obj [ ' id ' ] == name ] [ 0 ]
2020-10-17 04:36:07 +00:00
2020-09-20 05:10:13 +00:00
#the main query to show spots
#it gets url parameter in order to apply the build the right query
#and apply the filter required. It returns a json with the spots
2020-02-01 06:12:53 +00:00
def spotquery ( ) :
2020-01-22 15:18:38 +00:00
2020-03-08 07:48:40 +00:00
try :
#get url parameters
band = ( request . args . getlist ( ' b ' ) )
dere = ( request . args . getlist ( ' e ' ) )
dxre = ( request . args . getlist ( ' x ' ) )
2020-10-17 04:36:07 +00:00
mode = ( request . args . getlist ( ' m ' ) )
2020-09-20 05:10:13 +00:00
callsign = request . args . get ( ' c ' )
2020-10-25 18:07:35 +00:00
2020-09-20 05:10:13 +00:00
query_string = ' '
if callsign :
#construct the query, to show last 6 month
# query_string="SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from dxcluster.spot WHERE (spotter='"+callsign+"' OR spotcall='"+callsign+"')"
# query_string+=" AND time > UNIX_TIMESTAMP()-16070400"
# query_string+=" ORDER BY CASE spotter WHEN '"+callsign+"' THEN 1 ELSE -1 END ASC, rowid desc limit 20;"
query_string = " (SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from dxcluster.spot WHERE spotter= ' " + callsign + " ' "
query_string + = " ORDER BY rowid desc limit 10) "
query_string + = " UNION "
query_string + = " (SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from dxcluster.spot WHERE spotcall= ' " + callsign + " ' "
query_string + = " ORDER BY rowid desc limit 10); "
else :
2020-10-17 04:36:07 +00:00
#construct band query decoding frequencies with json file
2020-09-20 05:10:13 +00:00
band_qry_string = ' AND (( '
for i in range ( len ( band ) ) :
freq = find_id_json ( band_frequencies [ " bands " ] , band [ i ] )
if i > 0 :
band_qry_string + = ' ) OR ( '
band_qry_string + = ' freq BETWEEN ' + str ( freq [ " min " ] ) + ' AND ' + str ( freq [ " max " ] )
band_qry_string + = ' )) '
2020-10-17 04:36:07 +00:00
#construct mode query
mode_qry_string = ' AND (( '
for i in range ( len ( mode ) ) :
single_mode = find_id_json ( modes_frequencies [ " modes " ] , mode [ i ] )
if i > 0 :
mode_qry_string + = ' ) OR ( '
for j in range ( len ( single_mode [ " freq " ] ) ) :
if j > 0 :
mode_qry_string + = ' ) OR ( '
mode_qry_string + = ' freq BETWEEN ' + str ( single_mode [ " freq " ] [ j ] [ " min " ] ) + ' AND ' + str ( single_mode [ " freq " ] [ j ] [ " max " ] )
mode_qry_string + = ' )) '
2020-09-20 05:10:13 +00:00
#construct DE continent region query
dere_qry_string = ' AND spottercq IN ( '
for i in range ( len ( dere ) ) :
continent = find_id_json ( continents_cq [ " continents " ] , dere [ i ] )
if i > 0 :
dere_qry_string + = ' , '
dere_qry_string + = str ( continent [ " cq " ] )
dere_qry_string + = ' ) '
2020-03-08 15:04:02 +00:00
2020-09-20 05:10:13 +00:00
#construct DX continent region query
dxre_qry_string = ' AND spotcq IN ( '
for i in range ( len ( dxre ) ) :
continent = find_id_json ( continents_cq [ " continents " ] , dxre [ i ] )
if i > 0 :
dxre_qry_string + = ' , '
dxre_qry_string + = str ( continent [ " cq " ] )
dxre_qry_string + = ' ) '
2020-10-17 04:36:07 +00:00
2020-09-20 05:10:13 +00:00
query_string = " SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from dxcluster.spot WHERE 1=1 "
if len ( band ) > 0 :
query_string + = band_qry_string
2020-10-17 04:36:07 +00:00
if len ( mode ) > 0 :
query_string + = mode_qry_string
2020-09-20 05:10:13 +00:00
if len ( dere ) > 0 :
query_string + = dere_qry_string
if len ( dxre ) > 0 :
query_string + = dxre_qry_string
2020-03-08 15:04:02 +00:00
2020-09-20 05:10:13 +00:00
query_string + = " ORDER BY rowid desc limit 50; "
2020-03-08 07:48:40 +00:00
#connect to db
db = my . connect ( host = cfg [ ' mysql ' ] [ ' host ' ] ,
2020-01-22 16:24:20 +00:00
user = cfg [ ' mysql ' ] [ ' user ' ] ,
passwd = cfg [ ' mysql ' ] [ ' passwd ' ] ,
db = cfg [ ' mysql ' ] [ ' db ' ]
2020-01-22 15:18:38 +00:00
)
2020-03-08 07:48:40 +00:00
cursor = db . cursor ( )
number_of_rows = cursor . execute ( ''' SET NAMES ' utf8 ' ; ''' )
2020-10-17 09:35:19 +00:00
#print ("*** QUERY: "+query_string)
2020-03-08 07:48:40 +00:00
cursor . execute ( query_string )
row_headers = [ x [ 0 ] for x in cursor . description ] #this will extract row headers
rv = cursor . fetchall ( )
payload = [ ]
for result in rv :
payload . append ( dict ( zip ( row_headers , result ) ) )
cursor . close ( )
return payload
except Exception as e :
print ( e )
finally :
db . close ( )
2020-02-01 06:12:53 +00:00
@app.route ( ' /spotlist ' , methods = [ ' GET ' ] )
def spotlist ( ) :
2020-02-08 09:14:30 +00:00
response = flask . Response ( json . dumps ( spotquery ( ) ) )
return response
2020-02-01 06:12:53 +00:00
2020-11-08 10:44:50 +00:00
def who_is_connected ( ) :
host_port = cfg [ ' telnet ' ] . split ( ' : ' )
response = who ( host_port [ 0 ] , host_port [ 1 ] , cfg [ ' mycallsign ' ] )
return response
2020-02-08 09:14:30 +00:00
@app.route ( ' / ' , methods = [ ' GET ' ] )
2020-03-14 16:48:56 +00:00
@app.route ( ' /index.html ' , methods = [ ' GET ' ] )
2020-02-08 09:14:30 +00:00
def spots ( ) :
2020-02-01 06:12:53 +00:00
payload = spotquery ( )
2020-03-08 07:48:40 +00:00
country_data = load_country ( )
2020-10-11 16:37:38 +00:00
response = flask . Response ( render_template ( ' index.html ' , mycallsign = cfg [ ' mycallsign ' ] , telnet = cfg [ ' telnet ' ] , mail = cfg [ ' mail ' ] , menu_list = cfg [ ' menu ' ] [ ' menu_list ' ] , payload = payload , timer_interval = cfg [ ' timer ' ] [ ' interval ' ] , country_data = country_data ) )
2020-02-08 09:14:30 +00:00
return response
2020-01-22 15:18:38 +00:00
2020-03-14 16:48:56 +00:00
@app.route ( ' /service-worker.js ' , methods = [ ' GET ' ] )
def sw ( ) :
2020-10-04 09:13:45 +00:00
print ( " call service worker " )
2020-03-14 16:48:56 +00:00
return app . send_static_file ( ' service-worker.js ' )
@app.route ( ' /offline.html ' )
def root ( ) :
return app . send_static_file ( ' html/offline.html ' )
2020-06-16 08:17:07 +00:00
@app.route ( ' /plotlist ' , methods = [ ' GET ' ] )
def plotlist ( ) :
#get url parameters
idxfile = os . path . join ( app . root_path , os . path . basename ( app . static_url_path ) , ' plots ' , ' plots.json ' )
if os . path . exists ( idxfile ) :
with open ( idxfile , ' r ' ) as jsonfile :
json_content = json . load ( jsonfile )
else :
json_content = { }
response = json_content
return response
@app.route ( ' /plots.html ' )
def plots ( ) :
payload = plotlist ( )
2020-11-08 10:44:50 +00:00
whoj = who_is_connected ( )
response = flask . Response ( render_template ( ' plots.html ' , mycallsign = cfg [ ' mycallsign ' ] , menu_list = cfg [ ' menu ' ] [ ' menu_list ' ] , payload = payload , timer_interval = cfg [ ' plot_refresh_timer ' ] [ ' interval ' ] , who = whoj ) )
2020-06-16 08:17:07 +00:00
return response
2020-09-26 16:07:19 +00:00
@app.route ( ' /cookies.html ' , methods = [ ' GET ' ] )
2020-06-16 08:17:07 +00:00
def cookies ( ) :
2020-09-26 16:07:19 +00:00
response = flask . Response ( render_template ( ' cookies.html ' , mycallsign = cfg [ ' mycallsign ' ] , menu_list = cfg [ ' menu ' ] [ ' menu_list ' ] ) )
return response
2020-06-16 08:17:07 +00:00
2020-11-08 10:44:50 +00:00
@app.route ( ' /privacy.html ' , methods = [ ' GET ' ] )
def privacy ( ) :
response = flask . Response ( render_template ( ' privacy.html ' , mycallsign = cfg [ ' mycallsign ' ] , menu_list = cfg [ ' menu ' ] [ ' menu_list ' ] ) )
return response
2020-03-14 16:48:56 +00:00
@app.route ( ' /sitemap.xml ' )
def sitemap ( ) :
return app . send_static_file ( ' sitemap.xml ' )
2020-09-20 05:10:13 +00:00
@app.route ( ' /callsign.html ' , methods = [ ' GET ' ] )
def callsign ( ) :
payload = spotquery ( )
country_data = load_country ( )
callsign = request . args . get ( ' c ' )
2020-10-04 15:05:07 +00:00
response = flask . Response ( render_template ( ' callsign.html ' , mycallsign = cfg [ ' mycallsign ' ] , menu_list = cfg [ ' menu ' ] [ ' menu_list ' ] , payload = payload , country_data = country_data , callsign = callsign ) )
2020-09-20 05:10:13 +00:00
return response
2020-11-08 10:44:50 +00:00
#@app.route('/who',methods=['GET'])
2020-06-16 08:17:07 +00:00
2020-02-01 06:12:53 +00:00
if __name__ == ' __main__ ' :
2020-02-08 09:14:30 +00:00
app . run ( host = ' 0.0.0.0 ' )