From f5f267a53e90455937409ad2bd15324e717c8e04 Mon Sep 17 00:00:00 2001 From: Jess Date: Sat, 23 Aug 2014 16:59:30 +0200 Subject: [PATCH] try out django --- data/cards.json | 59 ++++++-- data/db.sqlite3 | Bin 74752 -> 78848 bytes data/tournaments.csv | 50 +++---- db.sqlite3 | Bin 0 -> 82944 bytes main.py | 9 -- manage.py | 10 ++ meta/__init__.py | 0 meta/__init__.pyc | Bin 0 -> 135 bytes meta/admin.py | 6 + meta/admin.pyc | Bin 0 -> 388 bytes meta/management/__init__.py | 0 meta/management/__init__.pyc | Bin 0 -> 146 bytes meta/management/commands/__init__.py | 0 meta/management/commands/__init__.pyc | Bin 0 -> 155 bytes meta/management/commands/csvimport.py | 24 ++++ meta/management/commands/csvimport.pyc | Bin 0 -> 1542 bytes meta/models.py | 25 ++++ meta/models.pyc | Bin 0 -> 1880 bytes .../static}/apple-touch-icon-precomposed.png | Bin .../static}/css/bootstrap-theme.css | 0 .../static}/css/bootstrap-theme.css.map | 0 .../static}/css/bootstrap-theme.min.css | 0 {static => meta/static}/css/bootstrap.css | 0 {static => meta/static}/css/bootstrap.css.map | 0 {static => meta/static}/css/bootstrap.min.css | 0 {static => meta/static}/css/main.css | 0 {static => meta/static}/favicon.ico | Bin .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin {static => meta/static}/js/main.js | 0 .../static}/js/vendor/bootstrap.js | 0 .../static}/js/vendor/bootstrap.min.js | 0 .../static}/js/vendor/jquery-1.11.0.min.js | 0 .../modernizr-2.6.2-respond-1.1.0.min.js | 0 {static => meta/templates}/404.html | 0 meta/templates/index.html | 135 ++++++++++++++++++ meta/tests.py | 3 + meta/views.py | 27 ++++ meta/views.pyc | Bin 0 -> 1411 bytes mlpccg-web/__init__.py | 0 mlpccg-web/__init__.pyc | Bin 0 -> 141 bytes mlpccg-web/settings.py | 84 +++++++++++ mlpccg-web/settings.pyc | Bin 0 -> 2240 bytes mlpccg-web/urls.py | 12 ++ mlpccg-web/urls.pyc | Bin 0 -> 468 bytes mlpccg-web/wsgi.py | 14 ++ mlpccg-web/wsgi.pyc | Bin 0 -> 604 bytes mlpccg/CardDb.py | 5 +- mlpccg/CardDb.pyc | Bin 0 -> 3367 bytes mlpccg/Clustering.py | 34 ++--- mlpccg/Clustering.pyc | Bin 0 -> 3690 bytes mlpccg/DeckList.py | 47 ++++-- mlpccg/DeckList.pyc | Bin 0 -> 3957 bytes mlpccg/TournamentRecord.py | 17 --- mlpccg/__init__.pyc | Bin 0 -> 137 bytes static/index.html | 95 ------------ 58 files changed, 469 insertions(+), 187 deletions(-) create mode 100644 db.sqlite3 delete mode 100644 main.py create mode 100644 manage.py create mode 100644 meta/__init__.py create mode 100644 meta/__init__.pyc create mode 100644 meta/admin.py create mode 100644 meta/admin.pyc create mode 100644 meta/management/__init__.py create mode 100644 meta/management/__init__.pyc create mode 100644 meta/management/commands/__init__.py create mode 100644 meta/management/commands/__init__.pyc create mode 100644 meta/management/commands/csvimport.py create mode 100644 meta/management/commands/csvimport.pyc create mode 100644 meta/models.py create mode 100644 meta/models.pyc rename {static => meta/static}/apple-touch-icon-precomposed.png (100%) rename {static => meta/static}/css/bootstrap-theme.css (100%) rename {static => meta/static}/css/bootstrap-theme.css.map (100%) rename {static => meta/static}/css/bootstrap-theme.min.css (100%) rename {static => meta/static}/css/bootstrap.css (100%) rename {static => meta/static}/css/bootstrap.css.map (100%) rename {static => meta/static}/css/bootstrap.min.css (100%) rename {static => meta/static}/css/main.css (100%) rename {static => meta/static}/favicon.ico (100%) rename {static => meta/static}/fonts/glyphicons-halflings-regular.eot (100%) rename {static => meta/static}/fonts/glyphicons-halflings-regular.svg (100%) rename {static => meta/static}/fonts/glyphicons-halflings-regular.ttf (100%) rename {static => meta/static}/fonts/glyphicons-halflings-regular.woff (100%) rename {static => meta/static}/js/main.js (100%) rename {static => meta/static}/js/vendor/bootstrap.js (100%) rename {static => meta/static}/js/vendor/bootstrap.min.js (100%) rename {static => meta/static}/js/vendor/jquery-1.11.0.min.js (100%) rename {static => meta/static}/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js (100%) rename {static => meta/templates}/404.html (100%) create mode 100644 meta/templates/index.html create mode 100644 meta/tests.py create mode 100644 meta/views.py create mode 100644 meta/views.pyc create mode 100644 mlpccg-web/__init__.py create mode 100644 mlpccg-web/__init__.pyc create mode 100644 mlpccg-web/settings.py create mode 100644 mlpccg-web/settings.pyc create mode 100644 mlpccg-web/urls.py create mode 100644 mlpccg-web/urls.pyc create mode 100644 mlpccg-web/wsgi.py create mode 100644 mlpccg-web/wsgi.pyc create mode 100644 mlpccg/CardDb.pyc create mode 100644 mlpccg/Clustering.pyc create mode 100644 mlpccg/DeckList.pyc delete mode 100644 mlpccg/TournamentRecord.py create mode 100644 mlpccg/__init__.pyc delete mode 100644 static/index.html diff --git a/data/cards.json b/data/cards.json index 0bc245c..9bd7e10 100644 --- a/data/cards.json +++ b/data/cards.json @@ -1,5 +1,6 @@ [ { + "_comment": "@Aracat1 - prepared by scraping the OCR with some manual corrections. Usually updated after big changes. Feel free to use for whatever", "allIds": [ "1", "f1" @@ -8460,7 +8461,7 @@ "f1a" ], "boostedFlavorText": "", - "boostedText": "Home Limit 4. <> This card has +1 power for each card type in your discard pile.", + "boostedText": "Home Limit 4 <> This card has +1 power for each card type in your discard pile.", "color": "Orange", "cost": 0, "flavorText": "", @@ -8468,10 +8469,10 @@ "id": "rrf1", "points": 0, "power": 1, - "rarity": "Unknown", + "rarity": "Fixed", "set": "Rock 'n Rave", "subtitle": "Rockin'", - "text": "Home Limit 3. <> At the end of your Main Phase, if you have a Friend and a Resource, turn this card over.", + "text": "Home Limit 3 <> At the end of your Main Phase, if you have a Friend and a Resource, turn this card over.", "title": "Maud Pie", "traits": "Earth Pony", "type": "Mane" @@ -8479,21 +8480,21 @@ { "allIds": [ "f2", - "f1a" + "f2a" ], "boostedFlavorText": "", - "boostedText": "Home Limit 4. Main Phase: Exhaust this card to draw a card. At the start of your Score Phase, if this card is with at least 3 of your Friends, you may ready this card.", + "boostedText": "Home Limit 4 <> Main Phase: Exhaust this card to draw a card. <> At the start of your Score Phase, if this card is with at least 3 of your Friends, you may ready this card.", "color": "Pink", "cost": 0, "flavorText": "", - "hasErrata": false, + "hasErrata": true, "id": "rrf2", "points": 0, "power": 1, - "rarity": "Unknown", + "rarity": "Fixed", "set": "Rock 'n Rave", "subtitle": "Party Starter", - "text": "Home Limit 3. <> When you draw your third card during a turn, shuffle your deck and turn this card over.", + "text": "Home Limit 3 <> When you draw your third card during a turn, shuffle your deck and turn this card over.", "title": "DJ Pon-3", "traits": "Unicorn", "type": "Mane" @@ -8726,6 +8727,48 @@ "title": "Quarray Eels", "type": "Troublemaker" }, + { + "allIds": [ + "f1" + ], + "boostedFlavorText": "", + "boostedText": "Home Limit 4 <> When this side of the card is turned face up, choose a color for each of your opponents. This card gains each of those colors.", + "color": "Purple", + "cost": 0, + "flavorText": "", + "hasErrata": false, + "id": "csf1", + "points": 0, + "power": 1, + "rarity": "Fixed", + "set": "Celestial Solstice", + "subtitle": "Friendship is Magic", + "text": "Home Limit 3 <> When you play a Friend that is a different color from one of your other Friends, turn this card over.", + "title": "Twilight Sparkle", + "traits": "Unicorn", + "type": "Mane" + }, + { + "allIds": [ + "f2" + ], + "boostedFlavorText": "", + "boostedText": "Home Limit 4 <> While you have Princess Luna, Princess Twilight Sparkle or Princess Cadance, each of your Alicorn Friends has +1 power.", + "color": "Yellow", + "cost": 0, + "flavorText": "", + "hasErrata": false, + "id": "csf2", + "points": 0, + "power": 1, + "rarity": "Fixed", + "set": "Celestial Solstice", + "subtitle": "Solar Sister", + "text": "Home Limit 3 <> When one of your Alicorn Friends enters play, if you have at least 1 other Alicorn Friend, turn this card over.", + "title": "Princess Celestia", + "traits": "Alicorn, Royalty", + "type": "Mane" + }, { "allIds": [ "1" diff --git a/data/db.sqlite3 b/data/db.sqlite3 index 3cc3b75142c366c48673911cfb3798b7decf21bd..40ec1ede2c3d57076dd0396d2a596a377942d7cc 100644 GIT binary patch delta 4461 zcmaJ^YgAO%6+Zh6k2&0XXL#c{3^RbhjDWmU91+KH907SLf~b)oA{wHIB0kfocP^}~ zr2XM|lMvga(G`=Jw6WqCiLEP*X`1IU)+E{{QR6F-)EKL6Vy(%t`yQBq^hal{y%&7n z-us-p&))mqv*X>c9fM&z%`qnkA=N0E!;<08DMB#!D=HxZ^a!Cx;IaO-$w2AGemN6F zsPUDhL?#s!K#x=XggUlUPo39Y@3qytXI6P_-JKh{*0glAt?6Fh+|}0F*|pqekFwz} zt$lf#t)iyhTjs5^)zsG8Y8tAla)zkoE!}NtwpkdZzM|UuzpNH6&9=Z@=P7sB*$eaY z9iuJO$8^TX;kfD^omCudh=6I%hOX5k?h{A5N9EYkHnw%OuV`-@wKUSAx4mjR{$2SnsySOxMQ%c6?nY%=hbp`sRoF6A(f6Yovlvxc zBdVkZRL1$J4D(P~YEUItqGIK!^j=g69#p9_P+5ynrA$I46`>OIQH>psD%L&&bxZ~- zTNDQ8LNux<5mh=v6%m0-r_;_-M|Ki=2@aE;e%UAaQgsZ9N+C~iGo5TBt5RcSW2si-W6rGuSK*4D_7$fj*Z|A2gC&%&g?g zD(5CHC6ASJzqJ>>5$$EeU;!)R;8Pc`ix17_U~x|~o6UnAzvKn|5<>ri54OZF*GRr{ z5lt$kNT^RgZxYiD+(T;?!!U7I$dWi{ z!Ibvx)kD0xV^4}2|KhF8R6=(`4MdVR$QF`1YGpze7QLsdy}P@u z%jW4^-MM~!+lCHr9=E{y&eJT!NbiIoFad#Sf;Tt#f39X=2=}>ia3f7%!Hnf-kowf0 z?+P8+9CY^NG4=Qp@qvSHF97{CLNCBRGOaHr9`eMtA~dOmq@G$u7vH9W)}E97a-qRDXI>N($pXt#s@Xh@9jBhWk315h7;uyQc?8s~FkSf!-0`61&YH}6WdbwMVE)oD!N5c~tj0 zeZ?j4UOaqWG$$zmw&X=L|l=)jv4rt@7k`sMkO&u~BI^Kjk! zxtAH>tT3aAhjK`)iGy|uM#Io}-bd(pI7asQ-s%}UW0eY9>2Ux@{O}|i(p<1x9eioOb)u0TsAXs{L>T=Qr#MY z1zy6`mi_U8A3oDVbOfm+^liG5M#H<%O)C9zF}~Rn(J~v~Y;KmwS6+I+sP^ptk5HGu z6Nz<|5W-)2DNC3g&vCcJ;zRh|m&` LJj_78kh%MIYUA_3jR{~w6f!MxrOqB<1 z>OX$`Oq#rKD831^zAzYH&ARt_;x?iuQwW)&8_=!SS?CF>&?0ioFWZD!58`7N!6b=2 zsCo3^dpfSKMh^+vsF?1Tr%Jx=b-0v=HTIOSbwlqyodnZBs9DQhD$>fJvxX6ZBa#!h{*or@n(T4HE0%jLQg9gqf>3SRk?0Bjzs{Ax5C9I3X4*V$T8o*D4 zaL^wk^fp`~$JErrzZ26dk$2%Vs$iAcKvwTu`Bsdb!$EDp%?aH6l7SFWp&>&D>%J4O zUbtdX^RJ%KuOsvZ93boba;xNZ=cgIP-lwxj~gxy&jv{ZekE{c}PoN)CfvB^Oqu=k^8Uh%emIT>Ol z@;(VCn+e&hJEUu+PDt|0D}=czc)m_3lUNG+#i`nyyEKrZRb{nbuE0r{hLJr`jAJ&9 zk6HbzgJM>y2C`z@M=A&HM{Wq!HXaHmfh`oOV!$j^Svih#(K?Lh7inXZ5j&x~Xf51< z7hnk($Xlcfp`ZN9XP|G1);2S=62R1)NmM&NNf73`IN_C;YlL|96N^wjJ?Jrgga|*K zAXJrd0-L3Dgs47k63V9qJ*JHiyU}A_2`4Z&B_qVe(bGmxwJa3vC>$u-O)eWH2PGF}0!ki=cFik5DMZokeG^f%OWj^aX@f#OD)iK5*lXQAN5GLg*2Kgv+FtERS@3Y2lUw}|*a zblB~<|EC_;86=vF-vCDmT?T|4^~=8zyj$^9T#zlXtwX1>ZP%E-sV0aKOi!qve3bhD delta 4020 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 diff --git a/data/tournaments.csv b/data/tournaments.csv index 616fc84..354ac17 100644 --- a/data/tournaments.csv +++ b/data/tournaments.csv @@ -1,4 +1,4 @@ -Date,Event,Placement,Name,Decklist +date,name,placement,decklist_name,decklist_url 2014-06-15,"Columbus, Ohio Regionals",1,Fluttershy CN/pink aggro,http://ponyhead.com/deckbuilder?v1code=cn25x2-pr85x3-pr94x3-cn98x3-pr83x3-pr86x2-pr89x3-cn83x3-pr82x3-cn86x3-cn43x3-pr42x3-pr44x2-pr110x3-pr108x2-pr123x2-cn117x2-pr179x2-pr194x2-pr164x2-cn180x2-cn173x2-cn7x1 2014-06-15,"Columbus, Ohio Regionals",2,Fluttershy CN/purple aggro light stall,http://ponyhead.com/deckbuilder?v1code=cn56x3-pr67x3-pr60x3-pr53x3-cn64x3-cn86x3-pr94x3-cn89x2-cn98x3-pr85x2-pr86x3-pr82x2-pr99x3-pr108x3-pr134x2-pr146x2-pr130x2-cn7x1-pr164x2-pr194x2-cn173x2-cn180x2-pr179x2 2014-06-15,"Columbus, Ohio Regionals",3,Pegasus Explosion,http://ponyhead.com/deckbuilder?v1code=cn43x3-cn41x3-pr44x2-pr42x3-pr49x3-pr114x2-pr19x3-cn15x3-pr11x3-pr198x3-cn115x2-cn120x2-pr13x2-cn192x2-cn157x3-pr85x3-pr151x3-pr168x1-pr176x2-pr171x1-pr172x2-cn171x2-pr181x2-cn1x1 @@ -15,14 +15,14 @@ Date,Event,Placement,Name,Decklist 2014-07-06,[Regionals] Everfree Northwest,6,Fluttershy CN/pink aggro,http://ponyhead.com/deckbuilder?v1code=pr165x2-pr164x2-pr194x2-cn173x2-pr179x2-pr11x3-cn25x2-pr42x3-pr36x3-cn43x3-cn51x2-pr110x3-pr104x1-pr108x3-cn117x3-pr83x3-pr82x3-pr85x3-pr86x1-pr94x3-cn95x3-cn98x3-cn7x1 2014-07-06,[Regionals] Everfree Northwest,7,Kindness/Conga Critters, 2014-07-06,[Regionals] Everfree Northwest,8,RD CN/orange Vittles Stand/Lead Pony Badge,http://ponyhead.com/deckbuilder?v1code=cn1x1-pr11x3-pr10x3-pr8x3-pr13x2-cn15x2-cn21x2-pr127x3-pr115x3-pr140x3-pr151x3-pr168x1-pr171x2-pr166x2-pr33x2-pr31x3-cn27x2-cn35x2-cn154x3-pr190x1-pr189x2-pr195x2-pr85x3-cn119x3 -2014-07-14,Fiest Equestria,1,One Pace with Gala Greeter,http://ponyhead.com/deckbuilder?v1code=pr36x3-cn43x3-pr56x3-cn42x3-cn65x2-cn58x1-pr209x3-pr114x3-pr98x1-pr96x1-pr126x1-cn108x3-cn109x3-cn106x3-cn104x3-cn157x3-cn167x1-cn171x2-cn181x2-cn182x2-cn51x1-cn196x1-cn34x1-cn5x1-cn176x1-pr60x3-cn184x2 -2014-07-14,Fiest Equestria,2,Pegasus Explosion Variant running CN Rainbow Dash, -2014-07-14,Fiest Equestria,3,Purple/Orange vittles stand running CN AJ, -2014-07-14,Fiest Equestria,4,Blue/White CN rainbow dash, -2014-07-14,Fiest Equestria,5,Premiere Rarity/Taxes(updated for CN.), -2014-07-14,Fiest Equestria,6,Flutterhate CN Fluttershy/White,http://ponyhead.com/deckbuilder?v1code=cn7x1-pr161x2-pr179x2-cn175x2-pr194x2-cn185x2-pr67x2-pr79x3-pr206x3-cn76x2-cn80x3-pr83x3-pr82x3-pr85x3-pr86x2-pr94x3-cn25x2-cn118x2-cn112x2-pr118x3-pr103x3-cn117x2-pr116x2-pr108x3 -2014-07-14,Fiest Equestria,7,CN Fluttershy/Pink,http://ponyhead.com/deckbuilder?v1code=cn7x1-pr80x2-pr81x2-pr82x1-pr83x3-pr84x2-pr85x1-pr86x1-pr87x2-pr91x2-pr93x3-pr94x3-cn83x2-cn86x1-cn88x1-pr108x2-pr116x1-pr130x3-cn102x2-cn117x2-pr134x1-pr146x1-cn201x1-pr161x1-pr164x1-pr183x1-pr165x1-pr36x3-pr38x2-pr42x3-pr43x1-pr45x2-pr46x1-pr114x1-cn115x1-pr143x1-pr169x1-pr172x2-pr192x2-pr184x1 -2014-07-14,Fiest Equestria,8,, +2014-07-14,Fiesta Equestria,1,One Pace with Gala Greeter,http://ponyhead.com/deckbuilder?v1code=pr36x3-cn43x3-pr56x3-cn42x3-cn65x2-cn58x1-pr209x3-pr114x3-pr98x1-pr96x1-pr126x1-cn108x3-cn109x3-cn106x3-cn104x3-cn157x3-cn167x1-cn171x2-cn181x2-cn182x2-cn51x1-cn196x1-cn34x1-cn5x1-cn176x1-pr60x3-cn184x2 +2014-07-14,Fiesta Equestria,2,Pegasus Explosion Variant running CN Rainbow Dash, +2014-07-14,Fiesta Equestria,3,Purple/Orange vittles stand running CN AJ, +2014-07-14,Fiesta Equestria,4,Blue/White CN rainbow dash, +2014-07-14,Fiesta Equestria,5,Premiere Rarity/Taxes(updated for CN.), +2014-07-14,Fiesta Equestria,6,Flutterhate CN Fluttershy/White,http://ponyhead.com/deckbuilder?v1code=cn7x1-pr161x2-pr179x2-cn175x2-pr194x2-cn185x2-pr67x2-pr79x3-pr206x3-cn76x2-cn80x3-pr83x3-pr82x3-pr85x3-pr86x2-pr94x3-cn25x2-cn118x2-cn112x2-pr118x3-pr103x3-cn117x2-pr116x2-pr108x3 +2014-07-14,Fiesta Equestria,7,CN Fluttershy/Pink,http://ponyhead.com/deckbuilder?v1code=cn7x1-pr80x2-pr81x2-pr82x1-pr83x3-pr84x2-pr85x1-pr86x1-pr87x2-pr91x2-pr93x3-pr94x3-cn83x2-cn86x1-cn88x1-pr108x2-pr116x1-pr130x3-cn102x2-cn117x2-pr134x1-pr146x1-cn201x1-pr161x1-pr164x1-pr183x1-pr165x1-pr36x3-pr38x2-pr42x3-pr43x1-pr45x2-pr46x1-pr114x1-cn115x1-pr143x1-pr169x1-pr172x2-pr192x2-pr184x1 +2014-07-14,Fiesta Equestria,8,, 2014-07-15,Giga-Bites Gaming Cafe,1,CN Rainbow Dash Blue/White,http://ponyhead.com/deckbuilder?v1code=pr11x3-cn21x3-pr10x3-cn15x3-pr14x3-pr19x3-cn192x3-pr140x3-pr151x3-cn120x3-pr115x3-pr85x2-cn80x2-pr79x3-pr67x3-pr206x3-pr168x1-pr178x1-pr171x2-pr176x2-pr163x2-pr167x2-cn1x1 2014-07-15,Giga-Bites Gaming Cafe,2,Prem Rarity White/Pink,http://ponyhead.com/deckbuilder?v1code=pr5x1-pr42x3-cn43x3-pr36x3-pr45x2-pr110x3-pr131x2-pr65x2-cn69x2-cn76x2-pr72x2-pr206x3-pr77x2-cn73x2-cn137x2-cn135x2-pr132x2-pr118x3-pr160x3-pr152x2-cn158x2-pr170x2-cn185x2-pr192x2-cn176x2-pr172x2 2014-07-15,Giga-Bites Gaming Cafe,3,CN Rainbow Dash Blue/Orange,http://ponyhead.com/deckbuilder?v1code=cn1x1-pr10x3-pr31x3-cn21x3-cn158x2-cn154x3-pr152x2-cn35x3-pr115x2-cn162x2-pr199x3-pr151x2-pr19x3-pr13x3-pr11x3-pr33x3-pr117x2-pr159x2-pr198x2-cn192x2-pr168x2-cn168x2-cn186x2-pr189x2-pr166x2 @@ -127,19 +127,19 @@ Date,Event,Placement,Name,Decklist 2014-08-17,South Australian regional,6,Mish Mash,http://ponyhead.com/deckbuilder?v1code=pr1x1-cn186x2-cn170x1-pr176x1-pr181x2-pr184x1-pr192x1-pr172x1-cn171x1-pr153x2-pr159x1-pr160x2-cn192x1-pr117x1-pr95x2-pr8x1-prPF3x1-pr45x1-pr46x2-pr42x2-pr38x2-cn17x2-cn40x1-cn39x1-cn52x1-pr48x1-cn42x1-pr7x1-pr15x1-pr16x1-pr17x2-cn21x1-pr13x2-pr127x1-pr115x2-pr104x2-pr209x1-pr143x1-cn129x2-cn125x1-cn160x1-pr110x1 2014-08-17,South Australian regional,7,Royal Guidance,http://ponyhead.com/deckbuilder?v1code=cn7x1-pr161x1-pr179x2-pr194x2-pr164x2-pr177x2-pr187x1-pr81x3-pr93x3-pr82x3-pr85x3-pr83x3-cn86x3-pr89x2-pr61x3-pr60x3-pr64x3-pr63x3-pr54x3-pr106x3-pr108x3-pr99x3-pr148x2-pr146x3-cn159x3 2014-08-17,South Australian regional,8,Fear Me,http://ponyhead.com/deckbuilder?v1code=cn5x1-cn179x1-cn167x2-pr171x1-pr168x2-pr176x1-cn186x1-cn174x2-cn11x1-pr20x2-pr7x1-cn18x3-cn15x2-pr12x1-pr15x1-pr61x1-cnPF3x1-pr59x1-pr63x1-cn53x1-cn55x2-cn66x2-cnPF1x2-pr42x1-pr85x1-pr159x2-cn161x2-cn159x1-pr126x2-pr124x1-pr109x1-pr120x1-cn111x1-cn123x3-pr127x2-cn121x1-cn135x2-cn150x1-cn152x1 -2014-08-21,North American Continental Champion,1,Nation Morath,http://ponyhead.com/deckbuilder?v1code=cn144x1-cn134x2-cn153x3-pr209x2-cn140x3-cn132x2-cn203x2-pr152x3-pr210x3-pr159x3-pr106x3-cn114x2-cn43x3-prPF2x3-pr63x2-pr60x3-pr53x3-pr203x2-cn168x2-cn183x2-cn178x2-pr195x2-pr162x1-pr190x1-rrF1x1 -2014-08-21,North American Continental Champion,2,Paul Atherton,http://ponyhead.com/deckbuilder?v1code=pr159x3-cn157x2-pr114x3-pr118x3-rr2x3-cn47x3-cn41x3-cn51x3-cn43x3-cn42x1-cn80x3-pr79x3-pr72x3-pr206x3-pr11x3-pr197x3-rrF2x1-cn176x2-cn171x2-cn177x1-pr163x2-pr170x1-cn185x2 -2014-08-21,North American Continental Champion,3,Niko White,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn132x2-cn115x3-cn51x3-cn195x2-pr60x3-pr63x3-cn144x2-cn140x3-pr64x3-pr203x3-cn196x3-pr160x3-cn158x3-cn203x3-pr210x3-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2-rrF2x1 -2014-08-21,North American Continental Champion,4,Chris Ballew,http://ponyhead.com/deckbuilder?v1code=pr11x3-cn192x3-pr12x3-pr20x3-pr198x3-cn15x3-pr19x3-rr2x3-cn51x3-cn41x3-pr151x3-pr210x3-cn157x3-pr114x3-cn120x3-rrF2x1-pr168x1-pr172x2-pr181x2-pr176x2-pr171x1-cn171x2 -2014-08-21,North American Continental Champion,5,Charlotte White,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn51x3-cn115x3-cn132x2-pr192x2-cn176x2-pr60x3-pr63x3-pr64x3-pr203x3-cn140x3-pr177x2-cn167x2-cn179x2-pr160x3-pr210x3-cn158x3-cn203x2-cn195x2-cn196x3-cn144x2-rrF2x1-pr152x1 -2014-08-21,North American Continental Champion,6,Francis Marino,http://ponyhead.com/deckbuilder?v1code=pr60x3-pr53x2-pr56x3-cn65x3-cn42x3-cn51x1-cn196x1-rr5x3-pr114x3-cn104x3-cn109x3-cn106x3-cn108x3-pr96x1-pr98x1-pr209x3-pr106x1-cn34x1-pr126x1-cn157x3-rrF2x1-cn167x1-cn176x1-cn184x2-cn182x2-rr10x2-cn171x2 -2014-08-21,North American Continental Champion,7,Donald Barksdale,http://ponyhead.com/deckbuilder?v1code=pr79x3-cn80x3-cn76x2-pr72x3-pr206x3-pr65x2-rr2x2-cn47x3-cn43x3-cn51x3-pr197x3-cn25x1-pr114x3-cn115x3-pr118x3-cn104x3-pr107x3-cn198x1-cn176x1-cn177x2-pr172x2-pr163x2-cn185x1-pr185x2-rrF2x1 -2014-08-21,North American Continental Champion,8,Luke Wyman,http://ponyhead.com/deckbuilder?v1code=rrF2x1-cn34x1-cn51x2-cn42x3-pr56x3-pr63x2-cn65x2-pr66x1-cn106x3-cn113x1-pr114x3-cn124x1-pr106x1-pr126x1-cn108x3-cn109x3-cn104x3-pr96x1-pr98x1-pr209x3-cn157x3-cn115x1-rr5x3-rr10x2-cn171x2-cn182x1-cn181x2-rr8x2-cn167x1 -2014-08-21,North American Continental Champion,9,Adam McHale,http://ponyhead.com/deckbuilder?v1code=pr79x3-cn80x3-cn198x2-cn75x3-cn104x3-pr118x3-rr3x3-pr203x3-pr126x2-pr106x3-cn140x1-cn109x3-cn116x2-cn203x2-pr210x2-cn158x1-pr152x3-cn122x3-cnf2x1-pr174x2-cn185x2-cn167x2-pr188x2-pr175x2 -2014-08-21,North American Continental Champion,10,Donnie Rose,http://ponyhead.com/deckbuilder?v1code=cn108x3-cn65x3-pr209x3-cn51x1-pr114x3-rr5x3-cn106x3-cn109x3-pr96x1-pr56x3-pr60x3-cn196x1-cn157x3-pr98x1-cn104x3-cn42x3-cn43x3-cn34x1-pr126x1-cn5x1-cn176x1-cn184x2-cn182x2-rr10x2-cn171x2-cn167x1 -2014-08-21,North American Continental Champion,11,Erik Mooney,http://ponyhead.com/deckbuilder?v1code=cn1x1-pr11x3-pr19x3-pr10x3-cn192x3-cn15x3-pr79x3-cn80x3-pr151x3-pr118x3-pr206x3-pr140x2-pr67x2-pr115x3-cn120x2-pr198x2-pr13x1-pr14x1-pr210x2-cn185x2-pr163x2-pr171x2-pr176x2-pr167x2 -2014-08-21,North American Continental Champion,12,Nicholas Hattwick,http://ponyhead.com/deckbuilder?v1code=pr160x3-cn203x3-pr210x3-cn158x3-pr60x3-pr64x3-cn196x3-pr203x3-pr63x3-pr41x3-cn51x3-cn195x2-cn115x3-cn140x3-cn144x2-cn132x2-rrF2x1-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2 -2014-08-21,North American Continental Champion,13,Joe Harrington,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn132x3-cn51x3-cn115x3-cn195x2-pr60x3-pr63x3-cn144x2-pr64x3-cn140x3-cn196x2-pr203x3-pr160x3-cn158x3-cn203x3-pr210x3-rrF2x1-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2 -2014-08-21,North American Continental Champion,14,Ryan Hilton,http://ponyhead.com/deckbuilder?v1code=cn117x3-pr110x3-pr114x3-pr152x3-cn86x3-cn43x3-pr82x3-pr94x3-pr83x3-pr85x3-cn102x3-pr108x3-cn51x3-pr11x3-pr36x3-cn7x1-pr164x2-cn173x2-pr194x2-pr179x2-pr172x2 -2014-08-21,North American Continental Champion,15,Ivan Rojas,http://ponyhead.com/deckbuilder?v1code=pr11x3-pr85x3-pr82x3-pr83x3-pr108x3-pr118x3-pr206x3-cn117x3-cn98x2-pr94x2-cn86x2-cn118x2-pr210x2-pr79x3-cn80x3-pr130x2-cn112x1-pr152x1-pr89x1-cn7x1-pr165x2-cn185x2-pr163x2-pr179x2-pr194x2 -2014-08-21,North American Continental Champion,16,Thomas Burns,http://ponyhead.com/deckbuilder?v1code=pr203x3-pr160x3-pr209x3-pr152x3-pr210x3-cn153x3-pr197x3-pr159x3-pr200x3-pr63x3-pr53x3-pr106x3-pr98x3-pr64x3-pr61x3-rrF1x1-cn178x2-pr195x2-pr173x2-pr188x2-pr162x2 +2014-08-21,North American Continental Championship,1,Nation Morath,http://ponyhead.com/deckbuilder?v1code=cn144x1-cn134x2-cn153x3-pr209x2-cn140x3-cn132x2-cn203x2-pr152x3-pr210x3-pr159x3-pr106x3-cn114x2-cn43x3-prPF2x3-pr63x2-pr60x3-pr53x3-pr203x2-cn168x2-cn183x2-cn178x2-pr195x2-pr162x1-pr190x1-rrF1x1 +2014-08-21,North American Continental Championship,2,Paul Atherton,http://ponyhead.com/deckbuilder?v1code=pr159x3-cn157x2-pr114x3-pr118x3-rr2x3-cn47x3-cn41x3-cn51x3-cn43x3-cn42x1-cn80x3-pr79x3-pr72x3-pr206x3-pr11x3-pr197x3-rrF2x1-cn176x2-cn171x2-cn177x1-pr163x2-pr170x1-cn185x2 +2014-08-21,North American Continental Championship,3,Niko White,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn132x2-cn115x3-cn51x3-cn195x2-pr60x3-pr63x3-cn144x2-cn140x3-pr64x3-pr203x3-cn196x3-pr160x3-cn158x3-cn203x3-pr210x3-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2-rrF2x1 +2014-08-21,North American Continental Championship,4,Chris Ballew,http://ponyhead.com/deckbuilder?v1code=pr11x3-cn192x3-pr12x3-pr20x3-pr198x3-cn15x3-pr19x3-rr2x3-cn51x3-cn41x3-pr151x3-pr210x3-cn157x3-pr114x3-cn120x3-rrF2x1-pr168x1-pr172x2-pr181x2-pr176x2-pr171x1-cn171x2 +2014-08-21,North American Continental Championship,5,Charlotte White,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn51x3-cn115x3-cn132x2-pr192x2-cn176x2-pr60x3-pr63x3-pr64x3-pr203x3-cn140x3-pr177x2-cn167x2-cn179x2-pr160x3-pr210x3-cn158x3-cn203x2-cn195x2-cn196x3-cn144x2-rrF2x1-pr152x1 +2014-08-21,North American Continental Championship,6,Francis Marino,http://ponyhead.com/deckbuilder?v1code=pr60x3-pr53x2-pr56x3-cn65x3-cn42x3-cn51x1-cn196x1-rr5x3-pr114x3-cn104x3-cn109x3-cn106x3-cn108x3-pr96x1-pr98x1-pr209x3-pr106x1-cn34x1-pr126x1-cn157x3-rrF2x1-cn167x1-cn176x1-cn184x2-cn182x2-rr10x2-cn171x2 +2014-08-21,North American Continental Championship,7,Donald Barksdale,http://ponyhead.com/deckbuilder?v1code=pr79x3-cn80x3-cn76x2-pr72x3-pr206x3-pr65x2-rr2x2-cn47x3-cn43x3-cn51x3-pr197x3-cn25x1-pr114x3-cn115x3-pr118x3-cn104x3-pr107x3-cn198x1-cn176x1-cn177x2-pr172x2-pr163x2-cn185x1-pr185x2-rrF2x1 +2014-08-21,North American Continental Championship,8,Luke Wyman,http://ponyhead.com/deckbuilder?v1code=rrF2x1-cn34x1-cn51x2-cn42x3-pr56x3-pr63x2-cn65x2-pr66x1-cn106x3-cn113x1-pr114x3-cn124x1-pr106x1-pr126x1-cn108x3-cn109x3-cn104x3-pr96x1-pr98x1-pr209x3-cn157x3-cn115x1-rr5x3-rr10x2-cn171x2-cn182x1-cn181x2-rr8x2-cn167x1 +2014-08-21,North American Continental Championship,9,Adam McHale,http://ponyhead.com/deckbuilder?v1code=pr79x3-cn80x3-cn198x2-cn75x3-cn104x3-pr118x3-rr3x3-pr203x3-pr126x2-pr106x3-cn140x1-cn109x3-cn116x2-cn203x2-pr210x2-cn158x1-pr152x3-cn122x3-cnf2x1-pr174x2-cn185x2-cn167x2-pr188x2-pr175x2 +2014-08-21,North American Continental Championship,10,Donnie Rose,http://ponyhead.com/deckbuilder?v1code=cn108x3-cn65x3-pr209x3-cn51x1-pr114x3-rr5x3-cn106x3-cn109x3-pr96x1-pr56x3-pr60x3-cn196x1-cn157x3-pr98x1-cn104x3-cn42x3-cn43x3-cn34x1-pr126x1-cn5x1-cn176x1-cn184x2-cn182x2-rr10x2-cn171x2-cn167x1 +2014-08-21,North American Continental Championship,11,Erik Mooney,http://ponyhead.com/deckbuilder?v1code=cn1x1-pr11x3-pr19x3-pr10x3-cn192x3-cn15x3-pr79x3-cn80x3-pr151x3-pr118x3-pr206x3-pr140x2-pr67x2-pr115x3-cn120x2-pr198x2-pr13x1-pr14x1-pr210x2-cn185x2-pr163x2-pr171x2-pr176x2-pr167x2 +2014-08-21,North American Continental Championship,12,Nicholas Hattwick,http://ponyhead.com/deckbuilder?v1code=pr160x3-cn203x3-pr210x3-cn158x3-pr60x3-pr64x3-cn196x3-pr203x3-pr63x3-pr41x3-cn51x3-cn195x2-cn115x3-cn140x3-cn144x2-cn132x2-rrF2x1-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2 +2014-08-21,North American Continental Championship,13,Joe Harrington,http://ponyhead.com/deckbuilder?v1code=pr41x3-cn132x3-cn51x3-cn115x3-cn195x2-pr60x3-pr63x3-cn144x2-pr64x3-cn140x3-cn196x2-pr203x3-pr160x3-cn158x3-cn203x3-pr210x3-rrF2x1-pr192x2-pr177x2-cn167x2-cn176x2-cn179x2 +2014-08-21,North American Continental Championship,14,Ryan Hilton,http://ponyhead.com/deckbuilder?v1code=cn117x3-pr110x3-pr114x3-pr152x3-cn86x3-cn43x3-pr82x3-pr94x3-pr83x3-pr85x3-cn102x3-pr108x3-cn51x3-pr11x3-pr36x3-cn7x1-pr164x2-cn173x2-pr194x2-pr179x2-pr172x2 +2014-08-21,North American Continental Championship,15,Ivan Rojas,http://ponyhead.com/deckbuilder?v1code=pr11x3-pr85x3-pr82x3-pr83x3-pr108x3-pr118x3-pr206x3-cn117x3-cn98x2-pr94x2-cn86x2-cn118x2-pr210x2-pr79x3-cn80x3-pr130x2-cn112x1-pr152x1-pr89x1-cn7x1-pr165x2-cn185x2-pr163x2-pr179x2-pr194x2 +2014-08-21,North American Continental Championship,16,Thomas Burns,http://ponyhead.com/deckbuilder?v1code=pr203x3-pr160x3-pr209x3-pr152x3-pr210x3-cn153x3-pr197x3-pr159x3-pr200x3-pr63x3-pr53x3-pr106x3-pr98x3-pr64x3-pr61x3-rrF1x1-cn178x2-pr195x2-pr173x2-pr188x2-pr162x2 diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..6cbee9fb87b2c8046c77d193c01fb0ca08989d12 GIT binary patch literal 82944 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 MLO!781HJM817ZjZSpWb4 literal 0 HcmV?d00001 diff --git a/main.py b/main.py deleted file mode 100644 index 75e5732..0000000 --- a/main.py +++ /dev/null @@ -1,9 +0,0 @@ -from flask import Flask -app = Flask(__name__) - -@app.route('/') -def hello_ponyville(): - return 'Hello, Ponyville!' - -if __name__ == '__main__': - app.run(host='0.0.0.0', debug=True) diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..974186c --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mlpccg-web.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/meta/__init__.py b/meta/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/meta/__init__.pyc b/meta/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20b49d6cebc6dd147f3843b957eb4ab8c785ea94 GIT binary patch literal 135 zcmZSn%*&O$?niJk0~9ap?c6=l-v;>R*PCzF>FwbDjz)9#NxE#71TmfAH0tE~Q zFdPC(c&EF2p8w;;%#DOil~aiQp{fLRsUT3sSzk$}Cj>3(Fqykxa7<^!AHr_(%Arq- zwj%8Y^~c%;D!nz=);Dh4YTd8dzL{a3rQW{IZWole8}X78BionaJS#;h FegQCjQ(gc7 literal 0 HcmV?d00001 diff --git a/meta/management/__init__.py b/meta/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/meta/management/__init__.pyc b/meta/management/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..859abf5c770067056613b55bec404e2cedad988c GIT binary patch literal 146 zcmZSn%**xc$dBM;1}I1X8Urs`*<78hqG zCze#{J7wnS=jIe7C#UP?rj{h?Lx{w@#PrnM)Vvb?`1s7c%#!$cy@JXT4xoOU-29Z% NoK!oIEyY00004BBA-Vtn literal 0 HcmV?d00001 diff --git a/meta/management/commands/__init__.py b/meta/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/meta/management/commands/__init__.pyc b/meta/management/commands/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a39dec769e063de5ef53ed19f20f6ff02838174f GIT binary patch literal 155 zcmZSn%**xp$dBM;1}I1X8Urs`*<78hqG zCze#{J7wnS=jIe7C#UP?rj{h?Lx{w@#PrnM)Vvb?AJg5t zY><6&q#SuJPP_mI&Rn^0K!UGojPn9uyUShO_4`#-hkqOlfBogpNkQ9Bi2pCJ+!ct% zPfvw!a)qt`A=^hzHGetV4 z*F+nl=h+_Vh$cxN&dR^>NdoNrKFDeA%;UDM^G5qS;J5p8Yg?Oel>PwZ%oH!bES>+V z)u!_IaPqXhwoP7}W_!lAQd6{6i%g(c{Ut1si7fcd@?4a({t%0eYk8 zr{8HE((P~L6)gfMya#!ex`LquMWwFw1{ZYW9(KD?c^qw2F6P z`=s{?1!4#LxCcyN5ZVDt>APH}4Mpodt>Cz`{rxdrUINW;o`FmfuG)or50sG_zeUcC z3U}l8_`+0WU3y~y3(+Ui5M1Qxv^2MQ;eCW-K9CJp)-lG%&rgo)lVdHdqR}c9T4gG7 z+(Fm25=*-qK45ptDlZJT5KusIcBSn4W@|^78)M5^X>`Kn6zA;{dTgCzXZ5qP@TtkQ zu_+%*x3w=8rtnVW=Eh4DXRUD;tv|m-jA@T0IR)qKlDkxFyZpwaJRvFPE7~Q3Wag>8 zHVG?qf~K0uCbx6fd4!d=af07WG;RAs`VQNAm$hOLD`S#iM?%~=cH^tIHsghHt}Jr@ zSD=~kCQLYTnqkG6c)IIfq3e};y zuTIo3IK=u`CA-Y0QmE-vK%7qNR$o^rc*;X2xm}rRnSKQBZN&d^*eRpJuY==FtndvI zX^Hp2>qXwo+Yz1?Gr}{q1z_|74_At7O695Hd>Nw=5-^qP%Eyf$HIzc9513^a|63-~ VOP_Wae$H{pd^|(}?gw{*e*l@%ShN5D literal 0 HcmV?d00001 diff --git a/meta/models.py b/meta/models.py new file mode 100644 index 0000000..7ba7946 --- /dev/null +++ b/meta/models.py @@ -0,0 +1,25 @@ +from django.db import models + +class DeckListModel(models.Model): + name = models.CharField(max_length=200) + url = models.URLField(max_length=500) + + def __unicode__(self): + return self.name + +class TournamentModel(models.Model): + name = models.CharField(max_length=200) + date = models.DateField() + + def __unicode__(self): + return '%s (%s)' % (self.name, self.date.strftime('%Y-%m-%d')) + +class RecordModel(models.Model): + placement = models.IntegerField() + tournament = models.ForeignKey(TournamentModel) + decklist = models.ForeignKey(DeckListModel) + verified = models.BooleanField() + + def __unicode__(self): + p = str(self.placement)+("th" if 4 <= self.placement % 100 <= 20 else {1:"st",2:"nd",3:"rd"}.get(self.placement%10, "th")) + return '%s @ %s' % (p, self.tournament.name) diff --git a/meta/models.pyc b/meta/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc1dae3c8c6744daf40de9f8a5dc5ce73bedfa4 GIT binary patch literal 1880 zcmb_cO>f&q5S^uD$sfu`gEm191#%IfL5iZO4|H>gE(F6}$*WML!CevK=My5uLO~e^lBr-E%d-6`?T;#>HC$@iSVPn0}7dyDLFkCNeh~1RqbPIdUf?i>;r zG3h33q{(ycn&*0gJV(LKDm-R^s0D2ad#0m}8)dA9lC|cEJRIT*U&EkX zJE~~4RoMYXW{KQBPMP6I`5cFP={VdEEa>>f?s&O7wz}Naj5%!)ofa>|b{74L=!{Dj zmAeATTKntBa+%qT15#yhUJT@CuuqJPmXai=hY+C!F>R5JF z-FI*<6Gxif>&*>VYLL~*&u!}CmOgHCR7`iM$#-x@)FHb^X=HXDN@;uzCw7W6Ot7L9 z4mj-hUKwc~P|k4bL=w|J;`pf_ipLCq=m)ZIhnz3_c1!HG>|ve^uwb&i+YduLL8tn1CaY%VA zRUNuW)p=SKrK2)5I(JcZ9M^(T)>G!xR*T&3^#3>99i$077pAyLdCdQ`Tx4r~Uq?50 ztLgC-0t)VF(>gz|e{gRy_DsfHDt(oQ#h9)zrZvGq(^RggyJ5p7{@JyD=AHdqP0Q)> z1+KtK56sBiz~3l2N+}>Muw4}OyxFrayNO5ww3iiecK{~2D5-i^5VD^Bn{NJoOPW+j LH + + + + + + + + meta is magic + + + + + + + + + + + + + + + +
+
+

How good is your deck?

+

Curious how decks like yours have performed in tournaments?
Paste your ponyhead.com URL here and find out!

+

+

+
+ + + +
+
+

+
+
+ +
+
+
+

Deck archetypes

+

Very fuzzy data, based on past tournaments. The more the deck was played in tournaments, the more accurate this is.

+ + + + + + + {% load humanize %} + {% for avg, label, decks in ranking %} + + + + + {% endfor %} +
Archetype IDAverage placementExample decks
{{ label }}{{ avg|ordinal }} + +
+
+
+ +
+
+

Tournaments

+ + + + + + + {% if tournaments %} + {% for t in tournaments %} + + + + + + {% endfor %} + {% endif %} +
DateNameTop 8 Decks
{{ t.tournament.date }}{{ t.tournament.name }} + {% for d in t.decklists|slice:":8" %} + {{ d.name }} ({{ d.description }})
+ {% endfor %} +
+
+
+
+ +
+

© Yukkuri Games, 2014

+
+
+ + + + + + diff --git a/meta/tests.py b/meta/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/meta/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/meta/views.py b/meta/views.py new file mode 100644 index 0000000..fc1a7af --- /dev/null +++ b/meta/views.py @@ -0,0 +1,27 @@ +from django.shortcuts import render +from meta.models import TournamentModel +from mlpccg.CardDb import CARDDB +from mlpccg.DeckList import DeckList +from mlpccg.Clustering import Clustering + +def index(request): + tournament_models = TournamentModel.objects.all().order_by('-date') + tournament_data = [] + placements = [] + for tournament in tournament_models: + tournament_records = tournament.recordmodel_set.all().order_by('placement') + tournament_decks = [] + for record in tournament_records: + decklist = DeckList(name=record.decklist.name, url=record.decklist.url) + tournament_decks += [decklist] + if len(decklist.cards) > 0: + placements += [{'decklist': decklist, 'placement': record.placement}] + + tournament_data += [{'tournament': tournament, 'decklists': tournament_decks}] + + clustering = Clustering(records=placements) + ranking = [(int(avg), label, [decklist for decklist in clustering.clusters[label]]) for avg, label in clustering.ranking()] + + return render(request, 'index.html', { + 'ranking': ranking, + 'tournaments': tournament_data}) diff --git a/meta/views.pyc b/meta/views.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c37ebc34749879d4c47f8eb7df7e5a5eb67c02d GIT binary patch literal 1411 zcmbVMOK;Oa5dPLq;yh_VLV^%{%1eL^5f9+E!}!dM?{x^0#bpIfMDH$ za*(;JL>~6Lb*d2G(5EX%GBr9f zIg4ag>KmkgoG-Fjkjk0)Fps3Vb=-aD4~ILY&UuD1JbfQ)Q(Bs2*;NZ|WERh+A*b)q z?Xj6|eMA-mBm#+pYZ6?Z^ID(~m;!}kPZyUzkqZpRKTuSVSCG)P4j_R7s@AoJ%M5vy zToV)?Ocjxf+(S}B;vu5oQm#`qr>G;ZA+KX9@Up1EG+0TRoG+^4w1Vsaxr^9gJ7G59 z=oUjiuputa5BNIF9qUwKJO`9BsxLhpoWH=KX(OWCE)^9;gB#5oNIE?6aQq6N9289y zEtq@AZS}mha@qjNkB8$nxZ668DC3s+>{{UlMH^-lIjuv}c0h$%)PaMjjls1`w`pWJE+NBGNF2W=+41U;U;HGnvV7o<&-- zV@zvv**h_*Dt`)Qr$oGI-N~W5_euBdvT=g>B$1)fwue9|Tb?q??09lzc>BrTsdt8(u!Uv72J~b^ZdA C6)(X6 literal 0 HcmV?d00001 diff --git a/mlpccg-web/__init__.py b/mlpccg-web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mlpccg-web/__init__.pyc b/mlpccg-web/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..978e32d70ef1b32c21841fe0a26dbdb74301675c GIT binary patch literal 141 zcmZSn%**v;&5z(@1}I1X8Urs`*<78hqG zCze#{J7wnS=jIe7C#UP?rj{ha*yX87`tk9Zd6^~g@p=W7B^*GlHo5sJr8%i~APb6t Gm;nH#10RV1 literal 0 HcmV?d00001 diff --git a/mlpccg-web/settings.py b/mlpccg-web/settings.py new file mode 100644 index 0000000..1da064d --- /dev/null +++ b/mlpccg-web/settings.py @@ -0,0 +1,84 @@ +""" +Django settings for mlpccg-web project. + +For more information on this file, see +https://docs.djangoproject.com/en/1.6/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.6/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'iqk@e(3cavf&!ewvx_0t8m=p5kh(rl_=td&pe!afhu@fiu%j_w' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +TEMPLATE_DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.humanize', + 'meta' +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'mlpccg-web.urls' + +WSGI_APPLICATION = 'mlpccg-web.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.6/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + +# Internationalization +# https://docs.djangoproject.com/en/1.6/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.6/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/mlpccg-web/settings.pyc b/mlpccg-web/settings.pyc new file mode 100644 index 0000000000000000000000000000000000000000..522ed8e90cad80a368fd4188a0641b5a7ca91851 GIT binary patch literal 2240 zcmeHIUvt|;5MRZq-I}B=N!mh7JMIG=Gef0@Lg+A*iDE0kgDqz)nSfq2vhHl3qkq+% zV%pb!7d`;rjNy?7*t^8GX6hLR9y`eP>TY*``{#CVUHN0Xe(~#{P6$`eb$lPAR7>A;AucLm~FtUQd(@nTTOnwYd|XCRe{#PyRPUBn4pC^kWaw-0LVk|wt(z_ zw+&<$yqmx@U>iX8fZTzDE7P}tqM^I+76tdg`#OOwtCYLa=1Q8{;%@#8DQ8lc#e!YGipjqoL62^coLyY0|*2m@-7Mh<=VnXniU~#=kKPl7?I-%J{-Yn8pT8jD7vU5NXCjZY;bSm*&Nk zHpWF1H6q4EBOR}z3KD{jD9alcK~zxwZ+zu+Tyn(z!pG)cVD9YI`5|pS4}**GlgD&^ z@r(aVyog_BU!6~zdE~zog{lWj*fj|)4y=stVM2I_CE&rzX}nBR4oTy>QX)%d zn>|a^B%h9hA`<)>u4(eL;G%-7q1)neIvHHGgVB_m_n~k3qHmk>eEx6V#r@>}y?L8* z`lw#=eVo_6FE)^oay25dKujnNp;?YPKAo_Tueh#gew zb=vK&b!HAMztuGz$8y9LvIqUX>kkLrR^L7rw~=w?oOC3r+i96@r*Eq`W+_X=4V1P` z*OUP}LOSl6_Q}vZL5uyirQ~j>XZc>=wp40E%&fEj!d`B=`_F83F{Q-yE>m{VPfNzo zM3b;0swBoVjj1t{!xOLl8{>#2#??@e(|57PKiTEKlb*d+4!@04QbhDS88<&fQmt%h gk80IQbpt#=EF=;$LWl=oNEeg=DUD5W6gyRXX@NBl#e=c1!8t9e zm3;Z#`OEpv;rGS-`Riv@;kc&!ec;#CERr9A1~3AJfC*3pFd>Q%!tVuWBA6IO454Dw z6AWMykRenE89~Mvf{`as3~ZXBo?#F^KX9ot$SGFIjE~d5ypoWKe7G%%RA(Lep0ur+ zUMljteb*$yyJD778f}RI&ih`BqB6U7OJJYMo{~8`$lGLH+D)5Q zt$j_ow97e%+#iq!EOg0o@=&MO`Pk!v^JP!1)UIlGs-uV#PLmqJSE6&yF#J!FaEOz* zTMo0g)~Kvj&grV8&+Jj#%rx7o+T4tz9C@$SnJ<}cKgP?sGp+0!b?@7Bew3?VDdxc> GT8KXkN@rLA literal 0 HcmV?d00001 diff --git a/mlpccg-web/wsgi.py b/mlpccg-web/wsgi.py new file mode 100644 index 0000000..05ee4a9 --- /dev/null +++ b/mlpccg-web/wsgi.py @@ -0,0 +1,14 @@ +""" +WSGI config for mlpccg-web project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ +""" + +import os +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mlpccg-web.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() diff --git a/mlpccg-web/wsgi.pyc b/mlpccg-web/wsgi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7def1735fc9b7cb5fe83aec7291478ff278aa4f8 GIT binary patch literal 604 zcmYjO!EV$r5Vf=2Z52SORMfMNd!Vu4zyToyRm*A-Y$Z~Jw3n z>H*XA?XcT~@kkGu-C@m;&4-M`klj+G`8QPlcHkbci6Q&D=iG?iHTPBgYH%j#$Y z7ozQa4JBr2Iz<6jtq%|cu0U*Sl(p)@f>1#y(Rh7n;mE=otXQkg^psN#Xt7wRwzZ~I zXuMl2Nbh58;_0FGK)HSBPzRBc=9b$aJk-=aX~>gLA7+!YB0oJppUx(E@#XB~+vn48K-B+nvjB+3 zRbk92kIxAzz#@tjkNl5!BO9S8$X8KdLa`5h3f$Us-eF29lGCtMmlkoKj$8X#NmFN0 z^K0Mb2{Dhw>Bz?aAiScG=4(LK5JJ4c8+mM;ym#FIs)v{!tRFmUuW^sc-fmyyU5rD7 LQSy`@B>Vg?S&yoT literal 0 HcmV?d00001 diff --git a/mlpccg/CardDb.py b/mlpccg/CardDb.py index 043bc92..cadbc37 100644 --- a/mlpccg/CardDb.py +++ b/mlpccg/CardDb.py @@ -2,6 +2,7 @@ import json import os import urllib import logging +import time class CardDb: set_ids = { @@ -14,7 +15,7 @@ class CardDb: set_names = {} # generated - def __init__(self, json_path='cards.json', extra_path='cards_extra.json'): + def __init__(self, json_path='data/cards.json', extra_path='data/cards_extra.json'): logging.debug('init card database') for name, id in CardDb.set_ids.iteritems(): @@ -68,7 +69,7 @@ class CardDb: except IOError: logging.exception('failed') - def download_cards_json(self, json_path='cards.json', url='https://dl.dropboxusercontent.com/u/32733446/cards.json'): + def download_cards_json(self, json_path='data/cards.json', url='https://dl.dropboxusercontent.com/u/32733446/cards.json'): logging.debug('downloading %s from %s', json_path, url) try: urllib.urlretrieve(url, json_path) diff --git a/mlpccg/CardDb.pyc b/mlpccg/CardDb.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec143fa95bbe2ade83e07e6f3c30d307ddb0bd61 GIT binary patch literal 3367 zcmb_eO>-MX5bcrV580OGuf!1qmk5N2kXV3&QTuG@`+O@p$YFF7= zCpKjl6v>^xz?rICsN%$t|H2>O!VTW*mF&daFp_4}GdFJotN$WfG)^(K|HX~=jDaSbCGYhhr}NuwLMIs zo3$Yv5d4kLMmh{~%}u=Z=4*PaQjZ_d`PgM780sIeOxbx^ru-rNLEs4fM#U@2GE@q% z9LkJ|H!j|UynvoqS)wM;!kbhAo61Uzh&QDK_D?HO)V(v}&FbDUaW-pnP$SKu>m}(Z z{=QE9Zr~@r&b1;tg}F61O8q2^)9Oah-c7CYlEhAc=fthO>b0oqxKI0gtexQ=KlE)H zxM6iO4nef~+_o)|n;hB{yf59ZZ*3Vfo}0S$7Hnk~J2sB&h1cd9{z00!%4yM)BWOjm zH8dL$ljFP`7vw0fydgO%$jXzqWD8E}j7Vox zj&$>cjU_Egr^uas-dLY^3AWxFlH@x%!g1sMSrdtlC;DUX8YTLQ#N>b|%fYX@tOR|2 zmSZS@AH+`|$lPIqRB z7YIpS%E70~FG^+o@uD27FdkYa5;7Z6{J2yqN3es6-pR?ul_yus){~cl-xk-;$x%*C z3&l2Tld$@RdO3)Kv`Vj4>A$9H{ooRq!3w&Rfsh7i=qs@7ep3gQV7pO;!@wmScp4{e z7~c1+Enw!Vy=v1u23QRl~e!XFmj0-;KL|y@R+6 zT5kGneKm;c-LThcwQs^OZlA8NX*&t54WNVVvONlq@*m}v;l{Q z;BMA<#)c(?8F7gIDslu5-Ek4PUX7%~(&8{XDa_-ZA1R^1$}nI6Yq0nSEx(rrainq` z_2CunBlLF8X)1>)@FO%!Rm4o0JYYYMzLepOx{jhL-hKh`FMA!oVz0fk_Cg^$a9GG- zC!llv@w%3`0*lJwf`S)`zQD2uc7>%)iwZLO-GPPi6o5le9^oC#K1ACZxM4vG>6q+| zv4Hd)g5`P5|B;c*A2jD#e^_2T^G8(^kXD82PMpA54q;szM|bKb=LUy2*%4Ek3N>S& z2ATSJzlZYTJ9Vxh4)1^UMUuox=5%%5JCwofr84wzUD-mGV%DX)EK%omZ549vpxKM) z2Cgle3Y@!ub|qIb_BJ@XY1*@Q>UA$%^pd#Oj1Ts$pR`akfXT&H+^z4|mp;C|v~=s% z@+;3Ceca@+pZcz$*;RC}!h<1`M?}pH%6Ar5aN|}qH*lA}Quz`(aTjH7sM3Q%mW5Dt zCyBc!-eC$l^-gB`Bn*RQO26$VA>M^a;6Ke=aW-~%2G*R{#Pbky4^4wz%q+}0ho;c! z*BX|yMgt&4scm#)Z$HG);WN@<`gX3dqaM!t?5?vTHk~Rv9&oCpQva#&>8pcqw3pEh zL&uT+cPu}gD_<<;^;;}XW~Xs!26k3ShcL;E&4-N&Q;V;C?yRq`{vQgewN^6w++}9d N7yE?ie{-|<{sCT3n=JqU literal 0 HcmV?d00001 diff --git a/mlpccg/Clustering.py b/mlpccg/Clustering.py index e1fc959..a3abade 100644 --- a/mlpccg/Clustering.py +++ b/mlpccg/Clustering.py @@ -3,29 +3,26 @@ from sklearn.feature_extraction import DictVectorizer from collections import defaultdict import csv -import mlpccg +from mlpccg.CardDb import CARDDB +from mlpccg.DeckList import DeckList class Clustering: def __init__(self, records): - self.records = records self.decks = [] self.features = [] - self.features_alt = [] self.placements = {} self.clusters = defaultdict(list) - self.all_ids = mlpccg.CardDb.CARDDB._by_id.keys() + self.all_ids = CARDDB._by_id.keys() + self.labels = [] + self.records = records + self.vectorizer = DictVectorizer() - for record in self.records.all(): - if record['Decklist']: - decklist = mlpccg.DeckList(name=record['Name'], url=record['Decklist']) - self.features += [self.extract_features(decklist)] - self.features_alt += [self.extract_features_alt(decklist)] - self.decks += [decklist] - self.placements[decklist] = int(record['Placement']) + for record in self.records: + self.features += [self.extract_features_alt(record['decklist'])] + self.decks += [record['decklist']] + self.placements[record['decklist']] = int(record['placement']) - self.vectorizer = DictVectorizer() X = self.vectorizer.fit_transform(self.features).toarray() - self.af = AffinityPropagation().fit(X) self.labels = self.af.labels_ @@ -42,8 +39,6 @@ class Clustering: return features def extract_features(self, deck): - return self.extract_features_alt(deck) - features = { 'Blue': 0, 'Yellow': 0, 'Purple': 0, 'White': 0, 'Orange': 0, 'Pink': 0, 'Friend': 0, 'Event': 0, 'Resource': 0, 'Troublemaker': 0, 'Mane': 0, 'Problem': 0, @@ -66,7 +61,7 @@ class Clustering: return features def predict(self, decklist): - X = self.vectorizer.fit_transform([self.extract_features(decklist)]).toarray() + X = self.vectorizer.fit_transform([self.extract_features_alt(decklist)]).toarray() return self.af.predict(X)[0] def ranking(self): @@ -88,10 +83,3 @@ class Clustering: ranking += [(stats['avg'], stats['label'])] return ranking - -if __name__ == '__main__': - tournament_records = mlpccg.TournamentRecords() - clustering = Clustering(tournament_records) - - for placement_avg, cluster_label in clustering.ranking(): - print '%.1f - %s' % (placement_avg, '; '.join(list(set(map(lambda x: x.name, clustering.clusters[cluster_label]))))) diff --git a/mlpccg/Clustering.pyc b/mlpccg/Clustering.pyc new file mode 100644 index 0000000000000000000000000000000000000000..018b492d4957a06a2bf13909d9d78e340de2259d GIT binary patch literal 3690 zcmb_fOK%&=5w0FSBvO(|*^+H0&f4oZ2zP^6*u`cy2((I8((WM-#~1~xU1E*Fh|`pZ z91iK3rXm^A$@vla0ei_QrvSOmAUS6G%Q4xfF?(10$)Y1mY^vEI$-z{AnrrBM*zg}tY-=)Rdt#ux~|p6=%ku{ole6Rn8PLJ`Y`~Y=*uR* zM_{9<@Etaf*$}v@RPx<`QbPt>N-harF%QAS2eB(XYMa z+Fo*j+>#C~On7K;+9qpDc3%~9Al!xS=0Kn!_p_N*Px;zrFs}}u&x&bg)#Ar5Q|H%z z3m-nUYUt-_K2pXniqz(bGJbvrPgQ>iZ8@10eTyt0^1EU(JIU-g9@#?o{wB_?dO1=k z7m#`UN2NR`z;yXwlDlG(=^l46^|$FyG9*_GMGS`1C3oL*cNr?eAEHqiFXJ*od{ZR< zFVu$bf%66s>)Md>-+_>_%Li!0RLuMM+e8?6WbOr9K?^N^4?U`RY5o+|KgEC^kMAN9 zz?Q%Uf&tng(ijq(=27@R+#U7>9q{iQbs0pxZPl^E+n9&jZ0J)VO&{JzquQAkmQL?= zrtZvG6h1<813C%!Am``!l|-4CC#Fxk@rY%}Yk>m$Um?tC;KMuUYkv^}7z)soefZ*A z&8`(DSUi>s7*wRwLAt#_Bt(&8yf0u03PIL|(~umz6$y{?Po)afj+#>ZNsKYqg2-Bx zT@w6uFLD;pWsZuxo z%3ge46q7=oe~?XLr*WkO#U?sDixHqo4`+f@p^H#7LT!xVZdu(#ZgfM2O+p4prsk5$uA9dF#!BOEqw3`|G^41->L{~ukw2YR zRlX);=3gw#>$+$j-tZ5PF9rFJ4Z?ATY7n$}*;yg6Jkz?**G^9lP!t@V_|lUH&dH1a fc0w&Cc-NbHxCf-y^Bz%N^093c5pBattR4IZGuhM| literal 0 HcmV?d00001 diff --git a/mlpccg/DeckList.py b/mlpccg/DeckList.py index 7494109..0e0cba1 100644 --- a/mlpccg/DeckList.py +++ b/mlpccg/DeckList.py @@ -19,19 +19,50 @@ class DeckList: return self.name @property - def description(self): + def aspects(self): mane = None - colors = defaultdict(int) - + aspects = defaultdict(int) for card in self.cards: if card['type'] == 'Mane': - mane = '%s %s' % (card['title'], mlpccg.CardDb.set_ids[card['set']].upper()) + mane = (card['title'], mlpccg.CardDb.CardDb.set_ids[card['set']].upper()) + + elif card['type'] == 'Friend': + aspects[card['color']] += 1 + + elif card['type'] != 'Problem': + aspects[card['type']] += 1 + + aspects_sorted = sorted(aspects.iteritems(), reverse=True, key=operator.itemgetter(1)) + aspects_sum = float(sum([aspect[1] for aspect in aspects_sorted])) + aspects_filtered = [] + cutoff = 0.66 + amount = 0.0 + for aspect, value in aspects_sorted: + amount += value / aspects_sum + if amount < cutoff: + aspects_filtered += [aspect] + else: + break + + return (mane, aspects_filtered) + + @property + def description(self): + mane, aspects = self.aspects + if not mane or len(aspects) == 0: + return 'Unknown' + + return '%s %s %s' % (mane[0], mane[1], '/'.join(aspects)) + + @property + def ponyhead_link(self): + cards = defaultdict(int) + for card in self.cards: + cards[card['id'].replace('f', 'F')] += 1 - if card['type'] == 'Friend': - colors[card['color']] += 1 + cards = ['%sx%d' % (id, amount) for id, amount in cards.iteritems()] - colors_sorted = filter(lambda c: c[1] >= 6, sorted(colors.iteritems(), reverse=True, key=operator.itemgetter(1))) - return '%s %s' % (mane, '/'.join(map(lambda c: c[0], colors_sorted))) + return 'http://ponyhead.com/deckbuilder?v1code=%s' % '-'.join(cards) def parse_ponyhead_xml(self, path): logging.debug('loading decklist from xml') diff --git a/mlpccg/DeckList.pyc b/mlpccg/DeckList.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29d8135aace140b5647144bd502a13ba517f362b GIT binary patch literal 3957 zcmb_f&vPS36@ERE^}}n&t|a#2Vk>b$7LH%HKm3CypFB!1ukDludGDS5~*Wd%9o0dGGt)d#?R^ef4jD z{m(%x^G^-GAEH&q=n{O5WFkk)v5_OQSPx`alVM$sR&*thtRbVO95uzvPqyT!ElEuh z?5N8ZB3B~6K3b*JgH8iCr2oaI*D)BnYrN48`jgBhY3y7J^L-ni{UWX0Qoj`}-bbr) zbQYRHo7OX5kuRVSZZy2^s4f;)2YNMBZ|JnPm^O9l6~j}=Sb>Ja8A zKJJ%EbH1CeGaU7rCf)@SxxVv!6-uOb@6h&#Cx+tQB zsx^u8`V&K z9z%&lWM;(StKOOgGX2xsQ~Sq%l$kmVsM-OV&fwg~bReL;13M2_^xM#-y6o%>n?(8` zpvdzZy3CU+dh&{Z;Ngbs!~vF@a;Ns*Guv8n2AtrS--eT4*@m5musWU&+q@=eivv(s z$)MpH5er;hnP65Iw=V7_MQ2_1k2htuBA4JpQ+9q6$oW6~MwvCZW!9ABn#@3gHJP<# zdQUES=#D(bYplp@RW93diM}CQcd&soXev@ZG?z`vJvDL%QqHfNPtgv^g(i(~&{>D2 zdkRQ*F}6B**w3vZ-K8$G3d_nmN6&v;rZ!JJ4T`KNQ)0x?Tc4K2NoGenF6~nbLg>je zdvW^uAO7{rzrXg+dw3Q9>1^Ov@9Gt~4Y{bB)7*tbg5Kr9t-}YP-2REmhS(?t|Hz}s zcx+4EP!*-Ki6h8UXG^q^r|6?{VwDF4w)P#it@=HqQ@j#RQ_dhO`p&=SWYi)46y~bn zh{oUx_N%dtotMfG0Pigqqxt95wbABYMCL_1Gd{jk)G{e=F&b+m5>-#2d}4)E_4^Aev1D}hFZ8ctEY z2Rz+F=c57>9Lav9; zuky3J_-$UbuyC{5)vpH^5!UTc9eo>hQ)Y8@&ag;x|A?xF-&t&WZo|zpUKN+=*ri2& z81{Px0HS_xZZKGiHbH8Jkzk{%Ks0>RHOg$u zAqWD4A#YzHzaHOEe%A!i0`@~#0_(xqZ3c*kyaHhg0Rtfphj1yZO7ry)CP9M)ngH6` zf2^jgsO!yYdNZls#OR50>JEV1Rir?=xGvG3okRKzVU3Y4nh zHcoq89`vKA;7|xA+w8`O+Fg) zUbO>d5tNcNKi#EIG89_7gR&UyqEOH@zSr%>h(cY~AZlEVAcKCI*`&kJq(LhyPER32 zLrP*#CZ~#xj~?lQRxP>>v9K%(r{h7IC;co_emOh!;iz&Tg7@Zi$PT~73p70ZJlx;E zuLn;qA}xp*gzYr8N*s?G?o@%}zI&pB<#iTG18ml?%okD_l}7UA^tmAuvRYG?G7O7Z z4{B!1ylvLaEmJd!72;$W@BV_xSF!Rtg$1|?;`(?8r*fk1Q;cXe$t86;H*VYaR< zvo*qJopGTK+`$kmPZU)?hyo=nA5`Y6z)MZeKOtVOFYuz}FYy{Y0~wOASG|t@8<07< z*rk^VBUYA-2=8lQAO4uH$oW*6uM{cOI7@wI4wvo^KU_S8~Yi> zA!!c*#M-@&JeeP1thmut&85#g3GebC<-|pnp{7E9t$Yp0$nML&y$4$IdAL!n7xRW{ W()YZ*KcH9z{~8LPmr?qx1^)x4dKO;* literal 0 HcmV?d00001 diff --git a/mlpccg/TournamentRecord.py b/mlpccg/TournamentRecord.py deleted file mode 100644 index 072acd2..0000000 --- a/mlpccg/TournamentRecord.py +++ /dev/null @@ -1,17 +0,0 @@ -import csv - -class TournamentRecords: - def __init__(self): - self.records = [] - self.from_csv('tournaments.csv') - - def from_csv(self, csv_path): - with open(csv_path) as f: - reader = csv.DictReader(f) - self.records = [row for row in reader] - - def add(self, record): - self.records += [record] - - def all(self): - return self.records diff --git a/mlpccg/__init__.pyc b/mlpccg/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35dc89165c8b13b9b120b3b9d6b98498fa3224f6 GIT binary patch literal 137 zcmZSn%*)l|^gTG40SXv_v;z - - - - - - - - meta is magic - - - - - - - - - - - - - - - -
-
-

Hello, world!

-

This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.

-

Learn more »

-
-
- -
- -
-
-

Heading

-

Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.

-

View details »

-
-
-

Heading

-

Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.

-

View details »

-
-
-

Heading

-

Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

-

View details »

-
-
- -
- -
-

© Company 2014

-
-
- - - - - - - -- 2.30.2