from ais.area import load_area_from_kml_polygon
from ais.earth3d import dist3_latlong_ais, dist3_xyz, latlon_to_xyz_deg, latlon_to_xyz_ais
+import ais.inputs.config
+
__all__ = [
'DB_STARTDATE', 'DBPATH',
'COUNTRIES_MID', 'STATUS_CODES', 'SHIP_TYPES',
'add_nmea1',
'add_nmea5_full',
'add_nmea5_partial',
- 'strmmsi_to_mmsi',
- 'mmsi_to_strmmsi',
'Nmea1',
'Nmea5',
'Nmea',
'all_mmsi_generator',
'load_fleet_to_uset',
'fleetname_to_fleetid',
+ 'mmsiiterator_nohiddenship',
'filter_area',
'filter_close_to',
'filter_far_from',
-def strmmsi_to_mmsi(strmmsi):
- """
- Convert from str mmsi to sql-int mmsi
- Special treatment manal input
- """
- if strmmsi.isdigit():
- return int(strmmsi)
- else:
- assert strmmsi[3:5] == 'MI'
- strmmsi = strmmsi[:3]+'00'+strmmsi[5:]
- return int('-'+strmmsi)
-
-
-def mmsi_to_strmmsi(mmsi):
- """
- Convert from sql-into mmsi to str mmsi
- Special treatment manal input
- """
- if mmsi >= 0:
- return "%08d" % mmsi
- strmmsi = "%08d" % -mmsi
- assert strmmsi[3:5] == '00'
- strmmsi = strmmsi[:3]+'MI'+strmmsi[5:]
- return strmmsi
-
-
__misources__ = {} # cache of manual source names
def _get_mi_sourcename(id):
"""
return row[0]
+
+def mmsiiterator_nohiddenship(mmsiiterator):
+ '''
+ filters strmmsi from an strmmsi iterator
+ '''
+ for strmmsi in mmsiiterator:
+ mmsi = strmmsi_to_mmsi(strmmsi)
+ if mmsi not in ais.inputs.config.get_hidden_mmsi():
+ yield strmmsi
+
def filter_area(nmea, area):
"""
Returns false if position is out of area.
help='Dump a maximum of NUMBER positions every granularity seconds.'
'Using that option enables multiple output of the same boat.')
+ parser.add_option('--show-hidden-ships',
+ action='store_true', dest='show_hidden_ships', default=False,
+ help='Include hidden ships in results')
+
parser.add_option('--filter-knownposition',
action='store_true', dest='filter_knownposition', default=False,
help="Eliminate unknown positions from results.")
logging.warning('Selecting all ships, ignoring other arguments')
target_mmsi_iterator = all_mmsi_generator()
+ if not options.show_hidden_ships:
+ target_mmsi_iterator = mmsiiterator_nohiddenship(target_mmsi_iterator)
+
#
# Dates selections
#
from django.contrib.auth.models import get_hexdigest
from django.utils import html
-from ais.common import Nmea, mmsi_to_strmmsi, nice_timedelta_str
+from ais.ntools import mmsi_to_strmmsi
+from ais.common import Nmea, nice_timedelta_str
from ais import proc
from ais.jobrunner import make_unique_job_id
from __future__ import division
from django import template
from django.utils.html import escape
-from ais.common import mmsi_to_strmmsi
+from ais.ntools import mmsi_to_strmmsi
register = template.Library()
from ais.area import list_areas
from ais.djais.basicauth import http_authenticate
from ais.djais.models import *
-from ais.show_targets_ships import format_fleet, kml_to_kmz
-from ais.common import COUNTRIES_MID, Nmea, NmeaFeeder, strmmsi_to_mmsi, SHIP_TYPES, STATUS_CODES, AIS_STATUS_NOT_AVAILABLE, AIS_ROT_NOT_AVAILABLE, AIS_LATLON_SCALE, AIS_LON_NOT_AVAILABLE, AIS_LAT_NOT_AVAILABLE, AIS_COG_SCALE, AIS_COG_NOT_AVAILABLE, AIS_NO_HEADING, AIS_SOG_SCALE, AIS_SOG_NOT_AVAILABLE, AIS_SOG_MAX_SPEED, add_nmea1, add_nmea5_partial, load_fleet_to_uset
-from ais.ntools import datetime_to_timestamp, clean_ais_charset, clean_latitude, clean_longitude, LatLonFormatError
+from ais.show_targets_ships import format_fleet_lastpos, kml_to_kmz, KML_DISPLAYOPT_SHOWHIDDEN
+from ais.common import COUNTRIES_MID, Nmea, NmeaFeeder, SHIP_TYPES, STATUS_CODES, AIS_STATUS_NOT_AVAILABLE, AIS_ROT_NOT_AVAILABLE, AIS_LATLON_SCALE, AIS_LON_NOT_AVAILABLE, AIS_LAT_NOT_AVAILABLE, AIS_COG_SCALE, AIS_COG_NOT_AVAILABLE, AIS_NO_HEADING, AIS_SOG_SCALE, AIS_SOG_NOT_AVAILABLE, AIS_SOG_MAX_SPEED, add_nmea1, add_nmea5_partial, load_fleet_to_uset
+from ais.ntools import datetime_to_timestamp, strmmsi_to_mmsi, clean_ais_charset, clean_latitude, clean_longitude, LatLonFormatError
from ais.inputs.common import is_id4_active
from ais.inputs.stats import STATS_DIR
from ais.inputs.config import peers_get_config, get_hidden_mmsi
@http_authenticate(auth, 'ais')
def vessel_lastpos(request, strmmsi):
- value = kml_to_kmz(format_fleet([ strmmsi ], document_name=strmmsi).encode('utf-8'))
+ display_options = 0
+ if request.user.flag_allowhidden:
+ display_options = KML_DISPLAYOPT_SHOWHIDDEN
+ value = kml_to_kmz(format_fleet_lastpos([ strmmsi ], document_name=strmmsi, display_options=display_options).encode('utf-8'))
response = HttpResponse(value, mimetype="application/vnd.google-earth.kmz")
response['Content-Disposition'] = 'attachment; filename=%s.kmz' % strmmsi
return response
fleet = get_object_or_404(Fleet, name=fleetname)
if not FleetUser.objects.filter(fleet=fleet.id, user=request.user.id).all():
return HttpResponseForbidden('<h1>Forbidden</h1>')
+ display_options = 0
+ if request.user.flag_allowhidden:
+ display_options = KML_DISPLAYOPT_SHOWHIDDEN
fleet_uset = load_fleet_to_uset(fleet.id)
- value = kml_to_kmz(format_fleet(fleet_uset, document_name=fleetname+' fleet').encode('utf-8'))
+ value = kml_to_kmz(format_fleet_lastpos(fleet_uset, document_name=fleetname+' fleet', display_options=display_options).encode('utf-8'))
response = HttpResponse(value, mimetype="application/vnd.google-earth.kmz")
response['Content-Disposition'] = 'attachment; filename=%s.kmz' % fleetname
return response
from time import time as get_timestamp
from ctypes import cdll, Structure, Union, c_buffer, c_int, c_uint, c_char, \
byref
-from ais.common import mmsi_to_strmmsi, add_nmea1, add_nmea5_full
+from ais.ntools import mmsi_to_strmmsi
+from ais.common import add_nmea1, add_nmea5_full
# difference between the unix time and the real time,
# because of leap seconds:
from __future__ import division
import logging
import pprint
-from ais.ntools import str_split_column_ipv6
-from ais.common import strmmsi_to_mmsi
+from ais.ntools import str_split_column_ipv6, strmmsi_to_mmsi
__all__ = [
'peers_get_config',
import socket
from threading import Thread, Lock
-from ais.ntools import formataddr
-from ais.common import strmmsi_to_mmsi, mmsi_to_strmmsi
+from ais.ntools import formataddr, strmmsi_to_mmsi, mmsi_to_strmmsi
from ais.inputs.config import get_hidden_mmsi
__all__ = [ 'OutPeers', 'outpeers_from_config', 'TcpInOutPeer', 'TcpInServiceOut', 'tcpin_outpeers' ]
'IPV4_IN_IPV6_PREFIX',
'datetime_to_timestamp',
'read_cfg',
+ 'strmmsi_to_mmsi',
+ 'mmsi_to_strmmsi',
'clean_ais_charset',
'clean_alnum',
'clean_alnum_unicode',
return cfg
+def strmmsi_to_mmsi(strmmsi):
+ """
+ Convert from str mmsi to sql-int mmsi
+ Special treatment manal input
+ """
+ if strmmsi.isdigit():
+ return int(strmmsi)
+ else:
+ assert strmmsi[3:5] == 'MI'
+ strmmsi = strmmsi[:3]+'00'+strmmsi[5:]
+ return int('-'+strmmsi)
+
+
+def mmsi_to_strmmsi(mmsi):
+ """
+ Convert from sql-into mmsi to str mmsi
+ Special treatment manal input
+ """
+ if mmsi >= 0:
+ return "%08d" % mmsi
+ strmmsi = "%08d" % -mmsi
+ assert strmmsi[3:5] == '00'
+ strmmsi = strmmsi[:3]+'MI'+strmmsi[5:]
+ return strmmsi
+
+
def clean_ais_charset(txt):
assert isinstance(txt, str)
result = ''
from ais.area import load_area_from_kml_polygon
from ais.ntools import datetime_to_timestamp, xml_escape, LatLonFormatError, clean_latitude, clean_longitude
+from ais.inputs.config import get_hidden_mmsi
from ais.djais.settings import AIS_BASE_URL
-__all__ = [ 'format_fleet', 'format_boat_intime', 'format_boat_track', 'STYLE', 'KML_DISPLAYOPT_NONAMES', 'KML_DISPLAYOPT_HISTORICAL', 'KML_DISPLAYOPT_SOURCES', 'kml_to_kmz' ]
+__all__ = [ 'format_fleet_lastpos', 'format_boat_intime', 'STYLE', 'KML_DISPLAYOPT_NONAMES', 'KML_DISPLAYOPT_HISTORICAL', 'KML_DISPLAYOPT_SOURCES', 'KML_DISPLAYOPT_SHOWHIDDEN', 'kml_to_kmz' ]
KML_DISPLAYOPT_NONAMES = 1 # don't print ship name
KML_DISPLAYOPT_HISTORICAL = 2 # never show ship track as lost
KML_DISPLAYOPT_SOURCES = 4 # display sources
+KML_DISPLAYOPT_SHOWHIDDEN = 8 # show hidden ships
LOST_PERIOD = timedelta(1)
-def format_fleet(mmsi_iterator, document_name=None):
+def format_fleet_lastpos(mmsi_iterator, document_name=None, display_options=0):
result = u''
result += KML_HEADER
for mmsi in mmsi_iterator:
nmea = Nmea.new_from_lastinfo(mmsi)
+ if not (display_options & KML_DISPLAYOPT_SHOWHIDDEN) and strmmsi_to_mmsi(mmsi) in get_hidden_mmsi():
+ result += u'<Placemark>\n'
+ result += u'<name>' + xml_escape(nmea.get_title()) + u'</name>\n'
+ result += u'<description>Sorry, access to the position of that ship is restricted. It is not available for you.</description>\n'
+ result += u'</Placemark>\n'
+ continue
if nmea.get_last_timestamp() < long_ago:
continue
- result += format_boat_data(nmea, display_options=KML_DISPLAYOPT_SOURCES)
+ result += format_boat_data(nmea, display_options = display_options | KML_DISPLAYOPT_SOURCES)
result += KML_FOOTER
return result
return result
-def format_boat_track(nmea_iterator):
- result = u''
- result += KML_HEADER
- #result += STYLE.make_header()
- result += format_boat_track_section(nmea_iterator)
- result += KML_FOOTER
- return result
-
-
-
def kml_to_kmz(inputstr):
if isinstance(inputstr, unicode):
inputstr = inputstr.encode('utf-8')
help='Dump a maximum of NUMBER positions every granularity seconds.'
'Using that option enables multiple output of the same boat.')
+ parser.add_option('--show-hidden-ships',
+ action='store_true', dest='show_hidden_ships', default=False,
+ help='Include hidden ships in results')
+
parser.add_option('--filter-knownposition',
action='store_true', dest='filter_knownposition', default=False,
help="eliminate unknown positions from results.")
logging.warning('Selecting all ships, ignoring other arguments')
target_mmsi_iterator = all_mmsi_generator()
+ if not options.show_hidden_ships:
+ target_mmsi_iterator = mmsiiterator_nohiddenship(target_mmsi_iterator)
+
#
# Dates selections
#