not1mm 23.3.24.1__tar.gz → 23.3.27__tar.gz
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-23.3.24.1 → not1mm-23.3.27}/PKG-INFO +12 -1
- {not1mm-23.3.24.1 → not1mm-23.3.27}/README.md +11 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/__main__.py +24 -131
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/main.ui +6 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/database.py +24 -0
- not1mm-23.3.27/not1mm/lib/version.py +2 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/logwindow.py +0 -0
- not1mm-23.3.27/not1mm/plugins/cq_wpx_cw.py +389 -0
- not1mm-23.3.27/not1mm/plugins/cq_wpx_ssb.py +389 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/PKG-INFO +12 -1
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/SOURCES.txt +1 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/pyproject.toml +1 -1
- not1mm-23.3.24.1/not1mm/lib/version.py +0 -2
- not1mm-23.3.24.1/not1mm/plugins/cq_wpx_ssb.py +0 -158
- {not1mm-23.3.24.1 → not1mm-23.3.27}/LICENSE +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/__init__.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/Combinear.qss +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/MASTER.SCP +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/check.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/contests.sql +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/cty.json +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/cwmacros.txt +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/editcontact.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/editmacro.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/greendot.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte-not1mm.desktop +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-128.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-32.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-64.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/logwindow.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/opon.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/reddot.png +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/settings.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/use_qrz_dialog.ui +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/__init__.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/cat_interface.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/cwinterface.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_contact.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_macro.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_opon.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_settings.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/ham_utility.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/lookup.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/multicast.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/n1mm.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/qrz_dialog.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/__init__.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_dx_cw.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_dx_phone.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_field_day.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_rtty_ru.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_ss_cw.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_ss_phone.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/cqww_dx_cw.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/cqww_dx_ssb.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/general_logging.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/winter_field_day.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/test.py +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/dependency_links.txt +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/entry_points.txt +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/requires.txt +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/top_level.txt +0 -0
- {not1mm-23.3.24.1 → not1mm-23.3.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 23.3.
|
3
|
+
Version: 23.3.27
|
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
|
@@ -40,6 +40,7 @@ License-File: LICENSE
|
|
40
40
|
- [Log Display](#log-display)
|
41
41
|
- [Editing a contact](#editing-a-contact)
|
42
42
|
- [Cabrillo](#cabrillo)
|
43
|
+
- [ADIF](#adif)
|
43
44
|
- [Dupe checking](#dupe-checking)
|
44
45
|
- [CAT](#cat)
|
45
46
|
|
@@ -70,6 +71,8 @@ Feature complete.
|
|
70
71
|
|
71
72
|
## Changes of note
|
72
73
|
|
74
|
+
- [23-3-27] Fix cursor behaviour when editing text in callsign field.
|
75
|
+
- [23-3-25] Fix minimum call length. Fix cabrillo tag. Add adif output.
|
73
76
|
- [23-3-24] Added dupe checking. Added CAT check for flrig or rigctld. Added online flag for flrig.
|
74
77
|
- [23-3-23] Added most of Cabrillo generation. Plan to test it this weekends CQ WPX SSB.
|
75
78
|
- [23-3-22] Add prefill of serial nr. set OP call on startup. Set IsMultiplier1 new unique wpx. Add OP and contest name to window title. and stuff.
|
@@ -192,6 +195,14 @@ So for me it would be:
|
|
192
195
|
|
193
196
|
K6GTE_CQ-WPX-SSB.log
|
194
197
|
|
198
|
+
## ADIF
|
199
|
+
|
200
|
+
`File` > `Generate ADIF`
|
201
|
+
|
202
|
+
Boom... ADIF
|
203
|
+
|
204
|
+
`StationCall`_`ContestName`.adi
|
205
|
+
|
195
206
|
## Dupe checking
|
196
207
|
|
197
208
|
Added dupe checking. Big Red 'Dupe' will appear if it's a dupe...
|
@@ -21,6 +21,7 @@
|
|
21
21
|
- [Log Display](#log-display)
|
22
22
|
- [Editing a contact](#editing-a-contact)
|
23
23
|
- [Cabrillo](#cabrillo)
|
24
|
+
- [ADIF](#adif)
|
24
25
|
- [Dupe checking](#dupe-checking)
|
25
26
|
- [CAT](#cat)
|
26
27
|
|
@@ -51,6 +52,8 @@ Feature complete.
|
|
51
52
|
|
52
53
|
## Changes of note
|
53
54
|
|
55
|
+
- [23-3-27] Fix cursor behaviour when editing text in callsign field.
|
56
|
+
- [23-3-25] Fix minimum call length. Fix cabrillo tag. Add adif output.
|
54
57
|
- [23-3-24] Added dupe checking. Added CAT check for flrig or rigctld. Added online flag for flrig.
|
55
58
|
- [23-3-23] Added most of Cabrillo generation. Plan to test it this weekends CQ WPX SSB.
|
56
59
|
- [23-3-22] Add prefill of serial nr. set OP call on startup. Set IsMultiplier1 new unique wpx. Add OP and contest name to window title. and stuff.
|
@@ -173,6 +176,14 @@ So for me it would be:
|
|
173
176
|
|
174
177
|
K6GTE_CQ-WPX-SSB.log
|
175
178
|
|
179
|
+
## ADIF
|
180
|
+
|
181
|
+
`File` > `Generate ADIF`
|
182
|
+
|
183
|
+
Boom... ADIF
|
184
|
+
|
185
|
+
`StationCall`_`ContestName`.adi
|
186
|
+
|
176
187
|
## Dupe checking
|
177
188
|
|
178
189
|
Added dupe checking. Big Red 'Dupe' will appear if it's a dupe...
|
@@ -206,6 +206,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
206
206
|
self.actionPreferences.triggered.connect(self.preference_selected)
|
207
207
|
self.actionQRZ_Settings.triggered.connect(self.qrz_preference_selected)
|
208
208
|
self.actionGenerate_Cabrillo.triggered.connect(self.generate_cabrillo)
|
209
|
+
self.actionGenerate_ADIF.triggered.connect(self.generate_adif)
|
209
210
|
self.actionLog_Window.triggered.connect(self.launch_log_window)
|
210
211
|
self.radioButton_run.clicked.connect(self.run_sp_buttons_clicked)
|
211
212
|
self.radioButton_sp.clicked.connect(self.run_sp_buttons_clicked)
|
@@ -511,7 +512,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
511
512
|
def save_contact(self):
|
512
513
|
"""Save to db"""
|
513
514
|
logger.debug("saving")
|
514
|
-
if len(self.callsign.text()) <
|
515
|
+
if len(self.callsign.text()) < 3:
|
515
516
|
return
|
516
517
|
if not any(char.isdigit() for char in self.callsign.text()):
|
517
518
|
return
|
@@ -662,7 +663,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
662
663
|
|
663
664
|
def select_contest(self):
|
664
665
|
"""Load contest"""
|
665
|
-
self.contest = doimp("
|
666
|
+
self.contest = doimp("cq_wpx_cw")
|
666
667
|
logger.debug("Loaded Contest Name = %s", self.contest.name)
|
667
668
|
self.contest.init_contest(self)
|
668
669
|
|
@@ -983,10 +984,12 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
983
984
|
"""Called when text in the callsign field has changed"""
|
984
985
|
text = self.callsign.text()
|
985
986
|
text = text.upper()
|
986
|
-
|
987
|
+
position = self.callsign.cursorPosition()
|
988
|
+
stripped_text = text.strip().replace(" ", "")
|
987
989
|
self.callsign.setText(stripped_text)
|
990
|
+
self.callsign.setCursorPosition(position)
|
988
991
|
|
989
|
-
if
|
992
|
+
if " " in text:
|
990
993
|
if stripped_text == "CW":
|
991
994
|
self.setmode("CW")
|
992
995
|
self.radio_state["mode"] = "CW"
|
@@ -1112,9 +1115,18 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1112
1115
|
"""Checks if a callsign is a dupe on current band/mode."""
|
1113
1116
|
band = float(get_logged_band(str(self.radio_state.get("vfoa", 0.0))))
|
1114
1117
|
mode = self.radio_state.get("mode", "")
|
1115
|
-
debugline =
|
1118
|
+
debugline = (
|
1119
|
+
f"Call: {call} Band: {band} Mode: {mode} Dupetype: {self.contest.dupe_type}"
|
1120
|
+
)
|
1116
1121
|
logger.debug("%s", debugline)
|
1117
|
-
|
1122
|
+
if self.contest.dupe_type == 1:
|
1123
|
+
result = self.database.check_dupe(call)
|
1124
|
+
if self.contest.dupe_type == 2:
|
1125
|
+
result = self.database.check_dupe_on_band(call, band)
|
1126
|
+
if self.contest.dupe_type == 3:
|
1127
|
+
result = self.database.check_dupe_on_band_mode(call, band, mode)
|
1128
|
+
if self.contest.dupe_type == 4:
|
1129
|
+
result = {"isdupe": False}
|
1118
1130
|
debugline = f"{result}"
|
1119
1131
|
logger.debug("%s", debugline)
|
1120
1132
|
return result.get("isdupe", False)
|
@@ -1232,135 +1244,16 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1232
1244
|
self.F12.setText(f"F12: {self.fkeys['F12'][0]}")
|
1233
1245
|
self.F12.setToolTip(self.fkeys["F12"][1])
|
1234
1246
|
|
1247
|
+
def generate_adif(self):
|
1248
|
+
"""Generate ADIF"""
|
1249
|
+
logger.debug("******ADIF*****")
|
1250
|
+
self.contest.adif(self)
|
1251
|
+
|
1235
1252
|
def generate_cabrillo(self):
|
1236
1253
|
"""Generates Cabrillo file. Maybe."""
|
1237
1254
|
# https://www.cqwpx.com/cabrillo.htm
|
1238
1255
|
logger.debug("******Cabrillo*****")
|
1239
|
-
|
1240
|
-
str(Path.home())
|
1241
|
-
+ "/"
|
1242
|
-
+ f"{self.pref.get('callsign').upper()}_{self.contest.cabrillo_name}.log"
|
1243
|
-
)
|
1244
|
-
logger.debug("%s", filename)
|
1245
|
-
# self.infobox.setTextColor(QtGui.QColor(211, 215, 207))
|
1246
|
-
# self.infobox.insertPlainText(f"Saving cabrillo to: {filename}")
|
1247
|
-
# app.processEvents()
|
1248
|
-
# bonuses = 0
|
1249
|
-
log = self.database.fetch_all_contacts_asc()
|
1250
|
-
# catpower = ""
|
1251
|
-
try:
|
1252
|
-
with open(filename, "w", encoding="ascii") as file_descriptor:
|
1253
|
-
print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
|
1254
|
-
print(
|
1255
|
-
f"CREATED-BY: Not1MM v{__version__}",
|
1256
|
-
end="\r\n",
|
1257
|
-
file=file_descriptor,
|
1258
|
-
)
|
1259
|
-
print(
|
1260
|
-
f"CONTEST: {self.contest.cabrillo_name}",
|
1261
|
-
end="\r\n",
|
1262
|
-
file=file_descriptor,
|
1263
|
-
)
|
1264
|
-
print(
|
1265
|
-
f"CALLSIGN: {self.pref.get('callsign','')}",
|
1266
|
-
end="\r\n",
|
1267
|
-
file=file_descriptor,
|
1268
|
-
)
|
1269
|
-
print(
|
1270
|
-
f"LOCATION: {self.pref.get('section', '')}",
|
1271
|
-
end="\r\n",
|
1272
|
-
file=file_descriptor,
|
1273
|
-
)
|
1274
|
-
# print(
|
1275
|
-
# f"ARRL-SECTION: {self.pref.get('section', '')}",
|
1276
|
-
# end="\r\n",
|
1277
|
-
# file=file_descriptor,
|
1278
|
-
# )
|
1279
|
-
print(
|
1280
|
-
f"CATEGORY: {None}",
|
1281
|
-
end="\r\n",
|
1282
|
-
file=file_descriptor,
|
1283
|
-
)
|
1284
|
-
print("CATEGORY-POWER: ", end="\r\n", file=file_descriptor)
|
1285
|
-
|
1286
|
-
print(
|
1287
|
-
f"CLAIMED-SCORE: {self.contest.calc_score(self)}",
|
1288
|
-
end="\r\n",
|
1289
|
-
file=file_descriptor,
|
1290
|
-
)
|
1291
|
-
print(
|
1292
|
-
"OPERATORS: ",
|
1293
|
-
end="\r\n",
|
1294
|
-
file=file_descriptor,
|
1295
|
-
)
|
1296
|
-
print(
|
1297
|
-
f"NAME: {self.pref.get('name', '')}",
|
1298
|
-
end="\r\n",
|
1299
|
-
file=file_descriptor,
|
1300
|
-
)
|
1301
|
-
print(
|
1302
|
-
f"ADDRESS: {self.pref.get('address1', '')}",
|
1303
|
-
end="\r\n",
|
1304
|
-
file=file_descriptor,
|
1305
|
-
)
|
1306
|
-
print(
|
1307
|
-
f"ADDRESS-CITY: {self.pref.get('city', '')}",
|
1308
|
-
end="\r\n",
|
1309
|
-
file=file_descriptor,
|
1310
|
-
)
|
1311
|
-
print(
|
1312
|
-
f"ADDRESS-STATE: {self.pref.get('state', '')}",
|
1313
|
-
end="\r\n",
|
1314
|
-
file=file_descriptor,
|
1315
|
-
)
|
1316
|
-
print(
|
1317
|
-
f"ADDRESS-POSTALCODE: {self.pref.get('zip', '')}",
|
1318
|
-
end="\r\n",
|
1319
|
-
file=file_descriptor,
|
1320
|
-
)
|
1321
|
-
print(
|
1322
|
-
f"ADDRESS-COUNTRY: {self.pref.get('country', '')}",
|
1323
|
-
end="\r\n",
|
1324
|
-
file=file_descriptor,
|
1325
|
-
)
|
1326
|
-
print(
|
1327
|
-
f"EMAIL: {self.pref.get('email', '')}",
|
1328
|
-
end="\r\n",
|
1329
|
-
file=file_descriptor,
|
1330
|
-
)
|
1331
|
-
for contact in log:
|
1332
|
-
# hiscall = contact.get("Call", "")
|
1333
|
-
# hisclass = contact.get("class")
|
1334
|
-
# hissection = contact.get("section")
|
1335
|
-
the_date_and_time = contact.get("TS", "")
|
1336
|
-
# band = contact.get("Band", "")
|
1337
|
-
mode = contact.get("Mode", "")
|
1338
|
-
if mode == "LSB" or mode == "USB":
|
1339
|
-
mode = "PH"
|
1340
|
-
frequency = str(int(contact.get("Freq", "0"))).rjust(5)
|
1341
|
-
|
1342
|
-
loggeddate = the_date_and_time[:10]
|
1343
|
-
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
1344
|
-
print(
|
1345
|
-
f"QSO: {frequency} {mode} {loggeddate} {loggedtime} "
|
1346
|
-
f"{contact.get('StationPrefix', '').ljust(13)} "
|
1347
|
-
f"{str(contact.get('SNT', '')).ljust(3)} "
|
1348
|
-
f"{str(contact.get('SentNr', '')).ljust(6)} "
|
1349
|
-
f"{contact.get('Call', '').ljust(13)} "
|
1350
|
-
f"{str(contact.get('RCV', '')).ljust(3)} "
|
1351
|
-
f"{str(contact.get('NR', '')).ljust(6)}",
|
1352
|
-
end="\r\n",
|
1353
|
-
file=file_descriptor,
|
1354
|
-
)
|
1355
|
-
print("END-OF-LOG:", end="\r\n", file=file_descriptor)
|
1356
|
-
except IOError as exception:
|
1357
|
-
logger.critical(
|
1358
|
-
"cabrillo: IO error: %s, writing to %s", exception, filename
|
1359
|
-
)
|
1360
|
-
# self.infobox.insertPlainText(" Failed\n\n")
|
1361
|
-
# app.processEvents()
|
1362
|
-
return
|
1363
|
-
# self.infobox.insertPlainText(" Done\n\n")
|
1256
|
+
self.contest.cabrillo(self)
|
1364
1257
|
|
1365
1258
|
|
1366
1259
|
def load_fonts_from_dir(directory: str) -> set:
|
@@ -789,6 +789,7 @@
|
|
789
789
|
<addaction name="actionQRZ_Settings"/>
|
790
790
|
<addaction name="actionConnection_Settings"/>
|
791
791
|
<addaction name="actionGenerate_Cabrillo"/>
|
792
|
+
<addaction name="actionGenerate_ADIF"/>
|
792
793
|
</widget>
|
793
794
|
<widget class="QMenu" name="menuHelp">
|
794
795
|
<property name="title">
|
@@ -930,6 +931,11 @@
|
|
930
931
|
<string>Log Window</string>
|
931
932
|
</property>
|
932
933
|
</action>
|
934
|
+
<action name="actionGenerate_ADIF">
|
935
|
+
<property name="text">
|
936
|
+
<string>Generate ADIF</string>
|
937
|
+
</property>
|
938
|
+
</action>
|
933
939
|
</widget>
|
934
940
|
<resources/>
|
935
941
|
<connections/>
|
@@ -370,6 +370,30 @@ class DataBase:
|
|
370
370
|
)
|
371
371
|
return cursor.fetchone()
|
372
372
|
|
373
|
+
def check_dupe_on_band(self, call, band) -> dict:
|
374
|
+
"""Checks if a call is dupe on band/mode"""
|
375
|
+
with sqlite3.connect(self.database) as conn:
|
376
|
+
conn.row_factory = self.row_factory
|
377
|
+
cursor = conn.cursor()
|
378
|
+
print(
|
379
|
+
f"select count(*) as isdupe from dxlog where Call = '{call}' and Band = '{band}';"
|
380
|
+
)
|
381
|
+
cursor.execute(
|
382
|
+
f"select count(*) as isdupe from dxlog where Call = '{call}' and Band = '{band}';"
|
383
|
+
)
|
384
|
+
return cursor.fetchone()
|
385
|
+
|
386
|
+
def check_dupe(self, call) -> dict:
|
387
|
+
"""Checks if a call is dupe on band/mode"""
|
388
|
+
with sqlite3.connect(self.database) as conn:
|
389
|
+
conn.row_factory = self.row_factory
|
390
|
+
cursor = conn.cursor()
|
391
|
+
print(f"select count(*) as isdupe from dxlog where Call = '{call}';")
|
392
|
+
cursor.execute(
|
393
|
+
f"select count(*) as isdupe from dxlog where Call = '{call}';"
|
394
|
+
)
|
395
|
+
return cursor.fetchone()
|
396
|
+
|
373
397
|
def fetch_points(self) -> dict:
|
374
398
|
"""return points"""
|
375
399
|
with sqlite3.connect(self.database) as conn:
|
File without changes
|