PyScore

001: # -*- python -*-
002: #### dataframes.py #### python package PyScore.register module dataframes ####
003: 
004: # PyScore
005: # a race scoring programme
006: # written by Matt Draisey
007: # 2004 April 6
008: 
009: #### dataframes.py #### python package PyScore.register module dataframes ####
010: 
011: import datetime
012: import gtk
013: from register import basetree
014: 
015: ######## ######## ######## dates ######## ######## ########
016: 
017: datebase=datetime.date(2005,05,18)
018: 
019: ######## ######## ######## initialize the tree models ######## ######## ########
020: 
021: def init_boids_model(pages):
022:     filteredmodel=basetree.model.filter_new()
023:     filteredmodel.set_visible_column(0)
024:     for page in pages:
025:         page.boids.model=filteredmodel
026:         page.boids.view.set_model(filteredmodel)
027: 
028: def init_bcfrs_model(page):
029:     filteredmodel=basetree.model.filter_new()
030:     page.bcfrs.model=filteredmodel
031:     page.bcfrs.view.set_model(filteredmodel)
032:     #page.bcfrs.view.expand_all()
033: 
034: ######## ######## ######## the entry interface ######## ######## ########
035: 
036: def list_details(page,depth,nodetree,rref=None):
037:         if rref<>None:
038:                 filteredmodel=basetree.model.filter_new(root=rref.get_path())
039:                 filteredmodel.set_visible_column(depth)
040:                 nodetree.model=filteredmodel
041:                 nodetree.view.set_model(filteredmodel)
042:                 if len(filteredmodel):
043:                         nodetree.view.set_cursor((0,))
044:                 else:
045:                         clear_at_depth(page,depth)
046:         else:
047:                 nodetree.model=None
048:                 nodetree.view.set_model()
049:                 clear_at_depth(page,depth)
050: 
051: ######## ######## ######## load data frames ######## ######## ########
052: 
053: #class TreesController(object):
054: 
055: def clear_at_depth(page,depth):
056:         if depth==0:
057:                 clear_boat_identification(page)
058:         elif depth==1:
059:                 clear_certification(page)
060:         elif depth==2:
061:                 clear_fleet_configuration(page)
062:         else:
063:                 clear_registration(page)
064: 
065: def load_at_depth(page,depth,rref):
066:         if depth==0:
067:                 load_boat_identification(page,rref)
068:         elif depth==1:
069:                 load_certification(page,rref)
070:         elif depth==2:
071:                 load_fleet_configuration(page,rref)
072:         else:
073:                 load_registration(page,rref)
074: 
075: def clear_boat_identification(page):
076:         assert page.pagename in ["detail"]
077: 
078:         for frame in page.boid.frames: frame.set_sensitive(False)
079:         page.boid.check.set_inconsistent(True)
080:         page.boid.treeref=None
081: 
082:         page.boid.box[0].set_text("")
083:         page.boid.box[1].set_text("")
084:         page.boid.box[2].set_text("")
085:         page.boid.box[3].set_text("")
086: 
087:         list_details(page,1,page.certs)
088: 
089: def load_boat_identification(page,rref):
090:         assert page.pagename in ["detail"]
091: 
092:         path=rref.get_path()
093:         depth=len(path)-1
094:         assert depth==0
095: 
096:         page.boid.treeref=None
097: 
098:         (bx,b1,b2,b3,b4)=basetree.model.get(
099:         basetree.model.get_iter(path),
100:         7,10,11,12,13,
101:     )
102:         page.boid.check.set_active(not bx)
103:         page.boid.box[0].set_text(b1)
104:         page.boid.box[1].set_text(b2)
105:         page.boid.box[2].set_text(b3)
106:         page.boid.box[3].set_text(b4)
107: 
108:         page.boid.treeref=rref
109:         page.boid.check.set_inconsistent(False)
110:         for frame in page.boid.frames: frame.set_sensitive(True)
111: 
112:         list_details(page,1,page.certs,rref)
113: 
114: def clear_certification(page):
115:         assert page.pagename in ["detail"]
116: 
117:         for frame in page.cert.frames: frame.set_sensitive(False)
118:         page.cert.check.set_inconsistent(True)
119:         page.cert.treeref=None
120: 
121:         page.cert.box[0].set_text("")
122:         page.cert.radio[0].set_active(True)
123:         page.cert.box[1].set_text("")
124:         page.cert.box[2].set_text("0")
125: 
126:         list_details(page,2,page.flcos)
127: 
128: def load_certification(page,rref):
129:         assert page.pagename in ["browse","detail"]
130: 
131:         path=rref.get_path()
132:         depth=len(path)-1
133:         assert depth==1
134: 
135:         page.cert.treeref=None
136: 
137:         #(c1,c2,c3,c4,c5)=basetree.model[path][10:15] doesn't work yet
138:         i=basetree.model.get_iter(path)
139:         (cx,c1,c2,c3,c4,c5)=basetree.model.get(i,7,10,11,12,13,14)
140:         if page.pagename in ["detail"]:
141:                 page.cert.check.set_active(not cx)
142:         authorityd=dict([
143:                 (a.upper(),k)
144:                 for (k,(a,)) in enumerate(page.cert.combo.get_model())
145:         ])
146:         try:
147:                 page.cert.combo.set_active(authorityd[c2.upper()])
148:         except KeyError:
149:                 page.cert.box[0].set_text(c2)
150:         if c5&2:
151:                 page.cert.radio[2].set_active(True)
152:         elif c5&1:
153:                 page.cert.radio[1].set_active(True)
154:         else:
155:                 page.cert.radio[0].set_active(True)
156:         page.cert.box[0].set_text(c3)
157:         try:
158:                 rating=int(c4)
159:         except ValueError:
160:                 rating=0
161:                 page.cert.box[1].set_text("")
162:                 page.cert.box[2].set_text("0")
163:         else:
164:                 page.cert.box[1].set_text(str(rating))
165:                 page.cert.box[2].set_text(str(rating%3))
166: 
167:         page.cert.treeref=rref
168:         if page.pagename in ["detail"]:
169:                 page.cert.check.set_inconsistent(False)
170:                 for frame in page.cert.frames: frame.set_sensitive(True)
171: 
172:         list_details(page,2,page.flcos,rref)
173: 
174: def clear_fleet_configuration(page):
175:         assert page.pagename in ["detail"]
176: 
177:         for frame in page.flco.frames: frame.set_sensitive(False)
178:         page.flco.check.set_inconsistent(True)
179:         page.flco.treeref=None
180: 
181:         page.flco.combo[0].set_active(0)
182:         page.flco.box[0].set_text("")
183:         page.flco.box[1].set_text("")
184:         page.flco.box[2].set_text("")
185:         page.flco.box[3].set_text("0")
186: 
187:         list_details(page,3,page.regis)
188: 
189: def load_fleet_configuration(page,rref):
190:         assert page.pagename in ["detail"]
191: 
192:         path=rref.get_path()
193:         depth=len(path)-1
194:         assert depth==2
195: 
196:         page.flco.treeref=None
197: 
198:         #(f1,f2,f3,f4,)=basetree.model[path][10:14] doesn't work yet
199:         i=basetree.model.get_iter(path)
200:         (fx,f1,f2,f3,f4)=basetree.model.get(i,7,10,11,12,13)
201:         if page.pagename in ["detail"]:
202:                 page.flco.check.set_active(not fx)
203:         divisiond=dict([
204:                 (d.upper(),k)
205:                 for (k,(d,)) in enumerate(page.flco.combo[0].get_model())
206:         ])
207:         try:
208:                 page.flco.combo[0].set_active(divisiond[f1.upper()])
209:         except KeyError:
210:                 pass
211:         fleetd=dict([
212:                 (c.upper(),k)
213:                 for (k,(c,)) in enumerate(page.flco.combo[1].get_model())
214:         ])
215:         try:
216:                 page.flco.combo[1].set_active(fleetd[f2.upper()])
217:         except KeyError:
218:                 page.flco.box[0].set_text(f3)
219:         try:
220:                 deltarating=int(f4)
221:         except ValueError:
222:                 deltarating=0
223:         if deltarating:
224:                 page.flco.box[1].set_text(str(deltarating))
225:         else:
226:                 page.flco.box[1].set_text("")
227:         c4=basetree.model.get_value(basetree.model.iter_parent(i),13)
228:         try:
229:                 rating=int(c4)+deltarating
230:         except ValueError:
231:                 rating=0
232:                 page.flco.box[2].set_text("")
233:                 page.flco.box[3].set_text("0")
234:         else:
235:                 page.flco.box[2].set_text(str(rating))
236:                 page.flco.box[3].set_text(str(rating%3))
237: 
238:         page.flco.treeref=rref
239:         page.flco.check.set_inconsistent(False)
240:         for frame in page.flco.frames: frame.set_sensitive(True)
241: 
242:         list_details(page,3,page.regis,rref)
243: 
244: def clear_registration(page):
245:         assert page.pagename in ["detail"]
246: 
247:         if page.pagename in ["detail"]:
248:                 for frame in page.regi.frames: frame.set_sensitive(False)
249:                 page.regi.check.set_inconsistent(True)
250:         page.regi.treeref=None
251: 
252:         page.regi.combo[0].set_active(0)
253:         page.regi.combo[1].set_active(0)
254:         page.regi.radio[0].set_active(True)
255:         #for k in range(0,4):
256:         #       regi.radio[k].set_inconsistent(True)
257:         page.regi.box.set_text(datebase.strftime("%a, %Y %b %d"))
258:         
259: 
260: def load_registration(page,rref):
261:         assert page.pagename in ["detail"]
262: 
263:         path=rref.get_path()
264:         depth=len(path)-1
265:         assert depth==3
266: 
267:         page.regi.treeref=None
268: 
269:         #(r1,r2,r3,r4,r5)=basetree.model[path][10:15] doesn't work yet
270:         i=basetree.model.get_iter(path)
271:         (rx,r1,r2,r3,r4,r5)=basetree.model.get(i,7,10,11,12,13,14)
272:         if page.pagename in ["detail"]:
273:                 page.regi.check.set_active(not rx)
274:         (series,race)=(int(r3)-1,int(r4)-1)
275:         page.regi.combo[0].set_active(int(r3)-1)
276:         page.regi.combo[1].set_active(int(r4)-1)
277:         #for k in range(0,4):
278:         #       regi.radio[k].set_inconsistent(False)
279:         page.regi.radio[int(r5)].set_active(True)
280:         date=datebase+datetime.timedelta(weeks=series*6+race)
281:         page.regi.box.set_text(date.strftime("%a, %Y %b %d"))
282: 
283:         title=boid_title_from_input(page)
284:         page.boid.label.set_text("'%s'"%(title,))
285: 
286: 
287:         page.regi.treeref=rref
288:         page.regi.check.set_inconsistent(False)
289:         for frame in page.regi.frames: frame.set_sensitive(True)
290: 
291: ######## ######## ######## extract from data frames ######## ######## ########
292: 
293: def boid_title_from_input(page):
294:         return ":".join([page.boid.box[k].get_text().strip() for k in [0,1]])
295: 
296: def cert_set_valid_authorities(page):
297:         pass
298: 
299: def cert_title_from_input(page):
300:         a,r=[page.cert.box[k].get_text() for k in [0,1]]
301:         for k,radiobutton in enumerate(page.cert.radio):
302:                 if radiobutton.get_active(): break
303:         if k==0:
304:                 if a: return '%s Base %s'%(a,r)
305:                 else: return ''
306:         elif k==1:
307:                 if a: return '%s JOG %s'%(a,r)
308:                 else: return ''
309:         else: #if k==2:
310:                 if a: return '%s One-design'%a
311:                 else: return ''
312: 
313: def flco_title_from_input(page):
314:         d={
315:                 0:'PHRF A',1:'PHRF B',2:'PHRF C',
316:                 3:'JOG A',4:'JOG B',5:'Shark',-1:'Unknown',
317:         }[page.flco.combo[0].get_active()]
318:         k=page.flco.combo[1].get_active()
319:         if k<>-1:
320:                 return {0:'%s:Series',1:'%s:Series Silver',2:'%s:Casual'}[k]%d
321:         else:
322:                 return '%s:%s'%(d,page.flco.box[0].get_text().strip())
323: 
324: def regi_title_from_input(page):
325:         (series,race)=[page.regi.combo[k].get_active() for k in (0,1)]
326:         date=datebase+datetime.timedelta(weeks=series*6+race)
327:         page.regi.box.set_text(date.strftime("%a, %Y %b %d"))
328:         (snum,rnum)=(series+1,race+1)
329:         for k,radiobutton in enumerate(page.regi.radio):
330:                 if radiobutton.get_active(): break
331:         if k==0:
332:                 return 'Implicit as of S%iR%i'%(snum,rnum)
333:         elif k==1:
334:                 return 'Championship from S%iR%i'%(snum,rnum)
335:         elif k==2:
336:                 return 'Series S%i from R%i'%(snum,rnum)
337:         else: #if k==3:
338:                 return 'Race S%iR%i'%(snum,rnum)
339: 
340: #### dataframes.py #### python package PyScore.register module dataframes ####