Skip to content

Commit

Permalink
Release v3.1.42-20240226141745
Browse files Browse the repository at this point in the history
  • Loading branch information
esitarski committed Feb 26, 2024
2 parents 3e4904e + 8ac3eb2 commit d199009
Show file tree
Hide file tree
Showing 9 changed files with 1,226 additions and 9 deletions.
9 changes: 5 additions & 4 deletions MainWin.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
from RiderDetail import RiderDetail
from Results import Results
from Categories import Categories, PrintCategories
from Properties import Properties, PropertiesDialog, ChangeProperties, ApplyDefaultTemplate, BatchPublishPropertiesDialog, doBatchPublish
from Properties import Properties, PropertiesDialog, ChangeProperties, HasDefaultTemplate, ApplyDefaultTemplate, BatchPublishPropertiesDialog, doBatchPublish
from Recommendations import Recommendations
from RaceAnimation import RaceAnimation
from Search import SearchDialog
Expand Down Expand Up @@ -2735,7 +2735,8 @@ def menuNew( self, event ):
race.excelLink = excelLink

dlg = PropertiesDialog(self, title=_('Configure Race'), style=wx.DEFAULT_DIALOG_STYLE )
ApplyDefaultTemplate( race )
if HasDefaultTemplate() and Utils.MessageYesNo(self, _("Apply Default Template?"), _("Apply Default Template?")):
ApplyDefaultTemplate( race )
race.minutes = 60 # Ensure we start with a reasonable race minutes.
dlg.properties.refresh()
ret = dlg.ShowModal()
Expand Down Expand Up @@ -2920,7 +2921,8 @@ def openRaceDBExcel( self, fname, overwriteExisting=True ):
Model.newRace()
race = Model.race
race.lastOpened = now()
ApplyDefaultTemplate( race )
if HasDefaultTemplate() and Utils.MessageYesNo(self, _("Apply Default Template?"), _("Apply Default Template?")):
ApplyDefaultTemplate( race )

# Create the link to the RaceDB excel sheet.
try:
Expand Down Expand Up @@ -3275,7 +3277,6 @@ def menuSimulate( self, event=None, userConfirm=True, isTimeTrial=False ):
race.raceNum = 1
race.organizer = 'Edward Sitarski'
race.memo = ''
ApplyDefaultTemplate( race )

race.simulation = True # Flag this as a simulation race.
#race.setNoDataDNS = True # Show all entries in the spreadsheet as NP or DNS.
Expand Down
10 changes: 7 additions & 3 deletions Properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -1709,17 +1709,21 @@ def ChangeProperties( parent ):

except (NameError, AttributeError, TypeError):
pass


def HasDefaultTemplate():
return os.path.isfile( os.path.join( GetTemplatesFolder(), 'default.cmnt' ) )

def ApplyDefaultTemplate( race ):
if not race:
return
return False
fname = os.path.join( GetTemplatesFolder(), 'default.cmnt' )
template = Template.Template()
try:
template.read( fname )
except Exception:
return
return False
template.toRace( race )
return True

if __name__ == '__main__':
race = Model.newRace()
Expand Down
1 change: 1 addition & 0 deletions SeriesMgr/Dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import ModuleUnpickler
import GetMatchingExcelFile
import ReorderableGrid
import SetNoDataDNS
import SetGraphic
import imagebrowser
import scramble
Expand Down
44 changes: 44 additions & 0 deletions SeriesMgr/SetNoDataDNS.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import Utils
import Model

def SetNoDataDNS():
race = Model.race
if not race or not race.setNoDataDNS:
return

try:
externalInfo = race.excelLink.read()
except Exception:
return

Finisher, DNS, NP = Model.Rider.Finisher, Model.Rider.DNS, Model.Rider.NP

isChanged = False

if race.isRunning():
race.fixedRaceFinishDNS = False
for num in externalInfo.keys():
rider = race.getRider( num )
if rider.status == NP:
if rider.times:
rider.status = Finisher
isChanged = True
elif rider.status == Finisher:
if not rider.times:
rider.status = NP
isChanged = True

elif race.isFinished():
if not getattr(race, 'fixedRaceFinishDNS', False):
race.fixedRaceFinishDNS = True
for num in externalInfo.keys():
rider = race.getRider( num )
if rider.status == NP:
rider.status = Finisher if rider.times else DNS
isChanged = True

elif race.isUnstarted():
race.fixedRaceFinishDNS = False

if isChanged:
race.setChanged()
65 changes: 65 additions & 0 deletions SeriesMgr/SetRangeMerge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from random import randint

def SetRangeMerge( sets ):
'''
The sets parameter is a list of either a python set (if mutable) or a frozenset (if immutable).\
Immutable sets correspond to Wave categories with no Components.
Elements in the sets must be numbers.
'''
if not sets:
return []

# Ensure that shared elements are matched in sequence from the first set to last set.
numberSets = []
previousElements = set()
for s in sets:
numberSets.append( s - previousElements )
previousElements |= numberSets[-1]

def inConflict( first, last, i ):
''' Check if the proposed range is in conflict with any other set. '''
rngSet = set( range(first, last+1) )
return not all( j == i or rngSet.isdisjoint(numSet) for j, numSet in enumerate(numberSets) )

numberRanges = []
for iNumberSet, numberSet in enumerate(numberSets):
numberRange = []
if isinstance(sets[iNumberSet], frozenset):
# For frozen sets, just convert consecutive numbers to ranges. Don't check between sets.
numberList = sorted( sets[iNumberSet] )
if numberList:
numberRange.append( (numberList[0], numberList[0]) )
for n in numberList[1:]:
if n == numberRange[-1][1] + 1:
numberRange[-1] = (numberRange[-1][0], n)
else:
numberRange.append( (n,n) )
else:
# Build the largest ranges that don't conflict with any other set.
numberList = sorted( numberSet )
iFirst = iLast = 0
while iFirst < len(numberList):
while iLast < len(numberList) and not inConflict(numberList[iFirst], numberList[iLast], iNumberSet):
iLast += 1
numberRange.append( (numberList[iFirst], numberList[iLast-1]) )
iFirst = iLast
numberRanges.append( numberRange )

return numberRanges

def RangeToStr( r ):
return ','.join( str(first) if first == last else '{}-{}'.format(first, last) for first, last in r )

def RangeToSet( r ):
return set().union( *[range(first, last+1) for first, last in r] ) if r else set()

if __name__ == '__main__':
sets = [
set(randint(101,200) for i in range(50)),
frozenset(randint(151,250) for i in range(50)),
set(randint(201,300) for i in range(50)),
set(randint(301,400) for i in range(50)),
set(randint(401,500) for i in range(50)),
]
for r in SetRangeMerge(sets) :
print( RangeToStr(r) )
Loading

0 comments on commit d199009

Please sign in to comment.