receive_satellites skeleton

This commit is contained in:
DYefremov
2018-04-30 18:37:02 +03:00
parent 415ad79c80
commit 6ffd1d7926
3 changed files with 213 additions and 63 deletions

View File

@@ -14,7 +14,7 @@ class SatellitesParser(HTMLParser):
_HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"}
def __init__(self, url, entities=False, separator=' '):
def __init__(self, url="https://www.flysat.com/satlist.php", entities=False, separator=' '):
HTMLParser.__init__(self)
@@ -59,29 +59,23 @@ class SatellitesParser(HTMLParser):
def error(self, message):
pass
@run_task
def get_satellites(self, callback):
def get_satellites_list(self):
self.reset()
request = requests.get(url=self._url, headers=self._HEADERS)
reason = request.reason
satellites = []
if reason == "OK":
self.feed(request.text)
if self._rows:
for sat in list(filter(lambda x: all(x) and len(x) == 5, self._rows)):
if callback(self.get_satellite(sat)):
break
return list(filter(lambda x: all(x) and len(x) == 5, self._rows))
else:
print(reason)
return satellites
def get_satellite(self, sat):
pos = "".join(c for c in sat[2] if c.isdigit() or c.isalpha() or c == ".")
return Satellite(name=sat[1] + " ({})".format(pos),
pos = "".join(c for c in sat[1] if c.isdigit() or c.isalpha() or c == ".")
return Satellite(name=sat[0] + " ({})".format(pos),
flags="0",
position=self.get_position(pos.replace(".", "")),
transponders=self.get_transponders(sat[0]))
transponders=self.get_transponders(sat[3]))
def get_position(self, pos):
return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1])

View File

@@ -459,6 +459,7 @@
<property name="label" translatable="yes">Receive from internet</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-refresh</property>
<signal name="clicked" handler="on_update" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -1412,14 +1413,42 @@
<action-widget response="-5">button2</action-widget>
</action-widgets>
</object>
<object class="GtkListStore" id="update_sat_list_store"/>
<object class="GtkListStore" id="update_sat_list_store">
<columns>
<!-- column-name satellite -->
<column type="gchararray"/>
<!-- column-name position -->
<column type="gchararray"/>
<!-- column-name type -->
<column type="gchararray"/>
<!-- column-name url -->
<column type="gchararray"/>
<!-- column-name selected -->
<column type="gboolean"/>
</columns>
</object>
<object class="GtkListStore" id="update_source_store">
<columns>
<!-- column-name source -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0">FlySat</col>
</row>
</data>
</object>
<object class="GtkDialog" id="satellites_update_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Satellites update</property>
<property name="modal">True</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="skip_pager_hint">True</property>
<child internal-child="vbox">
<object class="GtkBox" id="sat_update_dialog_vbox">
<property name="width_request">480</property>
<property name="height_request">320</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
@@ -1560,11 +1589,62 @@
<child>
<object class="GtkTreeViewColumn" id="upd_satellite_column">
<property name="title" translatable="yes">Satellite</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="upd_satellite_cellrenderertext"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="upd_position_column">
<property name="title" translatable="yes">Position</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="upd_position_cellrenderertext"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="upd_type_column">
<property name="title" translatable="yes">Type</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="upd_type_cellrenderertext"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="upd_url_column">
<property name="visible">False</property>
<property name="title" translatable="yes">Url</property>
<child>
<object class="GtkCellRendererText" id="upd_url_cellrenderertext"/>
<attributes>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="upd_selected_treeviewcolumn">
<property name="title" translatable="yes">Selected</property>
<child>
<object class="GtkCellRendererToggle" id="upd_selected_cellrenderertoggle">
<signal name="toggled" handler="on_selected_toggled" swapped="no"/>
</object>
<attributes>
<attribute name="active">4</attribute>
</attributes>
</child>
</object>
</child>
</object>
@@ -1593,14 +1673,14 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkToolButton" id="receive_tool_button">
<object class="GtkToolButton" id="update_sat_list_tool_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Recieve</property>
<property name="label" translatable="yes">Update</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-goto-bottom</property>
<signal name="clicked" handler="on_receive" swapped="no"/>
<property name="stock_id">gtk-refresh</property>
<signal name="clicked" handler="on_update_satellites_list" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
@@ -1622,6 +1702,21 @@
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="receive_sat_list_tool_button">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Receive</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-goto-bottom</property>
<signal name="clicked" handler="on_receive_satellites_list" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="homogeneous">True</property>
</packing>
</child>
<style>
<class name="primary-toolbar"/>
</style>
@@ -1638,6 +1733,7 @@
<property name="can_focus">True</property>
<child>
<object class="GtkTextView" id="text_view">
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
@@ -1732,16 +1828,8 @@
</child>
</object>
</child>
</object>
<object class="GtkListStore" id="update_source_store">
<columns>
<!-- column-name source -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0">FlySat</col>
</row>
</data>
<action-widgets>
<action-widget response="-6">sat_update_close_button</action-widget>
</action-widgets>
</object>
</interface>

View File

@@ -1,7 +1,7 @@
import re
from math import fabs
from app.commons import run_idle
from app.commons import run_idle, run_task
from app.eparser import get_satellites, write_satellites, Satellite, Transponder
from app.tools.satellites import SatellitesParser
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS
@@ -19,14 +19,11 @@ class SatellitesDialog:
def __init__(self, transient, options):
self._data_path = options.get("data_dir_path") + "satellites.xml"
self._options = options
self._download_task = False
handlers = {"on_open": self.on_open,
"on_remove": self.on_remove,
"on_save": self.on_save,
"on_update": self.on_update,
"on_receive": self.on_receive,
"on_cancel_receive": self.on_cancel_receive,
"on_up": self.on_up,
"on_down": self.on_down,
"on_popup_menu": self.on_popup_menu,
@@ -67,7 +64,6 @@ class SatellitesDialog:
@run_idle
def show(self):
self._dialog.run()
self.on_cancel_receive()
self._dialog.destroy()
def on_resize(self, window):
@@ -76,7 +72,6 @@ class SatellitesDialog:
self._options["sat_editor_window_size"] = window.get_size()
def on_quit(self, item):
self.on_cancel_receive()
self._dialog.destroy()
def on_open(self, model):
@@ -285,32 +280,10 @@ class SatellitesDialog:
model.foreach(self.parse_data, satellites)
write_satellites(satellites, self._data_path)
def on_update(self, button: Gtk.ToggleToolButton):
self._download_bar.set_visible(button.get_active())
@run_idle
def on_receive(self, item):
if self._download_task:
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
return
model = self._sat_view.get_model()
model.clear()
self._download_task = True
def callback(sat):
if self._download_task:
self.append_satellite(model, sat)
return False
else:
print("Canceled!")
return True
SatellitesParser(url="https://www.flysat.com/satlist.php").get_satellites(callback)
@run_idle
def on_cancel_receive(self, item=None):
self._download_task = False
def on_update(self, item):
dialog = SatellitesUpdateDialog(self._dialog, self._sat_view.get_model())
sats = dialog.run()
dialog.destroy()
@staticmethod
def parse_data(model, path, itr, sats):
@@ -334,6 +307,8 @@ class SatellitesDialog:
menu.popup(None, None, None, None, event.button, event.time)
# ***************** Transponder dialog *******************#
class TransponderDialog:
""" Shows dialog for adding or edit transponder """
@@ -344,9 +319,7 @@ class TransponderDialog:
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade",
("transponder_dialog",
"pol_store", "fec_store",
"mod_store", "system_store",
("transponder_dialog", "pol_store", "fec_store", "mod_store", "system_store",
"pls_mode_store"))
builder.connect_signals(handlers)
@@ -421,6 +394,8 @@ class TransponderDialog:
return True
# ***************** Satellite dialog *******************#
class SatelliteDialog:
""" Shows dialog for adding or edit satellite """
@@ -462,5 +437,98 @@ class SatelliteDialog:
return Satellite(name=name, flags="0", position=pos, transponders=None)
# ***************** Satellite update dialog *******************#
class SatellitesUpdateDialog:
def __init__(self, transient, main_model):
handlers = {"on_update_satellites_list": self.on_update_satellites_list,
"on_receive_satellites_list": self.on_receive_satellites_list,
"on_cancel_receive": self.on_cancel_receive,
"on_selected_toggled": self.on_selected_toggled,
"on_quit": self.on_quit}
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade",
("satellites_update_dialog", "update_source_store", "update_sat_list_store"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("satellites_update_dialog")
self._dialog.set_transient_for(transient)
self._main_model = main_model
# self._dialog.get_content_area().set_border_width(0)
self._sat_view = builder.get_object("sat_update_tree_view")
self._receive_sat_list_tool_button = builder.get_object("receive_sat_list_tool_button")
self._download_task = False
self._parser = None
def run(self):
if self._dialog.run() == Gtk.ResponseType.CANCEL:
self._download_task = False
return
def destroy(self):
self._dialog.destroy()
@run_idle
def on_update_satellites_list(self, item):
if self._download_task:
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
return
model = self._sat_view.get_model()
model.clear()
self._download_task = True
if not self._parser:
self._parser = SatellitesParser(url="https://www.flysat.com/satlist.php")
sats = self._parser.get_satellites_list()
if sats:
for sat in sats:
model = self._sat_view.get_model()
model.append((sat[1], sat[2], sat[3], sat[0], False))
self._download_task = False
@run_idle
def on_receive_satellites_list(self, item):
if self._download_task:
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
return
self.receive_satellites()
@run_task
def receive_satellites(self):
self._download_task = True
model = self._sat_view.get_model()
sats = []
for sat in [r for r in model if r[4]]:
if not self._download_task:
return
print("Process:", sat[0])
sats.append(self._parser.get_satellite(sat[:-1]))
sats = {s[2]: s for s in sats} # key = position, v = satellite
for row in self._main_model:
pos = row[-1]
if pos in sats:
sat = sats.pop(pos)
print("The remaining satellites:", sats)
self._download_task = False
@run_idle
def on_cancel_receive(self, item=None):
self._download_task = False
def on_selected_toggled(self, toggle, path):
model = self._sat_view.get_model()
model.set_value(model.get_iter(path), 4, not toggle.get_active())
self.update_receive_button_state(model)
@run_idle
def update_receive_button_state(self, model):
self._receive_sat_list_tool_button.set_sensitive((any(r[4] for r in model)))
def on_quit(self):
self._download_task = False
if __name__ == "__main__":
pass