from nevow import loaders, rend, static from nevow.tags import * from nevow import compy from nevow import inevow import parseHistory, re, os, metaplay, feature import datetime import webby def fmtplayers(demo): names = [p.name for p in demo.players] if len(names) == 1: return names[0] else: return ', '.join(names[:-1]) + ' & ' + names[-1] class NolanCategory(object): ''' supplied: awards : NolanAwards name : str blurb : html computed: candidates : [ISerializable] later: nominees ''' def __init__(self, awards, shortname, name, blurb): self.awards = awards self.name = name self.blurb = blurb self.shortname = shortname class DemoCategory(NolanCategory): ''' supplied: features ''' def __init__(self, awards, shortname, name, blurb, features): NolanCategory.__init__(self, awards, shortname, name, blurb) self.features = features fr = feature.parse_feature_flags(features) self.candidates = fr.filter_demos(awards.year_demos) self.candidates.sort( lambda x,y:cmp(x.parseddate, y.parseddate)) self.candidates.sort( lambda x,y:cmp(x.level.seqno, y.level.seqno)) class RookieCategory(NolanCategory): def __init__(self, awards, shortname, name, blurb): NolanCategory.__init__(self, awards, shortname, name, blurb) self.candidates = [] _start = datetime.date(awards.year - 1, 12, 1) _end = datetime.date(awards.year + 1, 1, 1) for p in awards.config.players.values(): r = p.first_record(p) if r and _start <= r.parseddate < _end: self.candidates.append((r.parseddate, p)) self.candidates.sort() self.candidates = [t[1] for t in self.candidates] class DemoCategoryView(webby.BasePage): bodyFactory = loaders.htmlfile("templates/nolans/demolist.html") def __init__(self, dc): webby.BasePage.__init__(self) self.dc = dc def render_title(self, context, data): return "Nolans %s %s Candidates"%(self.dc.awards.year, self.dc.name) def data_candidates(self, context, data): return self.dc.candidates def render_r(self, context, data): return "%s by %s"%(data.filename, fmtplayers(data)) class RookieCategoryView(webby.BasePage): bodyFactory = loaders.htmlfile("templates/nolans/demolist.html") def __init__(self, dc): webby.BasePage.__init__(self) self.dc = dc def render_title(self, context, data): return "Nolans %s %s Candidates"%(self.dc.awards.year, self.dc.name) def data_candidates(self, context, data): return self.dc.candidates def render_r(self, context, data): return data.name class NolanAwards(object): '''One set of nolans awards state = oneof("in preparation", "voting", "voting closed", "done") some dates : votingBegin votingEnd ceremonyEnd categories : [NolanCategory] config : Config ''' def __init__(self, config, year): self.year = year _yearstart = datetime.date(year, 1, 1) _yearend = datetime.date(year + 1, 1, 1) self.year_demos = [] for d in config.all_demos(): if _yearstart <= d.parseddate < _yearend: self.year_demos.append(d) self.categories = [] self.config = config class NolanAwardsView(webby.BasePage): addSlash = '/' bodyFactory = loaders.htmlfile("templates/nolans/yearview.html") def __init__(self, na): webby.BasePage.__init__(self) self.na = na self.title = "Nolans %s"%na.year def data_categories(self, context, data): return self.na.categories def render_r(self, context, data): return a(href=data.shortname)[data.name] def render_n(self, context, data): return len(data.candidates) def childFactory(self, ctx, name): for c in self.na.categories: if name == c.shortname: return c class Admin(webby.BasePage): addSlash = '/' bodyFactory = loaders.htmlfile("templates/nolans/admin.html") def update_instance(self): self.__init__(self.config) def add_variants(self, n, pref, cats, consts): for cat in cats: n.categories.append( DemoCategory(n, pref.lower()+"_"+cat.lower(), pref+" "+cat.upper(), "", consts + ["+"+cat.lower()])) def __init__(self, config): webby.BasePage.__init__(self) self.config = config n = NolanAwards(config, 2004) self.add_variants(n, "ID", ["ER", "EH", "NR", "NH"], ["+id", "-mara", "+sp"]) self.add_variants(n, "EP", ["ER", "EH", "NR", "NH"], ["+hip|rogue|custep", "-mara", "+sp"]) self.add_variants(n, "Cust", ["ER", "EH", "NR", "NH"], ["+custlvl", "-mara", "+sp"]) n.categories.append( DemoCategory(n, "mara", "Marathons", "", ["+mara"])) n.categories.append( DemoCategory(n, "coop_id", "ID Coops", "", ["+coop", "+id"])) n.categories.append( DemoCategory(n, "coop_r", "Coop Run", "", ["+coop", "-id", "+run"])) n.categories.append( DemoCategory(n, "coop_h", "Coop 100%", "", ["+coop", "-id", "+100%"])) n.categories.append( RookieCategory(n, "rookie", "Rookie of the Year", "")) self.nolans = {"2004":n} n = NolanAwards(config, 2005) self.add_variants(n, "ID", ["ER", "EH", "NR", "NH"], ["+id", "-mara", "+sp"]) self.add_variants(n, "EP", ["ER", "EH", "NR", "NH"], ["+hip|rogue|custep", "-mara", "+sp"]) self.add_variants(n, "Cust", ["ER", "EH", "NR", "NH"], ["+custlvl", "-mara", "+sp"]) n.categories.append( DemoCategory(n, "mara", "Marathons", "", ["+mara"])) n.categories.append( DemoCategory(n, "coop_id", "ID Coops", "", ["+coop", "+id"])) n.categories.append( DemoCategory(n, "coop_r", "Coop Run", "", ["+coop", "-id", "+run"])) n.categories.append( DemoCategory(n, "coop_h", "Coop 100%", "", ["+coop", "-id", "+100%"])) n.categories.append( RookieCategory(n, "rookie", "Rookie of the Year", "")) self.nolans["2005"] = n def data_nolans(self, context, data): r = self.nolans.items() r.sort() return r def childFactory(self, ctx, name): return self.nolans.get(name) def render_year(self, context, data): return a(href=data[0])[data[0]] def render_n(self, context, data): return str(len(data[1].categories[0].candidates)) compy.registerAdapter(NolanAwardsView, NolanAwards, inevow.IResource) compy.registerAdapter(RookieCategoryView, RookieCategory, inevow.IResource) compy.registerAdapter(DemoCategoryView, DemoCategory, inevow.IResource)