try out django
[mlpccg-meta.git] / mlpccg / DeckList.py
1 import logging
2 import operator
3 import xml.etree.ElementTree as ET
4 from collections import defaultdict
5
6 import mlpccg.CardDb
7
8 class DeckList:
9 def __init__(self, name=None, xml=None, url=None, txt=None):
10 self.cards = []
11 self.name = name
12
13 if xml:
14 self.parse_ponyhead_xml(xml)
15 elif url:
16 self.parse_ponyhead_link(url)
17
18 def __repr__(self):
19 return self.name
20
21 @property
22 def aspects(self):
23 mane = None
24 aspects = defaultdict(int)
25 for card in self.cards:
26 if card['type'] == 'Mane':
27 mane = (card['title'], mlpccg.CardDb.CardDb.set_ids[card['set']].upper())
28
29 elif card['type'] == 'Friend':
30 aspects[card['color']] += 1
31
32 elif card['type'] != 'Problem':
33 aspects[card['type']] += 1
34
35 aspects_sorted = sorted(aspects.iteritems(), reverse=True, key=operator.itemgetter(1))
36 aspects_sum = float(sum([aspect[1] for aspect in aspects_sorted]))
37 aspects_filtered = []
38 cutoff = 0.66
39 amount = 0.0
40 for aspect, value in aspects_sorted:
41 amount += value / aspects_sum
42 if amount < cutoff:
43 aspects_filtered += [aspect]
44 else:
45 break
46
47 return (mane, aspects_filtered)
48
49 @property
50 def description(self):
51 mane, aspects = self.aspects
52 if not mane or len(aspects) == 0:
53 return 'Unknown'
54
55 return '%s %s %s' % (mane[0], mane[1], '/'.join(aspects))
56
57 @property
58 def ponyhead_link(self):
59 cards = defaultdict(int)
60 for card in self.cards:
61 cards[card['id'].replace('f', 'F')] += 1
62
63 cards = ['%sx%d' % (id, amount) for id, amount in cards.iteritems()]
64
65 return 'http://ponyhead.com/deckbuilder?v1code=%s' % '-'.join(cards)
66
67 def parse_ponyhead_xml(self, path):
68 logging.debug('loading decklist from xml')
69
70 try:
71 root = ET.parse(path).getroot()
72 card_names = [element.text.strip() for element in root.findall('.//card/name')]
73 for card_name in card_names:
74 self.cards += [mlpccg.CardDb.CARDDB.by_name(card_name)['id']]
75 except:
76 logging.exception('failed')
77
78 def parse_ponyhead_link(self, link):
79 logging.debug('loading decklist by parsing url')
80
81 try:
82 id_list = [id.split('x') for id in link.split('=')[-1].split('-')]
83 for id, amount in id_list:
84 self.cards += [mlpccg.CardDb.CARDDB.by_id(id)] * int(amount)
85 except:
86 logging.exception('failed: %s', link)
87
88 def parse_ponyhead_txt(self):
89 pass