Skip to content

Commit e15b99c

Browse files
committed
Added checks for detecting 'dupplicate qsos'
1 parent 1bcb7d4 commit e15b99c

File tree

1 file changed

+44
-23
lines changed

1 file changed

+44
-23
lines changed

edi.py

+44-23
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,10 @@ def generic_qso_validator(self):
660660
self.errors.append((self.line_nr, 'Qso WWL is invalid: {}'.format(self.qso_fields['wwl'])))
661661

662662
# validate 'duplicate_qso' format
663-
# TODO
663+
if self.qso_fields['duplicate_qso'].upper() == 'D':
664+
self.valid = False
665+
self.errors.append((self.line_nr, 'Qso marked as dupplicate'))
666+
664667
return None
665668

666669
def rules_based_qso_validator(self):
@@ -694,7 +697,31 @@ def rules_based_qso_validator(self):
694697
'Qso hour is invalid: after contest end hour (>{})'.format(self.rules.contest_end_hour)))
695698

696699
# validate date & hour based on period
700+
inside_period, _ = self.qso_inside_period()
701+
702+
if not inside_period:
703+
self.valid = False
704+
self.errors.append((self.line_nr,
705+
'Qso date/hour is invalid: not inside contest periods'))
706+
707+
# validate qso mode
708+
if int(self.qso_fields['mode']) not in self.rules.contest_qso_modes:
709+
self.valid = False
710+
self.errors.append((self.line_nr,
711+
'Qso mode is invalid: not in defined modes ({})'.format(self.rules.contest_qso_modes)))
712+
return None
713+
714+
def qso_inside_period(self):
715+
"""
716+
:return: True, period_number
717+
False, None
718+
"""
697719
inside_period = False
720+
inside_period_nr = None
721+
722+
if not self.rules or self.valid is False:
723+
return inside_period, inside_period_nr
724+
698725
for period in range(1, self.rules.contest_periods_nr + 1):
699726
# if date is not in period, check next period
700727
if not (self.rules.contest_period(period)['begindate'][2:] <= self.qso_fields['date'] <= self.rules.contest_period(period)['enddate'][2:]):
@@ -705,30 +732,24 @@ def rules_based_qso_validator(self):
705732
# if period is in same day
706733
if delta_days == timedelta(0) and self.rules.contest_period(period)['beginhour'] <= self.qso_fields['hour'] <= self.rules.contest_period(period)['endhour']:
707734
inside_period = True
735+
inside_period_nr = period
708736
break
709737
# if period is in multiple days
710738
elif delta_days > timedelta(0):
711739
if self.rules.contest_period(period)['begindate'][2:] == self.qso_fields['date'] and self.rules.contest_period(period)['beginhour'] <= self.qso_fields['hour']:
712740
inside_period = True
741+
inside_period_nr = period
713742
break
714743
if self.qso_fields['date'] == self.rules.contest_period(period)['enddate'][2:] and self.qso_fields['hour'] <= self.rules.contest_period(period)['endhour']:
715744
inside_period = True
745+
inside_period_nr = period
716746
break
717747
# if begin_period < qso_date < end_period
718748
if self.rules.contest_period(period)['begindate'][2:] < self.qso_fields['date'] < self.rules.contest_period(period)['enddate'][2:]:
719749
inside_period = True
750+
inside_period_nr = period
720751
break
721-
if not inside_period:
722-
self.valid = False
723-
self.errors.append((self.line_nr,
724-
'Qso date/hour is invalid: not inside contest periods'))
725-
726-
# validate qso mode
727-
if int(self.qso_fields['mode']) not in self.rules.contest_qso_modes:
728-
self.valid = False
729-
self.errors.append((self.line_nr,
730-
'Qso mode is invalid: not in defined modes ({})'.format(self.rules.contest_qso_modes)))
731-
return None
752+
return inside_period, inside_period_nr
732753

733754

734755
class LogException(Exception):
@@ -800,11 +821,10 @@ def crosscheck_logs(operator_instances, rules, band_nr):
800821
:return: TODO
801822
"""
802823
for callsign1, ham1 in operator_instances.items():
803-
# print('CHECK LOGS OF : ', callsign1, ham1.callsign)
804-
824+
# set a list for this ham with already made contacts
825+
_had_qso_with = []
805826
# get logs for band
806827
_logs1 = ham1.logs_by_band_regexp(rules.contest_band(band_nr)['regexp'])
807-
# print(' LOG PATH : ', [x.path for x in _logs1])
808828

809829
if not _logs1:
810830
continue
@@ -821,20 +841,21 @@ def crosscheck_logs(operator_instances, rules, band_nr):
821841
if qso1.confirmed is True:
822842
continue
823843

824-
# TODO : ignore duplicate qso (with flag)
825-
# TODO : check if this qso is present multiple times here in same period
826-
# and in other ham log to avoid 'dupplicate hacks'
827-
828844
# check if we have some logs from 2nd ham
829845
callsign2 = qso1.qso_fields['call']
830846
ham2 = operator_instances.get(callsign2, None)
831847
if not ham2:
832848
qso1.confirmed = False
833849
continue
834850

851+
# validate that this qso wasn't already validated
852+
_, inside_period_nr = qso1.qso_inside_period()
853+
if '{}-period{}'.format(callsign2, inside_period_nr) in _had_qso_with:
854+
qso1.confirmed = False
855+
continue
856+
835857
# check if we have proper band logs from 2nd ham
836858
_logs2 = ham2.logs_by_band_regexp(rules.contest_band(band_nr)['regexp'])
837-
# print(' HAM2 LOGS : ', [x.path for x in _logs2])
838859
if not _logs2:
839860
qso1.confirmed = False
840861
continue
@@ -845,8 +866,6 @@ def crosscheck_logs(operator_instances, rules, band_nr):
845866
if qso2.valid is False:
846867
continue
847868

848-
# TODO : ignore duplicate qso
849-
850869
_callsign = qso2.qso_fields['call']
851870
if callsign1 != _callsign:
852871
continue
@@ -855,9 +874,11 @@ def crosscheck_logs(operator_instances, rules, band_nr):
855874
except ValueError as e:
856875
qso1.errors.append(e)
857876

858-
# print(' *** COMPARAM : {} vs {} SI {} cu {} = {}'.format(callsign1, callsign2, qso1.qso_line, qso2.qso_line, distance))
859877
if distance < 0:
860878
continue
879+
# add this qso in _had_qso_with list
880+
_, inside_period_nr = qso2.qso_inside_period()
881+
_had_qso_with.append('{}-period{}'.format(callsign2, inside_period_nr))
861882
qso1.points = distance * int(rules.contest_band(band_nr)['multiplier'])
862883
qso1.confirmed = True
863884

0 commit comments

Comments
 (0)