001:
002:
003:
004:
005:
006:
007:
008:
009: reloadables=[]
010:
011:
012:
013: import re
014: from relational import base
015: from standing import boatconf,confbase,enumstat,eventstat
016: from tabulate import enumcond
017:
018:
019:
020: class SheetEntry(confbase.ConfValueEntry):
021:
022:
023: class SheetList(base.ValueListable,list,base.Joint):
024:
025:
026: def apply_to_race_named(func,racename,handicapsheet,*p,**pp):
027: def hasracename(race):
028: if race.racename==racename: return race
029: else: raise AttributeError
030: for (race,handicapentries) in handicapsheet.adjoin_hierarchy([(
031: "start",
032: lambda entry,start: hasracename(start.race),
033: lambda entry: hasracename(entry.race)
034: )]):
035: handicaprace=SheetList(handicapentries)
036: func(race,handicaprace,*p,**pp)
037:
038: def apply_to_all_races(func,handicapsheet,*p,**pp):
039: for (race,handicapentries) in handicapsheet.adjoin_hierarchy([(
040: "start",lambda entry,start: start.race,lambda entry: entry.race
041: )]):
042: handicaprace=SheetList(handicapentries)
043: func(race,handicaprace,*p,**pp)
044:
045: class SheetDict(dict):
046:
047:
048: def values(self):
049: return SheetList(dict.values(self))
050:
051: def items(self):
052: return SheetList(dict.items(self))
053:
054:
055:
056: class RaceSheetEntry(SheetEntry):
057:
058:
059:
060:
061:
062:
063: def __init__(self,racename):
064:
065: assert isinstance(racename,eventstat.RaceName)
066: self.racename=racename
067:
068:
069: self.entuple=(racename,)
070:
071: class StartSheetEntry(SheetEntry):
072:
073:
074:
075:
076:
077:
078: def __init__(self,race,divisionname):
079:
080: assert isinstance(race,RaceSheetEntry)
081: self.race=race
082:
083: assert isinstance(divisionname,eventstat.DivisionName)
084: self.divisionname=divisionname
085:
086: try:
087: self.levelracing=divisionname.levelracing
088: except AttributeError:
089: pass
090:
091: try:
092: self.levelrating=divisionname.levelrating
093: except AttributeError:
094: pass
095:
096:
097: self.entuple=(race,divisionname,)
098:
099:
100: class HandicapSheetEntry(SheetEntry):
101:
102:
103:
104:
105:
106:
107: HMSre=re.compile(r"""^(\d{2}):(\d{2}):(\d{2})$""")
108:
109: def __init__(self,race,startnew,en,bs,bn,fc,ft,cd,cf,cr,ps):
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126: assert isinstance(race,RaceSheetEntry)
127:
128: try:
129: zdivisionname=eventstat.DivisionName(cd,strict=True)
130: except ValueError:
131: zdivisionname=eventstat.DivisionName.UNKNOWN
132: self.race=race
133: else:
134: self.start=startnew(zdivisionname)
135:
136: self.boat=boatconf.BoatIdentificationEntry(bs,bn)
137: self.fleet=enumstat.FleetEnum(cf)
138: try:
139: zrating=int(cr)
140: self.rating=zrating
141: self.ziprating=(0,zrating)
142: except ValueError:
143: try:
144: zrating=zdivisionname.levelrating
145: self.rating=zrating
146: self.ziprating=(1,zrating)
147: except AttributeError:
148: zrating="?"
149: self.ziprating=(2,)
150: self.finishcondition=enumcond.FinishCondEnum(fc)
151: tmatch=self.HMSre.match(ft)
152: if tmatch:
153: zfinishhms=tuple([int(dd) for dd in tmatch.groups()])
154: self.finishhms=zfinishhms
155: self.zipfinishhms=(0,zfinishhms)
156: else:
157: zfinishhms=()
158: self.zipfinishhms=(1,)
159: self.entrynumber=en
160: self.comment=ps
161:
162:
163: self.entuple=(race,zdivisionname,self.boat,)
164:
165:
166: class OverrideSheetEntry(SheetEntry):
167:
168:
169:
170:
171:
172: def __init__(self,race,startnew,en,bs,bn,cd,cf,sf,ss,sc,sw,ps):
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188: assert isinstance(race,RaceSheetEntry)
189:
190: try:
191: zdivisionname=eventstat.DivisionName(cd,strict=True)
192: except ValueError:
193: zdivisionname=eventstat.DivisionName.UNKNOWN
194: self.race=race
195: else:
196: self.start=startnew(zdivisionname)
197:
198: self.boat=boatconf.BoatIdentificationEntry(bs,bn)
199: self.fleet=enumstat.FleetEnum(cf)
200: self.entrynumber=en
201: self.scorecondition=enumcond.ScoreCondEnum(sf)
202: try:
203: self.finishcondition=enumcond.FinishCondEnum(
204: sf,strict=True
205: )
206: except ValueError:
207: self.finishcondition=enumcond.FinishCondEnum.DNC
208: try:
209: self.seriespoints=round(float(ss),1)
210: except ValueError:
211: pass
212: else:
213: self.starter=False
214: try:
215: self.casualpoints=int(sc)
216: self.casualweight=int(sw)
217: except ValueError:
218: pass
219: else:
220: self.starter=False
221: self.comment=ps
222:
223:
224: self.entuple=(race,zdivisionname,self.boat,)
225:
226:
227: class RCSheetEntry(SheetEntry):
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238: def __init__(self,race,bs,bn,ps):
239:
240:
241:
242:
243:
244:
245:
246:
247:
248: assert isinstance(race,RaceSheetEntry)
249:
250: self.race=race
251: self.boat=boatconf.BoatIdentificationEntry(bs,bn)
252: self.comment=ps
253:
254:
255: self.entuple=(race,self.boat,)
256:
257:
258: