not1mm 24.10.5__py3-none-any.whl → 24.10.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
not1mm/__main__.py CHANGED
@@ -95,7 +95,7 @@ class MainWindow(QtWidgets.QMainWindow):
95
95
  "command_buttons": False,
96
96
  "cw_macros": True,
97
97
  "bands_modes": True,
98
- "bands": ["160", "80", "60", "40", "30", "20", "17", "15", "12", "10"],
98
+ "bands": ["160", "80", "40", "20", "15", "10"],
99
99
  "current_database": "ham.db",
100
100
  "contest": "",
101
101
  "multicast_group": "239.1.1.1",
@@ -125,6 +125,7 @@ class MainWindow(QtWidgets.QMainWindow):
125
125
  "cluster_port": 7373,
126
126
  "cluster_filter": "Set DX Filter SpotterCont=NA",
127
127
  "cluster_mode": "OPEN",
128
+ "cluster_expire": 1,
128
129
  "logwindow": False,
129
130
  "bandmapwindow": False,
130
131
  "checkwindow": False,
@@ -600,6 +601,7 @@ class MainWindow(QtWidgets.QMainWindow):
600
601
  self.bandmap_window.setFeatures(dockfeatures)
601
602
  self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.bandmap_window)
602
603
  self.bandmap_window.hide()
604
+ self.bandmap_window.cluster_expire.connect(self.cluster_expire_updated)
603
605
 
604
606
  self.show_splash_msg("Setting up CheckWindow.")
605
607
  self.check_window = CheckWindow()
@@ -658,6 +660,11 @@ class MainWindow(QtWidgets.QMainWindow):
658
660
  )
659
661
  QCoreApplication.processEvents()
660
662
 
663
+ def cluster_expire_updated(self, number):
664
+ """signal from bandmap"""
665
+ self.pref["cluster_expire"] = int(number)
666
+ self.write_preference()
667
+
661
668
  def fldigi_qso(self, result: str):
662
669
  """
663
670
  gets called when there is a new fldigi qso logged.
@@ -2585,7 +2592,6 @@ class MainWindow(QtWidgets.QMainWindow):
2585
2592
  self.radio_thread.finished.connect(self.rig_control.deleteLater)
2586
2593
  self.rig_control.poll_callback.connect(self.poll_radio)
2587
2594
  self.radio_thread.start()
2588
- # self.rig_control.delta = 1
2589
2595
 
2590
2596
  if self.pref.get("userigctld", False):
2591
2597
  logger.debug(
@@ -2602,7 +2608,6 @@ class MainWindow(QtWidgets.QMainWindow):
2602
2608
  self.radio_thread.finished.connect(self.rig_control.deleteLater)
2603
2609
  self.rig_control.poll_callback.connect(self.poll_radio)
2604
2610
  self.radio_thread.start()
2605
- # self.rig_control.delta = 1
2606
2611
 
2607
2612
  if self.pref.get("cwtype", 0) == 0:
2608
2613
  self.cw = None
@@ -3597,6 +3602,21 @@ def run() -> None:
3597
3602
  """
3598
3603
  Main Entry
3599
3604
  """
3605
+ splash.show()
3606
+ # app.processEvents()
3607
+ splash.showMessage(
3608
+ "Starting Up",
3609
+ alignment=Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignCenter,
3610
+ color=QColor(255, 255, 0),
3611
+ )
3612
+ QCoreApplication.processEvents()
3613
+
3614
+ families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
3615
+ logger.info(f"font families {families}")
3616
+ window = MainWindow(splash)
3617
+ window.callsign.setFocus()
3618
+ splash.finish(window)
3619
+ window.show()
3600
3620
  logger.debug(
3601
3621
  f"Resolved OS file system paths: MODULE_PATH {fsutils.MODULE_PATH}, USER_DATA_PATH {fsutils.USER_DATA_PATH}, CONFIG_PATH {fsutils.CONFIG_PATH}"
3602
3622
  )
@@ -3620,25 +3640,11 @@ logging.basicConfig(
3620
3640
  )
3621
3641
  logging.getLogger("PyQt6.uic.uiparser").setLevel("INFO")
3622
3642
  logging.getLogger("PyQt6.uic.properties").setLevel("INFO")
3643
+
3623
3644
  app = QtWidgets.QApplication(sys.argv)
3624
3645
 
3625
3646
  pixmap = QPixmap(f"{os.fspath(fsutils.APP_DATA_PATH)}/splash.png")
3626
3647
  splash = QSplashScreen(pixmap)
3627
- splash.show()
3628
- # app.processEvents()
3629
- splash.showMessage(
3630
- "Starting Up",
3631
- alignment=Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignCenter,
3632
- color=QColor(255, 255, 0),
3633
- )
3634
- QCoreApplication.processEvents()
3635
-
3636
- families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
3637
- logger.info(f"font families {families}")
3638
- window = MainWindow(splash)
3639
- window.callsign.setFocus()
3640
- splash.finish(window)
3641
- window.show()
3642
3648
 
3643
3649
  if __name__ == "__main__":
3644
3650
  run()
not1mm/bandmap.py CHANGED
@@ -21,6 +21,7 @@ from json import loads
21
21
  from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
22
22
  from PyQt6.QtGui import QColorConstants, QPalette, QColor
23
23
  from PyQt6.QtWidgets import QDockWidget
24
+ from PyQt6.QtCore import pyqtSignal
24
25
 
25
26
  import not1mm.fsutils as fsutils
26
27
  from not1mm.lib.multicast import Multicast
@@ -322,6 +323,7 @@ class BandMapWindow(QDockWidget):
322
323
  worked_list = {}
323
324
  multicast_interface = None
324
325
  text_color = QColor(45, 45, 45)
326
+ cluster_expire = pyqtSignal(str)
325
327
 
326
328
  def __init__(self):
327
329
  super().__init__()
@@ -329,6 +331,9 @@ class BandMapWindow(QDockWidget):
329
331
 
330
332
  uic.loadUi(fsutils.APP_DATA_PATH / "bandmap.ui", self)
331
333
  self.settings = self.get_settings()
334
+ self.clear_spot_olderSpinBox.setValue(
335
+ int(self.settings.get("cluster_expire", 1))
336
+ )
332
337
  self.agetime = self.clear_spot_olderSpinBox.value()
333
338
  self.clear_spot_olderSpinBox.valueChanged.connect(self.spot_aging_changed)
334
339
  self.clearButton.clicked.connect(self.clear_spots)
@@ -876,6 +881,7 @@ class BandMapWindow(QDockWidget):
876
881
  def spot_aging_changed(self) -> None:
877
882
  """Called when spot aging spinbox is changed."""
878
883
  self.agetime = self.clear_spot_olderSpinBox.value()
884
+ self.cluster_expire.emit(str(self.agetime))
879
885
 
880
886
  def showContextMenu(self) -> None:
881
887
  """doc string for the linter"""
not1mm/lib/multicast.py CHANGED
@@ -31,11 +31,11 @@ class Multicast:
31
31
  int(self.multicast_port),
32
32
  QtNetwork.QAbstractSocket.BindFlag.ReuseAddressHint,
33
33
  )
34
- logger.warn(f"multicast bind {b_result}")
34
+ logger.warning(f"multicast bind {b_result}")
35
35
  join_result = self.server_udp.joinMulticastGroup(
36
36
  QtNetwork.QHostAddress(self.multicast_group)
37
37
  )
38
- logger.warn(f"joinMulticastGroup result {join_result}")
38
+ logger.warning(f"joinMulticastGroup result {join_result}")
39
39
 
40
40
  def has_pending_datagrams(self) -> bool:
41
41
  """Check if there is a pending datagram"""
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.10.5"
3
+ __version__ = "24.10.6"
@@ -491,7 +491,7 @@ def ft8_handler(the_packet: dict):
491
491
  ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
492
492
  ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
493
493
  ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
494
- ALTEREGO.contact["Exchange1"] = f"{the_packet.get("STATE", "")}".strip()
494
+ ALTEREGO.contact["Exchange1"] = f'{the_packet.get("STATE", "")}'.strip()
495
495
  ALTEREGO.contact["ZN"] = the_packet.get("CQZ", "")
496
496
  ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
497
497
  ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
@@ -502,6 +502,6 @@ def ft8_handler(the_packet: dict):
502
502
  str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
503
503
  )
504
504
  logger.debug(f"{ALTEREGO.contact=}")
505
- ALTEREGO.other_1.setText(f"{the_packet.get("STX", "")}".strip())
506
- ALTEREGO.other_2.setText(f"{the_packet.get("SRX", "")}".strip())
505
+ ALTEREGO.other_1.setText(f'{the_packet.get("STX", "")}'.strip())
506
+ ALTEREGO.other_2.setText(f'{the_packet.get("SRX", "")}'.strip())
507
507
  ALTEREGO.save_contact()
@@ -477,7 +477,7 @@ def ft8_handler(the_packet: dict):
477
477
  ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
478
478
  ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
479
479
  ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
480
- ALTEREGO.contact["Exchange1"] = f"{the_packet.get("STATE", "")}".strip()
480
+ ALTEREGO.contact["Exchange1"] = f'{the_packet.get("STATE", "")}'.strip()
481
481
  ALTEREGO.contact["ZN"] = the_packet.get("CQZ", "")
482
482
  ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
483
483
  ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
@@ -489,5 +489,5 @@ def ft8_handler(the_packet: dict):
489
489
  )
490
490
  logger.debug(f"{ALTEREGO.contact=}")
491
491
  ALTEREGO.other_1.setText(str(the_packet.get("CQZ", "ERR")))
492
- ALTEREGO.other_2.setText(f"{the_packet.get("STATE", "")}".strip())
492
+ ALTEREGO.other_2.setText(f'{the_packet.get("STATE", "")}'.strip())
493
493
  ALTEREGO.save_contact()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.10.5
3
+ Version: 24.10.6
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/mbridak/not1mm
@@ -219,6 +219,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
219
219
 
220
220
  ## Recent Changes
221
221
 
222
+ - [24-10-6] Removed 60, 30, 17 and 12M from the default list of bands.
223
+ - [24-10-5-1] Store the bandmap spots age timer in the preferences.
222
224
  - [24-10-5] Force reselction of contest after different DB opened.
223
225
  - [24-10-2] Add WPX RTTY.
224
226
  - [24-10-1] Merged PR removing leading zeros from serial numbers. Merged PR correcting the parsing of lookups for previous name and state in the CWT.
@@ -566,7 +568,7 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
566
568
  ### CW Keyer interface
567
569
 
568
570
  Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
569
- `127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
571
+ `127.0.0.1`port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` port `8000` and
570
572
  `CAT` which if your radio supports it, sends Morse characters via rigctld. As far
571
573
  as I can tell rigctld does not support setting the radios internal keyer speed. So
572
574
  the CW speed control widget will not be functional and you'd need to control the
@@ -1,6 +1,6 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=EZ2qSug8j_EvMpr8WinG131kYCk1-Zw41YYxWyYAC60,131297
3
- not1mm/bandmap.py,sha256=1b5tXCfGTnpqqn6hPNt7zRA8SmuwSXzSwNHZXhCRt70,31434
2
+ not1mm/__main__.py,sha256=jShyKC6PnUdyT9htancQg_m5j1KlFnKmPdjmNV_he60,131520
3
+ not1mm/bandmap.py,sha256=P91rYGmd8r5K6TRNZt7kqqW6zCBVlFA1_n9-V7as1WE,31672
4
4
  not1mm/checkwindow.py,sha256=aI-nr8OF90IWV7R_XRdmitvBJ9M85evCs72HoU3Jnvc,10374
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
6
6
  not1mm/logwindow.py,sha256=pwhiwolmGnW01LF4sjlu3ywLsgfxL6KuGuKuYKYmgeY,44403
@@ -106,7 +106,7 @@ not1mm/lib/fldigi_watcher.py,sha256=reZz3fZLDoJVVZhJD9nIssk2aczCzadDSQTVu-5mTCM,
106
106
  not1mm/lib/ft8_watcher.py,sha256=BFmVIsnbwuRMWoe-dIBybuCgi0WFmr8Km0O9l4eiwMM,4624
107
107
  not1mm/lib/ham_utility.py,sha256=WMmYLDI_fJHHsn0wkpGVit2Hv8fo6r9ybexXROia8Cg,11967
108
108
  not1mm/lib/lookup.py,sha256=_Awt1HjiuSrhLTrwoF8EoFQC_bYYH1vqfAo_HSaMb00,10838
109
- not1mm/lib/multicast.py,sha256=bnFUNHyy82GmIb3_88EPBVVssj7-HzkJPaH671cK8Qw,3249
109
+ not1mm/lib/multicast.py,sha256=KJcruI-bOuHfHXPjl3SGQhL6I9sKrygy-sdFSvxffUM,3255
110
110
  not1mm/lib/n1mm.py,sha256=H54mpgJF0GAmKavM-nb5OAq2SJFWYkux4eMWWiSRxJc,6288
111
111
  not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
112
112
  not1mm/lib/playsound.py,sha256=kxkcitBFbZCXJ2wxQ1lxg4rBwfxiSpuNpJSXHOPCoXA,9241
@@ -114,7 +114,7 @@ not1mm/lib/plugin_common.py,sha256=TbFUbftjELFt4QRdsjSHbqnXSngZOlSwlCTClqosDXA,9
114
114
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
115
115
  not1mm/lib/settings.py,sha256=0Su8BQM4haVhc_P74q8UhzRZxtgWhM40UmVtQdMJQeM,10022
116
116
  not1mm/lib/super_check_partial.py,sha256=p5l3u2ZOCBtlWgbvskC50FpuoaIpR07tfC6zTdRWbh4,2334
117
- not1mm/lib/version.py,sha256=QKPfua6eKLUoDU8DhB3loJiO8PlP4wsUkEMHKl9gySU,48
117
+ not1mm/lib/version.py,sha256=-VK621TV7vjdeRUalV4nYjao7hyeK_a1xlqZJIMqY7A,48
118
118
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
119
119
  not1mm/plugins/10_10_fall_cw.py,sha256=IttjX1yy4nDdACGsiYlPteFG8eVseX_WtoFio6bqHE8,10953
120
120
  not1mm/plugins/10_10_spring_cw.py,sha256=ThCptdM3dX4ywhoy2JRcOEyHSqcJolFaT7O_PYzM1Mg,10958
@@ -135,10 +135,10 @@ not1mm/plugins/canada_day.py,sha256=OVpcCl1Chse_zLHf6PayTrgawWM4W-pmrTw40Al-o9s,
135
135
  not1mm/plugins/cq_160_cw.py,sha256=5s6rIZdJEnmWe1SI06BEyz7p5vP0N2n9mI4l_mZ0icw,14139
136
136
  not1mm/plugins/cq_160_ssb.py,sha256=zIwSMAjHSt6W2edrDzVbyTf860JowHoFkU9BKO8Enag,14182
137
137
  not1mm/plugins/cq_wpx_cw.py,sha256=9aNzAR-KhznIwUlxUFjAi_hbiw_6RrCMwUBk9I2f6Hs,14037
138
- not1mm/plugins/cq_wpx_rtty.py,sha256=d0YsC_RDNEhp0mFGxtm7Ao7tI8wEeJJOACYAXdSWiWw,16473
138
+ not1mm/plugins/cq_wpx_rtty.py,sha256=PpU_PxjQGeMjzbofYNsl-No37s7IgkPyW2bKFRkN9jU,16473
139
139
  not1mm/plugins/cq_wpx_ssb.py,sha256=-hGRovqHR9rfOUnG4LPOoABTb4heH8VAX6rYdJbCqsw,12687
140
140
  not1mm/plugins/cq_ww_cw.py,sha256=m4Xkqb_qFyXWEgkxqbanvtiCTvI8NNPKNXzHgFZzhnE,12340
141
- not1mm/plugins/cq_ww_rtty.py,sha256=N0togQbMSpRyRpGoYvnlGC3mpduR82g-D39Swtp5wjI,16772
141
+ not1mm/plugins/cq_ww_rtty.py,sha256=WnqSfCNX6ieLZlUg_P_vx-Z2iY0lxdwEgPuT9aax1JU,16772
142
142
  not1mm/plugins/cq_ww_ssb.py,sha256=hZwG88-hPLmwIGXHX_S_ty8Nhn1kIuPjSuTRpCWoN9g,12631
143
143
  not1mm/plugins/cwt.py,sha256=KvvkEfQrYSra0y8qE4yThvZNLrZcslt0IqYEomDpf-M,12774
144
144
  not1mm/plugins/general_logging.py,sha256=n-2es7erqK1ptwq_wwIKIwktptKN7ra2eWjAQlpXUac,3479
@@ -157,9 +157,10 @@ not1mm/plugins/ref_cw.py,sha256=aWjHHkqIKutjRUtzh09y5haFfnZK9poRQDWRQMDRxxU,1632
157
157
  not1mm/plugins/stew_perry_topband.py,sha256=CKBQbYl4ETxhXJd2dma4fg_C5pag_s7Nf61SCztZtqE,10668
158
158
  not1mm/plugins/weekly_rtty.py,sha256=DQcy3SY0Zn56EdlYGf3NxrRhTnkNa5IqRQPRQdKDSPs,14255
159
159
  not1mm/plugins/winter_field_day.py,sha256=4rcfRtobwjHO6BNL3WOTHzBmyyeuX79BNGBG8PfjrI8,10238
160
- not1mm-24.10.5.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
161
- not1mm-24.10.5.dist-info/METADATA,sha256=tUHkzzo90HrjlEb-Qar2f4P3V_yD1rW8HmSQLOJS278,30592
162
- not1mm-24.10.5.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
163
- not1mm-24.10.5.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
164
- not1mm-24.10.5.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
165
- not1mm-24.10.5.dist-info/RECORD,,
160
+ test/contests.py,sha256=bPJZz0zC_d_lpkc9_-Llct628DZIL5kI7m2QIVhAcVM,17498
161
+ not1mm-24.10.6.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
162
+ not1mm-24.10.6.dist-info/METADATA,sha256=7tWxHcNmpDHMgBdupY6ZsugM5vCFGFezsnFJveseiKE,30738
163
+ not1mm-24.10.6.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
164
+ not1mm-24.10.6.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
165
+ not1mm-24.10.6.dist-info/top_level.txt,sha256=b4JoTnuFyh8DwxYUjTpCWpKI9Yi1tKwwvCjSYiNY4G8,12
166
+ not1mm-24.10.6.dist-info/RECORD,,
test/contests.py ADDED
@@ -0,0 +1,591 @@
1
+ import pytest
2
+ import os
3
+
4
+ from PyQt6 import QtCore, QtWidgets
5
+
6
+ import not1mm.__main__ as not1mm
7
+ import not1mm.fsutils as fsutils
8
+
9
+ WAIT_TIME = 10
10
+
11
+ # Entry options:
12
+ # callsign
13
+ # sent (field1)
14
+ # receive (field2)
15
+ # other_1 (field3)
16
+ # other_2 (field4)
17
+
18
+ CONTEST_DATA = {
19
+ "General Logging": [
20
+ {
21
+ "callsign": "KF0NRV",
22
+ "sent": "599",
23
+ "receive": "599",
24
+ "other_1": "dan",
25
+ "other_2": "cool dude",
26
+ },
27
+ {
28
+ "callsign": "KF0NRV",
29
+ "sent": "599",
30
+ "receive": "599",
31
+ "other_1": "dan",
32
+ "other_2": "cool dude",
33
+ },
34
+ {
35
+ "callsign": "K6GTE",
36
+ "sent": "599",
37
+ "receive": "599",
38
+ "other_1": "mike",
39
+ "other_2": "cool dude",
40
+ },
41
+ ],
42
+ "10 10 FALL CW": [
43
+ {
44
+ "callsign": "KF0NRV",
45
+ "sent": "599",
46
+ "receive": "599",
47
+ "other_2": "dan 1234 ia",
48
+ },
49
+ {
50
+ "callsign": "KF0NRV",
51
+ "sent": "599",
52
+ "receive": "599",
53
+ "other_2": "dan 1234 ia",
54
+ },
55
+ {
56
+ "callsign": "K6GTE",
57
+ "sent": "599",
58
+ "receive": "599",
59
+ "other_2": "mike 1234 ca",
60
+ },
61
+ ],
62
+ "10 10 SPRING CW": [
63
+ {
64
+ "callsign": "KF0NRV",
65
+ "sent": "599",
66
+ "receive": "599",
67
+ "other_2": "dan 1234 ia",
68
+ },
69
+ {
70
+ "callsign": "KF0NRV",
71
+ "sent": "599",
72
+ "receive": "599",
73
+ "other_2": "dan 1234 ia",
74
+ },
75
+ {
76
+ "callsign": "K6GTE",
77
+ "sent": "599",
78
+ "receive": "599",
79
+ "other_2": "mike 1234 ca",
80
+ },
81
+ ],
82
+ "10 10 SUMMER PHONE": [
83
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "dan 1234 ia"},
84
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "dan 1234 ia"},
85
+ {"callsign": "K6GTE", "sent": "59", "receive": "59", "other_2": "mike 1234 ca"},
86
+ ],
87
+ "10 10 WINTER PHONE": [
88
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "dan 1234 ia"},
89
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "dan 1234 ia"},
90
+ {"callsign": "K6GTE", "sent": "59", "receive": "59", "other_2": "mike 1234 ca"},
91
+ ],
92
+ "ARRL 10M": [
93
+ {
94
+ "callsign": "KF0NRV",
95
+ "sent": "599",
96
+ "receive": "599",
97
+ "other_1": "1234",
98
+ "other_2": "ia",
99
+ },
100
+ {
101
+ "callsign": "KF0NRV",
102
+ "sent": "599",
103
+ "receive": "599",
104
+ "other_1": "1234",
105
+ "other_2": "ia",
106
+ },
107
+ {
108
+ "callsign": "K6GTE",
109
+ "sent": "599",
110
+ "receive": "599",
111
+ "other_1": "2345",
112
+ "other_2": "ca",
113
+ },
114
+ ],
115
+ "ARRL DX CW": [
116
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "100W"},
117
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "100W"},
118
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_2": "100W"},
119
+ ],
120
+ "ARRL DX SSB": [
121
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "100W"},
122
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "100W"},
123
+ {"callsign": "K6GTE", "sent": "59", "receive": "59", "other_2": "100W"},
124
+ ],
125
+ "ARRL FIELD DAY": [
126
+ {"callsign": "KF0NRV", "other_1": "1", "other_2": "a"},
127
+ {"callsign": "KF0NRV", "other_1": "1", "other_2": "a"},
128
+ {"callsign": "K6GTE", "other_1": "1", "other_2": "a"},
129
+ ],
130
+ "ARRL SS CW": [
131
+ {
132
+ "callsign": "KF0NRV",
133
+ "sent": "599",
134
+ "receive": "599",
135
+ "other_1": "1",
136
+ "other_2": "27",
137
+ },
138
+ {
139
+ "callsign": "KF0NRV",
140
+ "sent": "599",
141
+ "receive": "599",
142
+ "other_1": "2",
143
+ "other_2": "42",
144
+ },
145
+ {
146
+ "callsign": "K6GTE",
147
+ "sent": "599",
148
+ "receive": "599",
149
+ "other_1": "3",
150
+ "other_2": "100",
151
+ },
152
+ ],
153
+ "ARRL SS PHONE": [
154
+ {
155
+ "callsign": "KF0NRV",
156
+ "sent": "59",
157
+ "receive": "59",
158
+ "other_1": "1",
159
+ "other_2": "27",
160
+ },
161
+ {
162
+ "callsign": "KF0NRV",
163
+ "sent": "59",
164
+ "receive": "59",
165
+ "other_1": "2",
166
+ "other_2": "42",
167
+ },
168
+ {
169
+ "callsign": "K6GTE",
170
+ "sent": "59",
171
+ "receive": "59",
172
+ "other_1": "3",
173
+ "other_2": "100",
174
+ },
175
+ ],
176
+ "ARRL VHF JAN": [
177
+ {
178
+ "callsign": "KF0NRV",
179
+ "sent": "599",
180
+ "receive": "599",
181
+ "other_1": "1234",
182
+ "other_2": "BB22AA",
183
+ },
184
+ {
185
+ "callsign": "KF0NRV",
186
+ "sent": "599",
187
+ "receive": "599",
188
+ "other_1": "1234",
189
+ "other_2": "BB22AA",
190
+ },
191
+ {
192
+ "callsign": "K6GTE",
193
+ "sent": "599",
194
+ "receive": "599",
195
+ "other_1": "2345",
196
+ "other_2": "AA11bb",
197
+ },
198
+ ],
199
+ "ARRL VHF JUN": [
200
+ {
201
+ "callsign": "KF0NRV",
202
+ "sent": "599",
203
+ "receive": "599",
204
+ "other_1": "1234",
205
+ "other_2": "BB22AA",
206
+ },
207
+ {
208
+ "callsign": "KF0NRV",
209
+ "sent": "599",
210
+ "receive": "599",
211
+ "other_1": "1234",
212
+ "other_2": "BB22AA",
213
+ },
214
+ {
215
+ "callsign": "K6GTE",
216
+ "sent": "599",
217
+ "receive": "599",
218
+ "other_1": "2345",
219
+ "other_2": "AA11bb",
220
+ },
221
+ ],
222
+ "ARRL VHF SEP": [
223
+ {
224
+ "callsign": "KF0NRV",
225
+ "sent": "599",
226
+ "receive": "599",
227
+ "other_1": "1234",
228
+ "other_2": "BB22AA",
229
+ },
230
+ {
231
+ "callsign": "KF0NRV",
232
+ "sent": "599",
233
+ "receive": "599",
234
+ "other_1": "1234",
235
+ "other_2": "BB22AA",
236
+ },
237
+ {
238
+ "callsign": "K6GTE",
239
+ "sent": "599",
240
+ "receive": "599",
241
+ "other_1": "2345",
242
+ "other_2": "AA11bb",
243
+ },
244
+ ],
245
+ "CANADA DAY": [
246
+ {
247
+ "callsign": "KF0NRV",
248
+ "sent": "599",
249
+ "receive": "599",
250
+ "other_1": "1",
251
+ "other_2": "ia",
252
+ },
253
+ {
254
+ "callsign": "KF0NRV",
255
+ "sent": "599",
256
+ "receive": "599",
257
+ "other_1": "2",
258
+ "other_2": "ia",
259
+ },
260
+ {
261
+ "callsign": "K6GTE",
262
+ "sent": "599",
263
+ "receive": "599",
264
+ "other_1": "3",
265
+ "other_2": "ca",
266
+ },
267
+ ],
268
+ "CQ 160 CW": [
269
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "ia"},
270
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "ia"},
271
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_2": "ca"},
272
+ ],
273
+ "CQ 160 SSB": [
274
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "ia"},
275
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "ia"},
276
+ {"callsign": "K6GTE", "sent": "59", "receive": "59", "other_2": "ca"},
277
+ ],
278
+ "CQ WPX CW": [
279
+ {
280
+ "callsign": "KF0NRV",
281
+ "sent": "599",
282
+ "receive": "599",
283
+ "other_1": "1",
284
+ "other_2": "3",
285
+ },
286
+ {
287
+ "callsign": "KF0NRV",
288
+ "sent": "599",
289
+ "receive": "599",
290
+ "other_1": "2",
291
+ "other_2": "2",
292
+ },
293
+ {
294
+ "callsign": "K6GTE",
295
+ "sent": "599",
296
+ "receive": "599",
297
+ "other_1": "3",
298
+ "other_2": "1",
299
+ },
300
+ ],
301
+ "CQ WPX SSB": [
302
+ {
303
+ "callsign": "KF0NRV",
304
+ "sent": "59",
305
+ "receive": "59",
306
+ "other_1": "1",
307
+ "other_2": "3",
308
+ },
309
+ {
310
+ "callsign": "KF0NRV",
311
+ "sent": "59",
312
+ "receive": "59",
313
+ "other_1": "2",
314
+ "other_2": "2",
315
+ },
316
+ {
317
+ "callsign": "K6GTE",
318
+ "sent": "59",
319
+ "receive": "59",
320
+ "other_1": "3",
321
+ "other_2": "1",
322
+ },
323
+ ],
324
+ "CQ WW CW": [
325
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "4"},
326
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "4"},
327
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_2": "3"},
328
+ ],
329
+ "CQ WW RTTY": [
330
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "4"},
331
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "4"},
332
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_2": "3"},
333
+ ],
334
+ "CQ WW SSB": [
335
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "4"},
336
+ {"callsign": "KF0NRV", "sent": "59", "receive": "59", "other_2": "4"},
337
+ {"callsign": "K6GTE", "sent": "59", "receive": "59", "other_2": "3"},
338
+ ],
339
+ "CWT": [
340
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
341
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
342
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
343
+ ],
344
+ "HELVETIA": [
345
+ {
346
+ "callsign": "KF0NRV",
347
+ "sent": "599",
348
+ "receive": "599",
349
+ "other_1": "1",
350
+ "other_2": "3",
351
+ },
352
+ {
353
+ "callsign": "KF0NRV",
354
+ "sent": "599",
355
+ "receive": "599",
356
+ "other_1": "2",
357
+ "other_2": "2",
358
+ },
359
+ {
360
+ "callsign": "K6GTE",
361
+ "sent": "599",
362
+ "receive": "599",
363
+ "other_1": "3",
364
+ "other_2": "1",
365
+ },
366
+ ],
367
+ "ICWC MST": [
368
+ {"callsign": "KF0NRV", "sent": "1", "other_1": "dan", "other_2": "1"},
369
+ {"callsign": "KF0NRV", "sent": "2", "other_1": "dan", "other_2": "2"},
370
+ {"callsign": "K6GTE", "sent": "3", "other_1": "mike", "other_2": "3"},
371
+ ],
372
+ "IARU FIELDDAY R1 CW": [
373
+ {
374
+ "callsign": "KF0NRV",
375
+ "sent": "599",
376
+ "receive": "599",
377
+ "other_1": "1",
378
+ "other_2": "1",
379
+ },
380
+ {
381
+ "callsign": "KF0NRV",
382
+ "sent": "599",
383
+ "receive": "599",
384
+ "other_1": "2",
385
+ "other_2": "2",
386
+ },
387
+ {
388
+ "callsign": "K6GTE",
389
+ "sent": "599",
390
+ "receive": "599",
391
+ "other_1": "3",
392
+ "other_2": "3",
393
+ },
394
+ ],
395
+ "IARU FIELDDAY R1 SSB": [
396
+ {
397
+ "callsign": "KF0NRV",
398
+ "sent": "59",
399
+ "receive": "59",
400
+ "other_1": "1",
401
+ "other_2": "1",
402
+ },
403
+ {
404
+ "callsign": "KF0NRV",
405
+ "sent": "59",
406
+ "receive": "59",
407
+ "other_1": "2",
408
+ "other_2": "2",
409
+ },
410
+ {
411
+ "callsign": "K6GTE",
412
+ "sent": "59",
413
+ "receive": "59",
414
+ "other_1": "3",
415
+ "other_2": "3",
416
+ },
417
+ ],
418
+ "IARU HF": [
419
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "7"},
420
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_2": "7"},
421
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_2": "6"},
422
+ ],
423
+ "JIDX CW": [
424
+ {
425
+ "callsign": "KF0NRV",
426
+ "sent": "599",
427
+ "receive": "599",
428
+ "other_1": "1",
429
+ "other_2": "1",
430
+ },
431
+ {
432
+ "callsign": "KF0NRV",
433
+ "sent": "599",
434
+ "receive": "599",
435
+ "other_1": "2",
436
+ "other_2": "2",
437
+ },
438
+ {
439
+ "callsign": "K6GTE",
440
+ "sent": "599",
441
+ "receive": "599",
442
+ "other_1": "3",
443
+ "other_2": "3",
444
+ },
445
+ ],
446
+ "JIDX PH": [
447
+ {
448
+ "callsign": "KF0NRV",
449
+ "sent": "59",
450
+ "receive": "59",
451
+ "other_1": "1",
452
+ "other_2": "1",
453
+ },
454
+ {
455
+ "callsign": "KF0NRV",
456
+ "sent": "59",
457
+ "receive": "59",
458
+ "other_1": "2",
459
+ "other_2": "2",
460
+ },
461
+ {
462
+ "callsign": "K6GTE",
463
+ "sent": "59",
464
+ "receive": "59",
465
+ "other_1": "3",
466
+ "other_2": "3",
467
+ },
468
+ ],
469
+ "K1USN SST": [
470
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
471
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
472
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
473
+ ],
474
+ "NAQP CW": [
475
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
476
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
477
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
478
+ ],
479
+ "NAQP SSB": [
480
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
481
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
482
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
483
+ ],
484
+ "PHONE WEEKLY TEST": [
485
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
486
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
487
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
488
+ ],
489
+ "STEW PERRY TOPBAND": [
490
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_1": "BB22AA"},
491
+ {"callsign": "KF0NRV", "sent": "599", "receive": "599", "other_1": "BB22AA"},
492
+ {"callsign": "K6GTE", "sent": "599", "receive": "599", "other_1": "AA11bb"},
493
+ ],
494
+ "WEEKLY RTTY": [
495
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
496
+ {"callsign": "KF0NRV", "other_1": "dan", "other_2": "ia"},
497
+ {"callsign": "K6GTE", "other_1": "mike", "other_2": "ca"},
498
+ ],
499
+ "WINTER FIELD DAY": [
500
+ {"callsign": "KF0NRV", "other_1": "1", "other_2": "a"},
501
+ {"callsign": "KF0NRV", "other_1": "1", "other_2": "a"},
502
+ {"callsign": "K6GTE", "other_1": "1", "other_2": "a"},
503
+ ],
504
+ }
505
+
506
+
507
+ @pytest.fixture
508
+ def app(qtbot):
509
+ # Qbot setup
510
+ not1mm_app = not1mm.MainWindow(not1mm.splash)
511
+ not1mm_app.show()
512
+ qtbot.addWidget(not1mm_app)
513
+
514
+ # Stub out filepicker and create a new database
515
+ if os.path.exists(fsutils.USER_DATA_PATH / "contest_testing.db"):
516
+ os.remove(fsutils.USER_DATA_PATH / "contest_testing.db")
517
+ not1mm_app.filepicker = lambda x: "contest_testing.db"
518
+ not1mm_app.actionNew_Database.trigger()
519
+
520
+ # Enter initial setings as default
521
+ settings_dialog = not1mm_app.settings_dialog
522
+ settings_dialog.Call.setText("K5TUX")
523
+ settings_dialog.ITUZone.setText("7")
524
+ settings_dialog.CQZone.setText("4")
525
+ settings_dialog.Country.setText("United States")
526
+ settings_dialog.GridSquare.setText("EM37bb")
527
+ settings_dialog.Latitude.setText("37.0625")
528
+ settings_dialog.Longitude.setText("-93.875")
529
+
530
+ qtbot.keyClick(
531
+ settings_dialog,
532
+ QtCore.Qt.Key.Key_Tab,
533
+ modifier=QtCore.Qt.KeyboardModifier.ShiftModifier,
534
+ delay=WAIT_TIME,
535
+ )
536
+ qtbot.keyClick(settings_dialog, QtCore.Qt.Key.Key_Return)
537
+
538
+ # Enter initial contest as default
539
+ contest_dialog = not1mm_app.contest_dialog
540
+ qtbot.keyClick(
541
+ contest_dialog,
542
+ QtCore.Qt.Key.Key_Tab,
543
+ modifier=QtCore.Qt.KeyboardModifier.ShiftModifier,
544
+ delay=WAIT_TIME,
545
+ )
546
+ qtbot.keyClick(contest_dialog, QtCore.Qt.Key.Key_Return)
547
+ yield not1mm_app
548
+ # Cleanup
549
+ if os.path.exists(fsutils.USER_DATA_PATH / "contest_testing.db"):
550
+ os.remove(fsutils.USER_DATA_PATH / "contest_testing.db")
551
+
552
+
553
+ def test_contests(app, qtbot):
554
+ # Each contest has an initial log, a duplicate log, and a unique log
555
+
556
+ for contest in CONTEST_DATA:
557
+ app.actionNew_Contest.trigger()
558
+
559
+ contest_dialog = app.contest_dialog
560
+ contest_dialog.contest.setCurrentText(contest)
561
+ qtbot.keyClick(
562
+ contest_dialog,
563
+ QtCore.Qt.Key.Key_Tab,
564
+ modifier=QtCore.Qt.KeyboardModifier.ShiftModifier,
565
+ delay=WAIT_TIME,
566
+ )
567
+ qtbot.keyClick(contest_dialog, QtCore.Qt.Key.Key_Return)
568
+
569
+ # Enter each field and tab keystroke to exercise plugin hooks
570
+ for entry in CONTEST_DATA[contest]:
571
+ if "callsign" in entry:
572
+ app.callsign.setText(entry["callsign"])
573
+ qtbot.keyClick(app, QtCore.Qt.Key.Key_Tab, delay=WAIT_TIME)
574
+
575
+ if "sent" in entry:
576
+ app.sent.setText(entry["sent"])
577
+ qtbot.keyClick(app, QtCore.Qt.Key.Key_Tab, delay=WAIT_TIME)
578
+
579
+ if "receive" in entry:
580
+ app.receive.setText(entry["receive"])
581
+ qtbot.keyClick(app, QtCore.Qt.Key.Key_Tab, delay=WAIT_TIME)
582
+
583
+ if "other_1" in entry:
584
+ app.other_1.setText(entry["other_1"])
585
+ qtbot.keyClick(app, QtCore.Qt.Key.Key_Tab, delay=WAIT_TIME)
586
+
587
+ if "other_2" in entry:
588
+ app.other_2.setText(entry["other_2"])
589
+
590
+ qtbot.wait(WAIT_TIME)
591
+ qtbot.keyClick(app.callsign, QtCore.Qt.Key.Key_Return)