From b24ef940ce0361bad638fe7a78f5a621c5104968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=88=D0=BA=D0=B8=D0=BD=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B3=D0=B5=D0=B9?= Date: Mon, 10 Nov 2025 17:59:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20Lyn?= =?UTF-8?q?gSat=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbapp/lyngsatapp/models.py | 3 +- dbapp/lyngsatapp/parser.py | 40 +++++++++++-- dbapp/lyngsatapp/utils.py | 58 +++++++++++++++++++ .../templates/mainapp/objitem_list.html | 2 - 4 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 dbapp/lyngsatapp/utils.py diff --git a/dbapp/lyngsatapp/models.py b/dbapp/lyngsatapp/models.py index 6f8a374..003a6bb 100644 --- a/dbapp/lyngsatapp/models.py +++ b/dbapp/lyngsatapp/models.py @@ -24,7 +24,8 @@ class LyngSat(models.Model): sym_velocity = models.FloatField(default=0, null=True, blank=True, verbose_name="Символьная скорость, БОД") last_update = models.DateTimeField(null=True, blank=True, verbose_name="Время") channel_info = models.CharField(max_length=20, blank=True, null=True, verbose_name="Описание источника") - # url = models.URLField(max_length = 200, blank=True, null=True, verbose_name="Ссылка на страницу") + fec = models.CharField(max_length=30, blank=True, null=True, verbose_name="Коэффициент коррекции ошибок") + url = models.URLField(max_length = 200, blank=True, null=True, verbose_name="Ссылка на страницу") def __str__(self): return f"Ист {self.frequency}, {self.polarization}" diff --git a/dbapp/lyngsatapp/parser.py b/dbapp/lyngsatapp/parser.py index d8b7b3d..3c1288b 100644 --- a/dbapp/lyngsatapp/parser.py +++ b/dbapp/lyngsatapp/parser.py @@ -77,9 +77,11 @@ class LyngSatParser: } return polarization_map.get(polarization.upper(), polarization) - def get_region_pages(self) -> list[str]: + def get_region_pages(self, regions: list[str] | None = None) -> list[str]: html_regions = [] - for region in self.regions: + if regions is None: + regions = self.regions + for region in regions: url = f"{self.BASE_URL}/{region}.html" payload = { "cmd": "request.get", @@ -94,9 +96,34 @@ class LyngSatParser: print(f"Обработал страницу по {region}") return html_regions + def get_satellite_urls(self, html_regions: list[str]): + sat_names = [] + sat_urls = [] + for region_page in html_regions: + soup = BeautifulSoup(region_page, "html.parser") + + col_table = soup.find_all("div", class_="desktab")[0] + + tables = col_table.find_next_sibling('table').find_all('table') + trs = [] + for table in tables: + trs.extend(table.find_all('tr')) + for tr in trs: + sat_name = tr.find('span').text + if self.target_sats is not None: + if sat_name.strip().lower() not in self.target_sats: + continue + try: + sat_url = tr.find_all('a')[2]['href'] + except IndexError: + sat_url = tr.find_all('a')[0]['href'] + sat_names.append(sat_name) + sat_urls.append(sat_url) + return sat_names, sat_urls + def get_satellites_data(self) -> dict[dict]: sat_data = {} - for region_page in self.get_region_pages(): + for region_page in self.get_region_pages(self.regions): soup = BeautifulSoup(region_page, "html.parser") col_table = soup.find_all("div", class_="desktab")[0] @@ -368,4 +395,9 @@ class KingOfSatParser: 'metadata': data['ini_data']['metadata'] } - return satellite_dict \ No newline at end of file + return satellite_dict + +from pprint import pprint +lyngsat = LyngSatParser(regions=['europe'], target_sats=['Türksat 3A', 'Intelsat 22']) +html_regions = lyngsat.get_region_pages() +pprint(lyngsat.get_satellite_urls(html_regions)) \ No newline at end of file diff --git a/dbapp/lyngsatapp/utils.py b/dbapp/lyngsatapp/utils.py new file mode 100644 index 0000000..e75a893 --- /dev/null +++ b/dbapp/lyngsatapp/utils.py @@ -0,0 +1,58 @@ +from .parser import LyngSatParser +from .models import LyngSat +from mainapp.models import Polarization, Standard, Modulation, Satellite + +def fill_lyngsat_data(target_sats: list[str]): + parser = LyngSatParser( + target_sats=target_sats, + ) + lyngsat_data = parser.get_satellites_data() + for sat_name, data in lyngsat_data.items(): + url = data['url'] + sources = data['sources'] + for source in sources: + try: + freq = float(source['freq']) + except Exception as e: + freq = -1.0 + print("Беда с частотой") + last_update = source['last_update'] + fec = source['metadata']['fec'] + modulation = source['metadata']['modulation'] + standard = source['metadata']['standard'] + symbol_velocity = source['metadata']['symbol_rate'] + polarization = source['pol'] + channel_info = source['provider_name'] + + pol_obj, _ = Polarization.objects.get_or_create( + name=polarization + ) + + mod_obj, _ = Modulation.objects.get_or_create( + name=modulation + ) + + standard_obj, _ = Standard.objects.get_or_create( + name=standard + ) + + sat_obj, _ = Satellite.objects.get( + name__contains=sat_name + ) + lyng_obj, _ = LyngSat.objects.get_or_create( + id_satellite=sat_obj, + frequency=freq, + polarization=pol_obj, + defaults={ + "modulation": mod_obj, + "standard": standard_obj, + "sym_velocity": symbol_velocity, + "channel_info": channel_info, + "last_update": last_update, + "fec": fec, + "url": url + } + ) + lyng_obj.objects.update_or_create() + # TODO: сделать карточку и форму для действий и выбора спутника + lyng_obj.save() diff --git a/dbapp/mainapp/templates/mainapp/objitem_list.html b/dbapp/mainapp/templates/mainapp/objitem_list.html index 132fb17..580b323 100644 --- a/dbapp/mainapp/templates/mainapp/objitem_list.html +++ b/dbapp/mainapp/templates/mainapp/objitem_list.html @@ -1021,10 +1021,8 @@ const row = checkbox.closest('tr'); const itemId = checkbox.value; - // Check if item is already in the list const itemExists = window.selectedItems.some(item => item.id === itemId); if (!itemExists) { - // Create an object containing the row data const rowData = { id: itemId, name: row.cells[1].textContent,