Revert "Accommodate DMR-MARC JSON only database dumps"

This reverts commit 596fdd19752e74e8b504ddfecfb3bf99cfb0d785.
This commit is contained in:
Cort Buffington 2018-04-16 08:37:17 -05:00
parent 50baf50ba7
commit acf74bed41
3 changed files with 53 additions and 85 deletions

4
.gitignore vendored
View File

@ -3,10 +3,6 @@ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
# Local Additions
*.csv
*.json
# C extensions # C extensions
*.so *.so

View File

@ -20,11 +20,11 @@
from __future__ import print_function from __future__ import print_function
import json
from os.path import isfile, getmtime from os.path import isfile, getmtime
from time import time from time import time
from urllib import URLopener from urllib import URLopener
from csv import reader as csv_reader from csv import reader as csv_reader
from csv import DictReader as csv_dict_reader
from binascii import b2a_hex as ahex from binascii import b2a_hex as ahex
# Does anybody read this stuff? There's a PEP somewhere that says I should do this. # Does anybody read this stuff? There's a PEP somewhere that says I should do this.
@ -36,6 +36,12 @@ __maintainer__ = 'Cort Buffington, N0MJS'
__email__ = 'n0mjs@me.com' __email__ = 'n0mjs@me.com'
# CONSTANTS
SUB_FIELDS = ('ID', 'CALLSIGN', 'NAME', 'CITY', 'STATE', 'COUNTRY', 'TYPE')
PEER_FIELDS = ('ID', 'CALLSIGN', 'CITY', 'STATE', 'COUNTRY', 'FREQ', 'CC', 'OFFSET', 'TYPE', 'LINKED', 'TRUSTEE', 'INFO', 'OTHER', 'NETWORK', )
TGID_FIELDS = ('ID', 'NAME')
#************************************************ #************************************************
# STRING UTILITY FUNCTIONS # STRING UTILITY FUNCTIONS
#************************************************ #************************************************
@ -66,22 +72,6 @@ def int_id(_hex_string):
return int(ahex(_hex_string), 16) return int(ahex(_hex_string), 16)
#************************************************
# RANDOM UTILITY FUNCTIONS
#************************************************
# Ensure all keys and values in a dictionary are ascii
def mk_ascii_dict(input):
if isinstance(input, dict):
return {mk_ascii_dict(key): mk_ascii_dict(value) for key, value in input.iteritems()}
elif isinstance(input, list):
return [mk_ascii_dict(element) for element in input]
elif isinstance(input, unicode):
return input.encode('ascii','ignore')
else:
return input
#************************************************ #************************************************
# ID ALIAS FUNCTIONS # ID ALIAS FUNCTIONS
#************************************************ #************************************************
@ -110,74 +100,38 @@ def try_download(_path, _file, _url, _stale,):
# LEGACY VERSION - MAKES A SIMPLE {INTEGER ID: 'CALLSIGN'} DICTIONARY # LEGACY VERSION - MAKES A SIMPLE {INTEGER ID: 'CALLSIGN'} DICTIONARY
def mk_id_dict(_path, _file): def mk_id_dict(_path, _file):
dict = {} dict = {}
if _file.endswith(('.json','.JSON')):
try:
with open(_path+_file, 'rU') as _handle:
ids = json.loads(_handle.read().decode('utf-8', 'ignore'))
if 'repeaters' in ids:
ids = ids['repeaters']
id_type = 'locator'
id_value = 'callsign'
elif 'users' in ids:
ids = ids['users']
id_type = 'radio_id'
id_value = 'callsign'
elif 'tgids' in ids:
ids = ids['tgids']
id_type = 'tgid'
id_value = 'name'
else:
return dict
for row in range(len(ids)):
dict[int(ids[row][id_type])] = ids[row][id_value].encode('ascii','ignore')
_handle.close
return dict
except IOError:
return dict
elif _file.endswith(('.csv','.CSV')):
try:
with open(_path+_file, 'rU') as _handle:
ids = csv_reader(_handle, dialect='excel', delimiter=',')
for row in ids:
dict[int(row[0])] = (row[1])
_handle.close
return dict
except IOError:
return dict
# NEW VERSION - MAKES A FULL DICTIONARY OF INFORMATION BASED ON TYPE OF ALIAS FILE
# BASED ON DOWNLOADS FROM DMR-MARC AND ONLY WORKS FOR DMR-MARC STYLE JSON FILES!!!
# RESULTING DICTIONARY KEYS ARE INTEGER RADIO ID, AND VALURES ARE DICTIONARIES OF
# WHATEVER IS IN EACH ROW OF THE DMR-MARC DATABASE USED, IE.:
# 312345: {u'map': u'0', u'color_code': u'1', u'city': u'Morlon'.....u'map_info': u'', u'trustee': u'HB9HFF'}
def mk_full_id_dict(_path, _file):
dict = {}
try: try:
with open(_path+_file, 'rU') as _handle: with open(_path+_file, 'rU') as _handle:
ids = json.loads(_handle.read().decode('utf-8', 'ignore')) ids = csv_reader(_handle, dialect='excel', delimiter=',')
if 'repeaters' in ids: for row in ids:
ids = ids['repeaters'] dict[int(row[0])] = (row[1])
id_type = 'locator'
elif 'users' in ids:
ids = ids['users']
id_type = 'radio_id'
else:
return dict
for row in range(len(ids)):
dict[int(ids[row][id_type])] = ids[row]
_handle.close _handle.close
dict = mk_ascii_dict(dict)
return dict return dict
except IOError: except IOError:
return dict return dict
# USE THIS TO QUERY THE ID DICTIONARIES WE MAKE WITH THE FUNCTION(S) ABOVE # NEW VERSION - MAKES A FULL DICTIONARY OF INFORMATION BASED ON TYPE OF ALIAS FILE
# BASED ON DOWNLOADS FROM DMR-MARC, TGID IS STILL A "SIMPLE" DICTIONARY
def mk_full_id_dict(_path, _file, _type):
dict = {}
if _type == 'subscriber':
fields = SUB_FIELDS
elif _type == 'peer':
fields = PEER_FIELDS
elif _type == 'tgid':
fields = TGID_FIELDS
try:
with open(_path+_file, 'rU') as _handle:
ids = csv_dict_reader(_handle, fieldnames=fields, restkey='OTHER', dialect='excel', delimiter=',')
for row in ids:
for item in row:
dict[int(row['ID'])] = row
_handle.close
return dict
except IOError:
return dict
# THESE ARE THE SAME THING FOR LEGACY PURPOSES
def get_alias(_id, _dict, *args): def get_alias(_id, _dict, *args):
if type(_id) == str: if type(_id) == str:
_id = int_id(_id) _id = int_id(_id)
@ -194,5 +148,23 @@ def get_alias(_id, _dict, *args):
return _dict[_id] return _dict[_id]
return _id return _id
# FOR LEGACY PURPOSES def get_info(_id, _dict, *args):
get_info = get_alias if type(_id) == str:
_id = int_id(_id)
if _id in _dict:
if args:
retValue = []
for _item in args:
try:
retValue.append(_dict[_id][_item])
except TypeError:
return _dict[_id]
return retValue
else:
return _dict[_id]
return _id

View File

@ -7,7 +7,7 @@ def readme():
return file.read() return file.read()
setup(name='dmr_utils', setup(name='dmr_utils',
version='0.1.12', version='0.1.8',
description='ETSI DMR (Digital Mobile Radio) Tier II Utilities', description='ETSI DMR (Digital Mobile Radio) Tier II Utilities',
long_description='Modules to disassemble and assemble DMR packets, including generating and decoding various FEC routines', long_description='Modules to disassemble and assemble DMR packets, including generating and decoding various FEC routines',
classifiers=[ classifiers=[