def handle(self, *args, **options): from jflow.conf import settings level = { '0': logging.WARN, '1': logging.INFO, '2': logging.DEBUG }[options.get('verbosity', '1')] logging.basicConfig(level=level, format="%(name)s: %(levelname)s: %(message)s") logger = logging.getLogger('addccy') dv = options.get('defaultvendor', None) if dv: dv = unicode(dv[0]) ccys = currencydb() for c in ccys.values(): id,created = DataId.objects.get_or_create(code = c.code, country = c.default_country, default_vendor = dv, name = '%s Spot Rate' % c.as_cross('/'), tags = 'forex currency spot index') id.add_vendor('blb','%s Curncy' % c.code) id.add_vendor('ecb',c.code) if created: logger.info("Created currency %s" % id) else: logger.info("Modified currency %s" % id)
def handle(self, *args, **options): from jflow.conf import settings level = { '0': logging.WARN, '1': logging.INFO, '2': logging.DEBUG }[options.get('verbosity', '1')] logging.basicConfig(level=level, format="%(name)s: %(levelname)s: %(message)s") logger = logging.getLogger('addccy') dv = options.get('defaultvendor', None) if dv: dv = unicode(dv[0]) ccys = currencydb() for c in ccys.values(): id, created = DataId.objects.get_or_create( code=c.code, country=c.default_country, default_vendor=dv, name='%s Spot Rate' % c.as_cross('/'), tags='forex currency spot index') id.add_vendor('blb', '%s Curncy' % c.code) id.add_vendor('ecb', c.code) if created: logger.info("Created currency %s" % id) else: logger.info("Modified currency %s" % id)
def test_dump_currency_table(self): db = currencydb() table = list(ccy.dump_currency_table()) self.assertEqual(len(table), len(db)+1)
def test2letters(self): ccys = currencydb() twol = {} for ccy in ccys.values(): self.assertFalse(ccy.twoletterscode in twol) twol[ccy.twoletterscode] = ccy
def testiso(self): ccys = currencydb() iso = {} for ccy in ccys.values(): self.assertFalse(ccy.isonumber in iso) iso[ccy.isonumber] = ccy
def testdefaultcountry(self): ccys = currencydb() for ccy in ccys.values(): if ccy.code != 'XBT': self.assertEqual(ccy.code[:2], ccy.default_country)
def events(request, event_id=None): # Redirect to proper URL if there's a ?goto=... present if 'goto' in request.GET: return redirect('/results/events/' + request.GET['goto']) base = base_ctx('Results', 'By Event', request) base.update(csrf(request)) try: event = Event.objects.get(id=int(event_id)) except: # This is executed for invalid event IDs or the root table ind_bigs = collect(Event.objects.filter(parent__isnull=True, big=True, category='individual').\ select_related('event').order_by('lft'), 2) ind_smalls = Event.objects.filter(parent__isnull=True, big=False, category='individual').\ select_related('event').order_by('name') team_bigs = collect(Event.objects.filter(parent__isnull=True, big=True, category='team').\ select_related('event').order_by('lft'), 2) team_smalls = Event.objects.filter(parent__isnull=True, big=False, category='team').\ select_related('event').order_by('name') freq_bigs = collect(Event.objects.filter(parent__isnull=True, big=True, category='frequent').\ select_related('event').order_by('lft'), 2) freq_smalls = Event.objects.filter(parent__isnull=True, big=False, category='frequent').\ select_related('event').order_by('name') base.update({'ind_bigs': ind_bigs, 'ind_smalls': ind_smalls,\ 'team_bigs': team_bigs, 'team_smalls': team_smalls,\ 'freq_bigs': freq_bigs, 'freq_smalls': freq_smalls}) return render_to_response('events.html', base) # Number of matches (set event to big if too large) matches = Match.objects.filter(eventobj__lft__gte=event.lft, eventobj__rgt__lte=event.rgt) if matches.count() > 200 and not event.big: event.big = True event.save() # Get parent, ancestors and siblings if event.parent != None: siblings = event.parent.event_set.exclude(id=event.id).order_by('lft') else: siblings = None # Make modifications if neccessary if base['adm'] == True: if 'op' in request.POST and request.POST['op'] == 'Modify': if request.POST['type'] != 'nochange': event.change_type(request.POST['type']) if 'siblings' in request.POST.keys() and siblings is not None: for sibling in siblings: sibling.change_type(request.POST['type']) if request.POST['name'] != '' and request.POST['name'] != event.name: event.name = request.POST['name'] event.update_name() event.save() for e in event.get_children(): e.update_name() if request.POST['date'].strip() != 'No change': matches.update(date=request.POST['date']) base['message'] = 'Modified all matches.' if request.POST['offline'] != 'nochange': matches.update(offline=(request.POST['offline'] == 'offline')) base['message'] = 'Modified all matches.' if request.POST['game'] != 'nochange': matches.update(game=request.POST['game']) base['message'] = 'Modified all matches.' if request.POST['homepage'] != event.get_homepage(): event.set_homepage(request.POST['homepage']) if request.POST['tlpd_in_id'] != event.get_tlpd_in_id(): event.set_tlpd_in_id(request.POST['tlpd_in_id']) if request.POST['tlpd_kr_id'] != event.get_tlpd_kr_id(): event.set_tlpd_kr_id(request.POST['tlpd_kr_id']) if request.POST['tl_thread'] != event.get_tl_thread(): event.set_tl_thread(request.POST['tl_thread']) if request.POST['lp_name'] != event.get_lp_name(): event.set_lp_name(request.POST['lp_name']) elif 'add' in request.POST and request.POST['add'] == 'Add': parent = event for q in request.POST['subevent'].strip().split(','): type = request.POST['type'] parent.add_child(q.strip(), type, 'noprint' in request.POST, 'closed' in request.POST) elif 'move' in request.POST and request.POST['move'] == 'Move': eventid = request.POST['moveevent'] newparent = Event.objects.get(id=eventid) if event.lft > newparent.rgt: diff = newparent.rgt - event.lft else: diff = newparent.rgt - event.rgt - 1 event_shift(event, diff) event.set_parent(newparent) event.update_name() for e in event.get_children(): e.update_name() elif 'earnings' in request.POST and request.POST['earnings'] == 'Add': amount = int(request.POST['amount']) currency = request.POST['currency'] players = [] amounts = [] placements = [] for i in range(0, amount): player = request.POST['player-' + str(i)] player = Player.objects.get(id=player) amount = request.POST['amount-' + str(i)] amount = amount.replace(',', '').replace('.', '').replace(' ', '') players.append(player) amounts.append(amount) placements.append(i) success = Earnings.set_earnings(event, players, amounts, currency, placements) if success: base['message'] = 'Updated tournament prizepool.' else: base['message'] = 'There was an error updating the tournament prizepool.' base['event'] = event base['path'] = Event.objects.filter(lft__lte=event.lft, rgt__gte=event.rgt).order_by('lft') base['children'] = Event.objects.filter(parent=event).order_by('lft') if event.parent != None: base['siblings'] = event.parent.event_set.exclude(id=event.id).order_by('lft') # Used for moving events base['surroundingevents'] = event.get_parent(1).get_children().exclude(lft__gte=event.lft, rgt__lte=event.rgt) # Determine WoL/HotS and Online/Offline and event type if matches.values("game").distinct().count() == 1: base['game'] = matches[0].game if base['game'] == 'WoL': base['game'] = 'Wings of Liberty' elif base['game'] == 'HotS': base['game'] = 'Heart of the Swarm' #elif base['game'] = 'LotV': #base['game'] = 'Legacy of the Void' # Get list of players and earnings for prizepools base['players'] = Player.objects.filter(Q(id__in=matches.values('pla')) | Q(id__in=matches.values('plb'))) earnings = Earnings.objects.filter(event=event).order_by('placement') base['earnings'] = earnings base['prizepool'] = earnings.aggregate(Sum('earnings'))['earnings__sum'] base['prizepoolorig'] = earnings.aggregate(Sum('origearnings'))['origearnings__sum'] try: base['prizepoolcur'] = earnings.values('currency')[0]['currency'] except: base['prizepoolcur'] = "USD" # Get list of currencies currencies = [] sortedcurrencies = sorted(ccy.currencydb(), key=operator.itemgetter(0)) for currency in sortedcurrencies: dict = {} dict["name"] = ccy.currency(currency).name dict["code"] = ccy.currency(currency).code currencies.append(dict) base['currencies'] = currencies base['offline'] = None if matches.values("offline").distinct().count() == 1: base['offline'] = matches[0].offline # Statistics base['nmatches'] = matches.count() if base['nmatches'] > 0: qset = matches.aggregate(Sum('sca'), Sum('scb')) base['ngames'] = qset['sca__sum'] + qset['scb__sum'] else: base['ngames'] = 0 # Matchup wins and losses nti = lambda x: 0 if x is None else x qseta = matches.filter(rca='P', rcb='T').aggregate(Sum('sca'), Sum('scb')) qsetb = matches.filter(rcb='P', rca='T').aggregate(Sum('sca'), Sum('scb')) base['pvt_wins'] = nti(qseta['sca__sum']) + nti(qsetb['scb__sum']) base['pvt_loss'] = nti(qsetb['sca__sum']) + nti(qseta['scb__sum']) qseta = matches.filter(rca='P', rcb='Z').aggregate(Sum('sca'), Sum('scb')) qsetb = matches.filter(rcb='P', rca='Z').aggregate(Sum('sca'), Sum('scb')) base['pvz_wins'] = nti(qseta['sca__sum']) + nti(qsetb['scb__sum']) base['pvz_loss'] = nti(qsetb['sca__sum']) + nti(qseta['scb__sum']) qseta = matches.filter(rca='T', rcb='Z').aggregate(Sum('sca'), Sum('scb')) qsetb = matches.filter(rcb='T', rca='Z').aggregate(Sum('sca'), Sum('scb')) base['tvz_wins'] = nti(qseta['sca__sum']) + nti(qsetb['scb__sum']) base['tvz_loss'] = nti(qsetb['sca__sum']) + nti(qseta['scb__sum']) # Dates base['earliest'] = event.get_earliest() base['latest'] = event.get_latest() matches = matches.order_by('-date', '-eventobj__lft', '-id')[0:200] base['matches'] = display_matches(matches) return render_to_response('eventres.html', base)
class PrizepoolModForm(forms.Form): sorted_curs = sorted(ccy.currencydb(), key=operator.itemgetter(0)) currencies = [(ccy.currency(c).code, ccy.currency(c).name) for c in sorted_curs] currency = forms.ChoiceField(choices=currencies, required=True, label=_('Currency')) ranked = forms.CharField(required=False, max_length=10000, label=_('Ranked')) unranked = forms.CharField(required=False, max_length=10000, label=_('Unranked')) # {{{ Constructor def __init__(self, request=None, event=None): if request is not None: super(PrizepoolModForm, self).__init__(request.POST) else: initial = { 'ranked': earnings_code( event.earnings_set.filter( placement__gt=0).order_by('-earnings')), 'unranked': earnings_code( event.earnings_set.filter( placement=0).order_by('-earnings')), } try: initial['currency'] = event.earnings_set.all().first().currency except: initial['currency'] = 'USD' super(PrizepoolModForm, self).__init__(initial=initial) self.label_suffix = '' # }}} # {{{ Function for parsing a single line def line_to_data(self, line): ind = line.find(' ') prize = Decimal(line[:ind]) queryset = find_player(query=line[ind + 1:]) if not queryset.exists(): raise Exception(_("No such player: '%s'.") % line[ind + 1:]) elif queryset.count() > 1: raise Exception(_("Ambiguous player: '%s'.") % line[ind + 1:]) else: return prize, queryset.first() # }}} # {{{ update_event: Pushes changes to event object def update_event(self, event): ret = [] if not self.is_valid(): ret.append( Message(_('Entered data was invalid, no changes made.'), type=Message.ERROR)) for field, errors in self.errors.items(): for error in errors: ret.append( Message(error=error, field=self.fields[field].label)) return ret # {{{ Gather data ranked, unranked, ok = [], [], True for line in self.cleaned_data['ranked'].split('\n'): if line.strip() == '': continue try: prize, player = self.line_to_data(line) ranked.append({ 'prize': prize, 'player': player, 'placement': 0 }) except Exception as e: ret.append(Message(str(e), type=Message.ERROR)) ok = False for line in self.cleaned_data['unranked'].split('\n'): if line.strip() == '': continue try: prize, player = self.line_to_data(line) unranked.append({ 'prize': prize, 'player': player, 'placement': -1 }) except Exception as e: ret.append(Message(str(e), type=Message.ERROR)) ok = False if not ok: ret.append( Message(_('Errors occured, no changes made.'), type=Message.ERROR)) return ret # }}} # {{{ Fix placements of ranked prizes ranked.sort(key=lambda a: a['placement']) for i, e in enumerate(ranked): ranked[i]['placement'] = i # }}} # {{{ Commit try: Earnings.set_earnings(event, ranked, self.cleaned_data['currency'], True) Earnings.set_earnings(event, unranked, self.cleaned_data['currency'], False) except RateNotFoundError as e: ret.append(Message(str(e), type=Message.ERROR)) return ret # }}} # Translators: New prizepools added to the database. ret.append(Message(_('New prizes committed.'), type=Message.SUCCESS)) return ret
def test_dump_currency_table(self): db = currencydb() table = list(ccy.dump_currency_table()) self.assertEqual(len(table), len(db) + 1)
def test_2letters(): ccys = currencydb() twol = {} for ccy in ccys.values(): assert ccy.twoletterscode not in twol twol[ccy.twoletterscode] = ccy
def test_iso(): ccys = currencydb() iso = {} for ccy in ccys.values(): assert ccy.isonumber not in iso iso[ccy.isonumber] = ccy
def test_defaultcountry(): ccys = currencydb() for ccy in ccys.values(): if ccy.code != 'XBT': assert ccy.code[:2] == ccy.default_country
def test_dump_currency_table(): db = currencydb() table = list(dump_currency_table()) assert len(table) == len(db) + 1