PyScore

001: # -*- python -*-
002: ###### boatinit.py ###### python package PyScore.utility module boatinit ######
003: 
004: # PyScore
005: # a race scoring programme
006: # written by Matt Draisey
007: # 2004 April 6
008: 
009: reloadable=True
010: reloadables=[]
011: 
012: ###### boatinit.py ###### python package PyScore.utility module boatinit ######
013: 
014: import re,cPickle as pickle
015: from relational import base
016: from standing import boatbase,boatconf,confbase,enumstat,eventstat
017: 
018: SPLITTER = re.compile(r"\t+")
019: 
020: ######## ######## list of possible boat entries ######## ########
021: 
022: """
023: sail    boat            boat            boat                    division
024: number  name            type            owner                   fleet   rating
025: """
026: sample_boats_file="""
027: CAN 3   Zamboni         Andrews 26      ZamboniCartel           PHRF A  144
028: 17      Nimue           Mirage 27       Howarth,David           JOG A   186
029: 25      Clewless        S2 6.7          Bowsher,Sarah           PHRF C  207
030: 31      On A Tack       Kirby 30        Blyth,Ken               PHRF A  135
031: CAN 36  Boomerang       B 25            Salter,Mike             PHRF A  138
032: 54      Mai Toi         Mirage 33       Brown,Rene              JOG A   155
033: 56      Breezin         Mirage 30       Layfield,Bob            JOG A   175
034: 93      Azura           Kirby 25        Popel,Ted               PHRF B  177
035: 94      Kiwitea         Mirage 30       Domney,Lyn              JOG A   175
036: 106     Chinook         Mirage 32       Murphy,John             JOG A   169
037: 107     Xanadu          Mirage 25       Hind,Wayne              PHRF C  213
038: 146     Maidstone Cross Mirage 25       O'Brien,Mike            JOG B
039: 147     Skylark         Mirage 35       Halpin,Jim              JOG A
040: 189     Panic           Kirby 25        Mogyorody,Kevin         PHRF B  177
041: 228     Breakaway       Santana 20      Fergusuon,Robby         JOG B
042: 246     Nugget          C&C 25          Soles,Peter             PHRF C  219
043: 275     Dentuso         Shark           Rindlisbacher,Tom       Silver  228
044: 277     Shikasta        Shark           Dawson,Ian              Gold    228
045: 313     Kazz            Mirage 27       Allum,Paul              JOG A   210
046: 330     Dead Ahead      Mirage 24       Arthur,Wesley           JOG B
047: 383     Dream On        C&C 25          Watson,Doug             PHRF C
048: 392     Tia Lisa        Tanzer 7.5      Eagan,Chris             JOG B
049: 478     Katabatic       Shark           Malone,Robert           Silver
050: 543     Aurora          C&C 27 Mark III Richardson,Gord         JOG A
051: 559     Shorething      C&C 30          Shore,Robert            PHRF B
052: 707     Spindrift       Shark           Utley,Brayden           Silver  228
053: 746     Finn McCoul     Shark           Edgley,Frank            Silver  228
054: 915     Stringendo      Shark           Colborne,David          Silver  228
055: 924     Marmoset        Shark           Barlow,Andrew           Gold    228
056: 1009    Scallywagg      Shark           Andrews,Graham          Gold    228
057: 1028    Pursuit         Shark           MacDonald,Frank         Silver  228
058: 1030    Buckaneer       Shark           Buckner,Doug            Silver  228
059: 1037    Spongeworthy    Shark           Regnier,Mo              Gold    228
060: 1038    Invincible      Shark           Lehmann,Vince           Gold    228
061: 1070    Dozer           Shark           Mendoza,Rommel          Silver  228
062: 1829    Megabyte        Shark           Shaw,John               Gold    228
063: 4207    Firewater       C&C 35          Hellenbart,Andy         PHRF A
064: 5872    Alcoholics Alluvus      Columbia 26     Giles,Scott     PHRF C
065: 5964    No Resistance   HR 25           Robichaud,David         PHRF C  234
066: 14091   Ruffian         C&C 35          Noakes,Bill             PHRF A  126
067: 15587   Dynamo Hummm    C&C 30          Davidson,Joe            PHRF B  171
068: 15775   Escapade        C&C 25          Illi,Ted                PHRF C  216
069: 15898   Cirrus          Morgan 27       Beaumont,Chuck          JOG A
070: 25512   Risky Business  S2 9.1          Stridiron,Bill          PHRF A
071: 34433   Sorceress       X               Gispen,Bill             PHRF A  114
072: 64178   Addendum        C&C 30          Fuller,Bob              PHRF B  171
073: """.splitlines()[1:]
074: 
075: ######## ######## ######## list of class defaults ######## ######## ########
076: 
077: series="Summer"
078: 
079: classes_defaults_file=("""
080: PHRF A          Fleet
081: PHRF A          Casual
082: PHRF A          
083: PHRF B          Fleet
084: PHRF B          Casual
085: PHRF B          
086: JOG A           Fleet
087: JOG A           Casual
088: JOG A           
089: JOG B           Fleet
090: JOG B           Casual
091: JOG B           
092: Shark           Gold Fleet
093: Shark           Silver Fleet
094: Shark           Casual
095: Shark           
096: """).splitlines()[1:]
097: 
098: ######## ######## create lists for the models ######## ########
099: 
100: sample_boats_master_list=[
101:     (tuple(SPLITTER.split(s,5))+("",)*5)[:6]
102:     for s in sample_boats_file
103: ]
104: sample_boats_tab=[b[0:4] for b in sample_boats_master_list]
105: sample_boats_class=[]
106: for b in sample_boats_master_list:
107:     if b[4] in ["Silver","Gold"]:
108:         division="Shark"
109:         fleet="Series "+b[4]
110:         rating=b[5]
111:     elif b[4]:
112:         division=b[4]
113:         fleet="Series"
114:         rating=b[5]
115:     else:
116:         division=""
117:         fleet="Casual"
118:         rating=""
119:     sample_boats_class.append([(division,fleet,rating)]) # a singleton list
120: classes_defaults_tab=[tuple(SPLITTER.split(s,1)) for s in classes_defaults_file]
121: 
122: ######## ######## ######## create relations ######## ######## ########
123: 
124: dumper=boatbase.BoatConfBase()
125: dumper.classes_defaults_tab=classes_defaults_tab
126: 
127: S1R1=eventstat.RACENAMES[0]
128: 
129: for b in sample_boats_master_list:
130:     boatid=boatconf.BoatIdentificationEntry(*b[:4])
131:     dumper.boidlist.append(boatid)
132:     if b[4] in ["Silver","Gold"]:
133:         sharkcert=boatconf.CertificationEntry(
134:             boatid,"CSCA","CSCA",False,True,228
135:         )
136:         dumper.certlist.append(sharkcert)
137: 
138:         seriesflconf=boatconf.FleetConfigurationEntry(
139:             sharkcert,
140:             eventstat.DivisionName.SHARK,
141:             "Series "+b[4],
142:             {
143:                 "Gold":enumstat.FleetEnum.SERIES,
144:                 "Silver":enumstat.FleetEnum.SILVER,
145:             }[b[4]],
146:         )
147:         dumper.flcolist.append(seriesflconf)
148:         dumper.regilist.append(
149:             boatconf.RegistrationEntry(
150:                 seriesflconf,"Championship from S1R1",championshipfrom=S1R1,
151:             )
152:         )
153: 
154:         casualflconf=boatconf.FleetConfigurationEntry(
155:             sharkcert,
156:             eventstat.DivisionName.SHARK,
157:             "Casual One-design",
158:             enumstat.FleetEnum.CASUAL,
159:         )
160:         dumper.flcolist.append(casualflconf)
161:         dumper.regilist.append(
162:             boatconf.RegistrationEntry(
163:                 casualflconf,"Implicit from S1R1",implicitfrom=S1R1,
164:             )
165:         )
166:     elif b[4]:
167:         jog=b[4].startswith("JOG")
168:         if jog:
169:             certname="ECPHRF JOG"
170:         else:
171:             certname="ECPHRF Base"
172:         ecphrfcert=boatconf.CertificationEntry(
173:             boatid,certname,"ECPHRF",jog,False,b[5]
174:         )
175:         dumper.certlist.append(ecphrfcert)
176: 
177:         seriesflconf=boatconf.FleetConfigurationEntry(
178:             ecphrfcert,eventstat.DivisionName(b[4]),
179:             "Series",enumstat.FleetEnum.SERIES,
180:         )
181:         dumper.flcolist.append(seriesflconf)
182:         dumper.regilist.append(
183:             boatconf.RegistrationEntry(
184:                 seriesflconf,"Championship from S1R1",championshipfrom=S1R1,
185:             )
186:         )
187: 
188:         casualflconf=boatconf.FleetConfigurationEntry(
189:             ecphrfcert,eventstat.DivisionName(b[4]),
190:             "Casual",enumstat.FleetEnum.CASUAL,
191:         )
192:         dumper.flcolist.append(casualflconf)
193:         dumper.regilist.append(
194:             boatconf.RegistrationEntry(
195:                 casualflconf,"Implicit from S1R1",implicitfrom=S1R1,
196:             )
197:         )
198:     else:
199:         assert False
200: 
201: dumper.sort_lists()
202: 
203: def dumpconf(boatfile):
204:     boatfile.seek(0)
205:     dumper.print_base(boatfile)
206:     boatfile.truncate()
207: 
208: ######## ######## declare and populate lists for the models ######## ########
209: 
210: sample_boats_tab=[]
211: sample_boats_class=[]
212: classes_defaults_tab=[]
213: 
214: COLON=re.compile(r""":""")
215: 
216: def populate(configfile):
217:     from standing import boatconf
218:     boater=boatbase.BoatConfBase()
219:     try:
220:         boater.load_hierarchy(configfile)
221:     except (IOError,EOFError,ValueError):
222:         pass
223:     else:
224:         for (boid,certifications) in boater.flcolist.adjoin_hierarchy(
225:             [("cert",lambda e,c: confbase.objectify(c.boid)),"cert"]
226:         ):
227:             sample_boats_tab.append((
228:                 boid.sailnumber,boid.boatname,boid.makeofboat,boid.boatowner,
229:             ))
230:             configurations=[]
231:             for (cert,fleetconfigs) in certifications:
232:                 assert cert.boid is boid[0]
233:                 rating=str(cert.rating)
234:                 for fleetconfig in fleetconfigs:
235:                     assert fleetconfig.cert==cert
236:                     configurations.append((
237:                         str(fleetconfig.division),fleetconfig.coname,rating,
238:                     ))
239:             sample_boats_class.append(configurations)
240:         classes_defaults_tab.extend(
241:             [tuple(SPLITTER.split(s,1)) for s in classes_defaults_file]
242:         )
243:     #boater.print_vv_configurations_for_race(S1R1)
244:     boater.boat_identifications_fleet_configurations_for_race(S1R1)
245: 
246: ######## ######## new interface to lists for the models ######## ########
247: 
248: def certified_boats_tab():
249:     return sample_boats_tab
250: 
251: def certified_boats_class(zipnum):
252:     return sample_boats_class[zipnum]
253: 
254: def certified_classes_defaults_tab():
255:     return classes_defaults_tab
256: 
257: ######## ######## load and save relations from file ######## ########
258: 
259: boater=boatbase.BoatConfBase()
260: 
261: def loadconf(boatfile):
262:     try:
263:         boater.load_hierarchy(boatfile)
264:     except (IOError,EOFError,ValueError):
265:         pass
266: 
267: ###### boatinit.py ###### python package PyScore.utility module boatinit ######