From 1d3d3c8de29385b7066ce6d7f6a2d32be7bea043 Mon Sep 17 00:00:00 2001 From: nguyen-alex Date: Fri, 6 Mar 2020 22:43:42 -0600 Subject: [PATCH] added leaderboard --- leaderboard/README | 13 ++ leaderboard/db.sqlite3 | Bin 0 -> 172032 bytes leaderboard/leaderboard/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 157 bytes .../__pycache__/admin.cpython-36.pyc | Bin 0 -> 193 bytes .../__pycache__/admin.cpython-37.pyc | Bin 0 -> 198 bytes .../__pycache__/apps.cpython-36.pyc | Bin 0 -> 378 bytes .../__pycache__/apps.cpython-37.pyc | Bin 0 -> 383 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 1104 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 1109 bytes .../__pycache__/urls.cpython-36.pyc | Bin 0 -> 1109 bytes .../__pycache__/urls.cpython-37.pyc | Bin 0 -> 1114 bytes .../__pycache__/views.cpython-36.pyc | Bin 0 -> 2280 bytes .../__pycache__/views.cpython-37.pyc | Bin 0 -> 2285 bytes leaderboard/leaderboard/admin.py | 3 + leaderboard/leaderboard/apps.py | 5 + .../leaderboard/migrations/0001_initial.py | 42 ++++++ .../migrations/0002_remove_agent_game.py | 17 +++ .../migrations/0003_auto_20200219_2352.py | 18 +++ .../migrations/0004_auto_20200220_0006.py | 35 +++++ .../leaderboard/migrations/0005_agent_game.py | 34 +++++ .../migrations/0006_auto_20200220_2208.py | 26 ++++ .../leaderboard/migrations/0007_agent_rank.py | 18 +++ .../migrations/0008_auto_20200221_2307.py | 18 +++ .../migrations/0009_auto_20200224_0216.py | 67 +++++++++ .../migrations/0010_auto_20200224_2034.py | 38 +++++ .../migrations/0011_auto_20200225_0146.py | 34 +++++ .../leaderboard/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1093 bytes .../__pycache__/0001_initial.cpython-37.pyc | Bin 0 -> 1098 bytes .../0002_remove_agent_game.cpython-36.pyc | Bin 0 -> 521 bytes .../0002_remove_agent_game.cpython-37.pyc | Bin 0 -> 516 bytes .../0003_auto_20200219_2352.cpython-36.pyc | Bin 0 -> 603 bytes .../0003_auto_20200219_2352.cpython-37.pyc | Bin 0 -> 598 bytes .../0004_auto_20200220_0006.cpython-36.pyc | Bin 0 -> 930 bytes .../0004_auto_20200220_0006.cpython-37.pyc | Bin 0 -> 925 bytes .../0005_agent_game.cpython-36.pyc | Bin 0 -> 994 bytes .../0005_agent_game.cpython-37.pyc | Bin 0 -> 989 bytes .../0006_auto_20200220_2208.cpython-36.pyc | Bin 0 -> 692 bytes .../0006_auto_20200220_2208.cpython-37.pyc | Bin 0 -> 687 bytes .../0007_agent_rank.cpython-36.pyc | Bin 0 -> 593 bytes .../0007_agent_rank.cpython-37.pyc | Bin 0 -> 588 bytes .../0008_auto_20200221_2307.cpython-36.pyc | Bin 0 -> 618 bytes .../0008_auto_20200221_2307.cpython-37.pyc | Bin 0 -> 613 bytes .../0009_auto_20200224_0216.cpython-36.pyc | Bin 0 -> 1219 bytes .../0009_auto_20200224_0216.cpython-37.pyc | Bin 0 -> 1214 bytes .../0010_auto_20200224_2034.cpython-36.pyc | Bin 0 -> 1004 bytes .../0010_auto_20200224_2034.cpython-37.pyc | Bin 0 -> 999 bytes .../0011_auto_20200225_0146.cpython-36.pyc | Bin 0 -> 958 bytes .../0011_auto_20200225_0146.cpython-37.pyc | Bin 0 -> 953 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 163 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 168 bytes leaderboard/leaderboard/models.py | 30 ++++ .../leaderboard/static/leaderboard/main.css | 84 +++++++++++ .../templates/leaderboard/about.html | 22 +++ .../templates/leaderboard/base.html | 85 ++++++++++++ .../templates/leaderboard/blackjack.html | 36 +++++ .../templates/leaderboard/cfr.html | 33 +++++ .../templates/leaderboard/doudizhu.html | 36 +++++ .../templates/leaderboard/dqn.html | 33 +++++ .../leaderboard/getting_started.html | 22 +++ .../templates/leaderboard/home.html | 22 +++ .../templates/leaderboard/leducholdem.html | 31 +++++ .../templates/leaderboard/limitholdem.html | 36 +++++ .../templates/leaderboard/mahjong.html | 36 +++++ .../templates/leaderboard/nfsp.html | 33 +++++ .../templates/leaderboard/nolimitholdem.html | 36 +++++ .../templates/leaderboard/uno.html | 36 +++++ leaderboard/leaderboard/tests.py | 3 + leaderboard/leaderboard/urls.py | 18 +++ leaderboard/leaderboard/views.py | 69 ++++++++++ leaderboard/manage.py | 21 +++ leaderboard/media/RLCard.jpg | Bin 0 -> 111816 bytes leaderboard/media/RLCard.png | Bin 0 -> 7446 bytes leaderboard/media/default.jpg | Bin 0 -> 4687 bytes leaderboard/media/profile_pics/default.jpg | Bin 0 -> 17165 bytes .../media/profile_pics/default_cqLOpRI.jpg | Bin 0 -> 4687 bytes leaderboard/research_env/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 153 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 158 bytes .../__pycache__/settings.cpython-36.pyc | Bin 0 -> 2510 bytes .../__pycache__/settings.cpython-37.pyc | Bin 0 -> 2515 bytes .../__pycache__/urls.cpython-36.pyc | Bin 0 -> 1512 bytes .../__pycache__/urls.cpython-37.pyc | Bin 0 -> 1517 bytes .../__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 566 bytes .../__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 571 bytes leaderboard/research_env/settings.py | 130 ++++++++++++++++++ leaderboard/research_env/urls.py | 35 +++++ leaderboard/research_env/wsgi.py | 16 +++ leaderboard/tests.py | 118 ++++++++++++++++ leaderboard/updateDataBase.py | 126 +++++++++++++++++ leaderboard/users/__init__.py | 0 .../users/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 146 bytes .../users/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 151 bytes .../users/__pycache__/admin.cpython-36.pyc | Bin 0 -> 260 bytes .../users/__pycache__/admin.cpython-37.pyc | Bin 0 -> 265 bytes .../users/__pycache__/apps.cpython-36.pyc | Bin 0 -> 503 bytes .../users/__pycache__/apps.cpython-37.pyc | Bin 0 -> 508 bytes .../users/__pycache__/forms.cpython-36.pyc | Bin 0 -> 1428 bytes .../users/__pycache__/forms.cpython-37.pyc | Bin 0 -> 1433 bytes .../users/__pycache__/models.cpython-36.pyc | Bin 0 -> 1070 bytes .../users/__pycache__/models.cpython-37.pyc | Bin 0 -> 1075 bytes .../users/__pycache__/signals.cpython-36.pyc | Bin 0 -> 706 bytes .../users/__pycache__/signals.cpython-37.pyc | Bin 0 -> 711 bytes .../users/__pycache__/views.cpython-36.pyc | Bin 0 -> 1240 bytes .../users/__pycache__/views.cpython-37.pyc | Bin 0 -> 1245 bytes leaderboard/users/admin.py | 4 + leaderboard/users/apps.py | 8 ++ leaderboard/users/forms.py | 26 ++++ leaderboard/users/migrations/0001_initial.py | 25 ++++ leaderboard/users/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 911 bytes .../__pycache__/0001_initial.cpython-37.pyc | Bin 0 -> 916 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 157 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 162 bytes leaderboard/users/models.py | 21 +++ leaderboard/users/signals.py | 15 ++ leaderboard/users/templates/users/login.html | 25 ++++ leaderboard/users/templates/users/logout.html | 13 ++ .../users/templates/users/profile.html | 28 ++++ .../users/templates/users/register.html | 25 ++++ leaderboard/users/tests.py | 3 + leaderboard/users/views.py | 42 ++++++ 124 files changed, 1750 insertions(+) create mode 100644 leaderboard/README create mode 100644 leaderboard/db.sqlite3 create mode 100644 leaderboard/leaderboard/__init__.py create mode 100644 leaderboard/leaderboard/__pycache__/__init__.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/__init__.cpython-37.pyc create mode 100644 leaderboard/leaderboard/__pycache__/admin.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/admin.cpython-37.pyc create mode 100644 leaderboard/leaderboard/__pycache__/apps.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/apps.cpython-37.pyc create mode 100644 leaderboard/leaderboard/__pycache__/models.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/models.cpython-37.pyc create mode 100644 leaderboard/leaderboard/__pycache__/urls.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/urls.cpython-37.pyc create mode 100644 leaderboard/leaderboard/__pycache__/views.cpython-36.pyc create mode 100644 leaderboard/leaderboard/__pycache__/views.cpython-37.pyc create mode 100644 leaderboard/leaderboard/admin.py create mode 100644 leaderboard/leaderboard/apps.py create mode 100644 leaderboard/leaderboard/migrations/0001_initial.py create mode 100644 leaderboard/leaderboard/migrations/0002_remove_agent_game.py create mode 100644 leaderboard/leaderboard/migrations/0003_auto_20200219_2352.py create mode 100644 leaderboard/leaderboard/migrations/0004_auto_20200220_0006.py create mode 100644 leaderboard/leaderboard/migrations/0005_agent_game.py create mode 100644 leaderboard/leaderboard/migrations/0006_auto_20200220_2208.py create mode 100644 leaderboard/leaderboard/migrations/0007_agent_rank.py create mode 100644 leaderboard/leaderboard/migrations/0008_auto_20200221_2307.py create mode 100644 leaderboard/leaderboard/migrations/0009_auto_20200224_0216.py create mode 100644 leaderboard/leaderboard/migrations/0010_auto_20200224_2034.py create mode 100644 leaderboard/leaderboard/migrations/0011_auto_20200225_0146.py create mode 100644 leaderboard/leaderboard/migrations/__init__.py create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0001_initial.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0002_remove_agent_game.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0002_remove_agent_game.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0003_auto_20200219_2352.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0003_auto_20200219_2352.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0004_auto_20200220_0006.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0004_auto_20200220_0006.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0007_agent_rank.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0007_agent_rank.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0010_auto_20200224_2034.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0010_auto_20200224_2034.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0011_auto_20200225_0146.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/0011_auto_20200225_0146.cpython-37.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 leaderboard/leaderboard/migrations/__pycache__/__init__.cpython-37.pyc create mode 100644 leaderboard/leaderboard/models.py create mode 100644 leaderboard/leaderboard/static/leaderboard/main.css create mode 100644 leaderboard/leaderboard/templates/leaderboard/about.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/base.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/blackjack.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/cfr.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/doudizhu.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/dqn.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/getting_started.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/home.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/leducholdem.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/limitholdem.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/mahjong.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/nfsp.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/nolimitholdem.html create mode 100644 leaderboard/leaderboard/templates/leaderboard/uno.html create mode 100644 leaderboard/leaderboard/tests.py create mode 100644 leaderboard/leaderboard/urls.py create mode 100644 leaderboard/leaderboard/views.py create mode 100755 leaderboard/manage.py create mode 100644 leaderboard/media/RLCard.jpg create mode 100644 leaderboard/media/RLCard.png create mode 100644 leaderboard/media/default.jpg create mode 100644 leaderboard/media/profile_pics/default.jpg create mode 100644 leaderboard/media/profile_pics/default_cqLOpRI.jpg create mode 100644 leaderboard/research_env/__init__.py create mode 100644 leaderboard/research_env/__pycache__/__init__.cpython-36.pyc create mode 100644 leaderboard/research_env/__pycache__/__init__.cpython-37.pyc create mode 100644 leaderboard/research_env/__pycache__/settings.cpython-36.pyc create mode 100644 leaderboard/research_env/__pycache__/settings.cpython-37.pyc create mode 100644 leaderboard/research_env/__pycache__/urls.cpython-36.pyc create mode 100644 leaderboard/research_env/__pycache__/urls.cpython-37.pyc create mode 100644 leaderboard/research_env/__pycache__/wsgi.cpython-36.pyc create mode 100644 leaderboard/research_env/__pycache__/wsgi.cpython-37.pyc create mode 100644 leaderboard/research_env/settings.py create mode 100644 leaderboard/research_env/urls.py create mode 100644 leaderboard/research_env/wsgi.py create mode 100644 leaderboard/tests.py create mode 100644 leaderboard/updateDataBase.py create mode 100644 leaderboard/users/__init__.py create mode 100644 leaderboard/users/__pycache__/__init__.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/__init__.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/admin.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/admin.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/apps.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/apps.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/forms.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/forms.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/models.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/models.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/signals.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/signals.cpython-37.pyc create mode 100644 leaderboard/users/__pycache__/views.cpython-36.pyc create mode 100644 leaderboard/users/__pycache__/views.cpython-37.pyc create mode 100644 leaderboard/users/admin.py create mode 100644 leaderboard/users/apps.py create mode 100644 leaderboard/users/forms.py create mode 100644 leaderboard/users/migrations/0001_initial.py create mode 100644 leaderboard/users/migrations/__init__.py create mode 100644 leaderboard/users/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 leaderboard/users/migrations/__pycache__/0001_initial.cpython-37.pyc create mode 100644 leaderboard/users/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 leaderboard/users/migrations/__pycache__/__init__.cpython-37.pyc create mode 100644 leaderboard/users/models.py create mode 100644 leaderboard/users/signals.py create mode 100644 leaderboard/users/templates/users/login.html create mode 100644 leaderboard/users/templates/users/logout.html create mode 100644 leaderboard/users/templates/users/profile.html create mode 100644 leaderboard/users/templates/users/register.html create mode 100644 leaderboard/users/tests.py create mode 100644 leaderboard/users/views.py diff --git a/leaderboard/README b/leaderboard/README new file mode 100644 index 0000000..1475a87 --- /dev/null +++ b/leaderboard/README @@ -0,0 +1,13 @@ +To run the leaderboard server: + +Make sure Django is installed: +- pip install django + +Make sure rlcard is installed: +- git clone https://github.com/datamllab/rlcard.git +- cd rlcard +- pip install -e . + +Run server: +(Make sure you are in the same folder as manage.py) +- python3 manage.py runserver diff --git a/leaderboard/db.sqlite3 b/leaderboard/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..ee8d71ae1b58b2ed58abba465a58f998e1a9e5ee GIT binary patch literal 172032 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 literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__init__.py b/leaderboard/leaderboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/leaderboard/leaderboard/__pycache__/__init__.cpython-36.pyc b/leaderboard/leaderboard/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4813bc9310df9d9ec40d7041d2aa172f67e69c7 GIT binary patch literal 152 zcmXr!<>lf~PL5*$g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#cn8er~FMVoqv> zetKq!eo;2KczG$)edBQF%UBV E00itM&;S4c literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/__init__.cpython-37.pyc b/leaderboard/leaderboard/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2c4d3afa8a5414adbb4796c0feb59e1c35fd2c3 GIT binary patch literal 157 zcmZ?b<>g`k0=pkxaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpd1DXFBh#3IQlPA&u literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/admin.cpython-36.pyc b/leaderboard/leaderboard/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a32b3c1c820f122de5d6434669e03b3e998f1390 GIT binary patch literal 193 zcmXr!<>lf~PL8u@U|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#hRFso0;dQ$rQzxl9ia3p0AgjpI1_pnN$QaU?oElGmrukznt_l@^e%56LV54^wTp- v^ow$m6N^%Gb5aviQj3!Efoy$TY_KJI1(mlrY;yBcN^?@}7=gwX12F>tMOZN! literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/admin.cpython-37.pyc b/leaderboard/leaderboard/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a1a41cdeeaa60a4e4c68b7ac3c86411532114e5 GIT binary patch literal 198 zcmZ?b<>g`k0=pkxarQv^F^B^LOhASM5Elyoi4=wu#vF!R#wbQch7_h?22JLdKv4!w z##^k3DY=<>ews{Cd?{IpdFlCj$@zIDMVU!OAOlu16fpxSF!9S-KO;XkRX;H&wL(8V zvqZlrCpobwMK>okF(tJqDIdtzFG?*=O)N^zh)>Nc(?^y7+oD%cd5gm)H$SB`C)JJ- KXzphqW&i*}B{LiV literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/apps.cpython-36.pyc b/leaderboard/leaderboard/__pycache__/apps.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6b44eeff535aa3ef58c1ac4a5e977598a05a5e6 GIT binary patch literal 378 zcmZ`#y-ve05I)C2a{nZF10<#l)B`I*tr%EP7d8)AZq9@vCk_skV1}3BmAo?X3QU|6 zpj|lWK7YRN{&Z)v*;t&Ew*~+{$p0)Swjl402@sGusF`96t^hOSZ-CsgSFSS5Z=g8% zq%0^{94*`S(l>XTs!WkzV?-9@-64Sm#So~HDUKOc^LTV^4cf5wCg4!6CTS2)$FbJ6$E{0zs`ca6xF01??>huRQ+oJX%6ng1X`FqQ)#gbCSJH^nz25RaZrZk+ vw=aQHvviFvBM_|ruW089KA5KR^OP5o)+@W&0~?VL#rd%CMY==ZXUe|;JqlYc literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/apps.cpython-37.pyc b/leaderboard/leaderboard/__pycache__/apps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ff1e31362bf909a0df725fcb3cb3eeaacf86088 GIT binary patch literal 383 zcmYjN%}&EG40f6#b$=4P0oNY3ya1ZUI3OXk3%4GKLY;L(X;Tu0;0!OrE9J_GH$a?l zTBgmC?a%)FCodXJK&JwpX@UZ>ut9_QD7(Nc|}p4FyA>PF8SCsGEngTdh#L2dfb1A|6Zmv{UAvNu&P+m(iBa{4T}D)>LK~Bh%HUYM9u&N%F&z>$+|&{_ISStAbCM;O7(U$3%)5lkiw@ z23#Iih$sKU9sL`p7gG0E_pKhI2uVyZQ@i`R*_{R6_EB$lWo!X}#IjNuWjC;M#X6 zM_$Pi5)!9<1x}2et{S0Q^5pZ(cxF7`WT)4Q39g;52Ooa9g#0mw>t6-wAkv9=YFK=Ap)i05!pt#s}veNy7z3ASu+Jmyci@ zcUhnigi#>O5$=%(6r2mne8d4}!d&2AxGZehq89ETjv;_hbT5-11S0h9UFkXyUpTDa z@?L>1R+ec0*+dl8f?{qgFa+_D*Ron*GspxtuHR2nSI0AcmO(zrt5WwtjPn_n*@@(1 zQ7ZF*1)w-sI!aMYs;Lg@B0sH#bztuB%_w!0>9EBOkMnoA>VxS;vAAMrNzkyy9~AI>}F>)=k|;{2dOa^O+cMDb5DikAae7 zuHbu%d4K|G{`zRus&{f)Qq3t|jza5p_evL9{{$i&kdF3DA5;euBfSlMT|8J0 zzx4J6)Z=?E=MwIVS({$w+kUdH5;!L34{>dd(w<7p-JTKV;g(%>%b+zQZlhp0g<9#yQe$Y{ZqqTm8-*l7Xfq&2pKY-cQ+hwi{ZxDX3( zSko5}kYB`lX1IQXL;l1G2snad4s#p=9dJb_ zbD8T9?tsVLjR#%meRq-iNL}y^4Ul>;G!!89VPq&o@?mUff;51sp&8N;jttF_0ys8w zf;56tLuW`KoEy488pEZbE2Ifr8+w8?g{PY0kj>!Pd$M?bk7pwbr}4H?mE1djq5C=I zUt~knRPYFRxhkR(mPwIu?U_dzSG{Oe)D=}T+v7n~rGTqb9=+1XeUiwrky1p&j zztuuJGPujzE-1WP95n%KqC75c>QczEgI!a0^@LZ5G@fo0)_rIOHrN%K`Hxj(fmI)b zf7xYWE2FG$^2J=t2%GGknR)t9%*C*oi-9!(hJ$@v@iLb`NIBFY>FM`ds$-&&;9qH+ rRv1AM$X6`JBQyt+h1iD literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/__pycache__/urls.cpython-37.pyc b/leaderboard/leaderboard/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f1968c6900dac9eceb0d961bce6d87aaf5aaa6a GIT binary patch literal 1114 zcmZvb%XZT+5QgR0xyQLQy|>VAvq<#<91f=s&<#5+=utAN?cht0>;irV9)uTS;Vr8^ z0<0JXCCDN2k&eHAM)qiCbnp8;g5&nr!-uIy$WIO1F~OI2IMokafPfQ|#9@v@paE{& zNL=PRL^$9HcjZA7THjoxHc}HhhPp^C=o#uGwP9e$N9w@P&(%>DQFQqv z>%Y}PJu>)|)?H9|m>pGpSn)K-?g|+z*}$%mO}*e1B9*5bg*7+Lz`DCav(C1PtZ&r^ z;a_%{U&|W4?MutIHA*Ypakw`(JX-nV`NB>l;a3T44xTEqf7RvnpeN29>nDY^m+I)%vZ^pdz;0Ng!uy{o~_TmyDS zhwaBn0Z5D8G`LwEZbY1`^kpbcz7f6{=K{6Q1nM+0r%l;6ZQ6~U-ItuCbG_alO|$V{ zx<3>uT|xpUsLD!v-B3x?b&7TV%9&EjWj0TLKx1d(oHB8ddgohnebP8b^PAT8&TGp1 zd{PG^3mNR;Z)|aa-2O_{qN$I_@q#Iz@c(6+Soz~Cm+VXQRf73#hJ3#uXLsa0i=6ZF9D;n3k_ekc}Ay}abEj=Za zl>D7*sqz=7m^sJEIz-|EciNrZz1jJ`+x>R-S*bLo(erco=IsxgEO*9_L5(dc@fWH< z1KrmGy`}3K7-0HFV7AP(ZBg55S=83R_U)DpIdDE{tsLZ`K-PgND3Z;?G?d5|pbQnV zQ&5E&vPG!DEZJ$8gL$$gSb#;cWmtk`vK3f?RkBrBgIi>0U>$Cgt%1F()i=(FomSVA z9EuPGp6R2m{j?)ON#oWFHxNyahxuV^QrV^w^Uq7|g#PW+pjbw8IPVLWqO>Cyq0x;3 zvDuY@U)PaWgQ7Vo4hJHZ-!*h-z4fVrO zPrQ#e4?ZLo197;RQ8XP3RA*(ppoVnY(Lhd8#vBDp$&RW#brU;vEK+j}$xD$Hazlme z2q}AEXD^m6N&y+bD_5pe6dFt^D~%PEM%#D2cYP`u2ox@yXBFt_8$d6s&=3uvH|!2F zAm_)viwbZ_1!e_UR8oDePy=+S_4TjDH?60C)TK#kHBR(Xlk{pfTRE3y9uL=4LcV~3 z*NuD-!HAQE95QjDc3*fhPE6PLM~XI5c_fY(g;E^Lt2!wvp;jqG%yBfMY~T#ptQ$2+ zt{3#AN^X3%t`%z0zjVLD1kO)L?FR7c>e_^n5;4P$l_n80!DOBd_v3@HQ0W%ZuuN5w+wb{OpsG`>@>kB3N-nc_`a>E!7iZ1DW$ImQ z&CN;U0?luk+dHo*@$*R?PAsIikAJYmC35>KRgT zrp#xij#*;)eBS^I_^kmP&Dg%Nd>h!2(YNm?$LKTFOrubWGRm_;HPRd~DGq0PZ}qgu z*`-25VBs|v`)i{kXfkN^9DhkO?C(8L2WuJ)Y z&eEAobpdBYm<01g%&@3Wf+&p2LfJysdcB^Y0L?BW465=e&&#ubZWK#Ytjv9`kH79c zL~7c;MF;AeugaEP;#783*I|ECxk0rY1gaSX1iMI({B{t0xe$r&fg&f$qLMUFZNNEZ zfY~gcIyz!ZkwcDO%C5E_)CUwX4UUM&(7=_tKlDh%1 z$iiGPI8koZ9DTdW8IO*}qsa&5jsTWP`5c#D_IE?RCg#fgIv$?oDGo(~mqSu;D3cj! zw*5er;s5;me`UC{v-2icwmq0%N&PcAG>cbcT*eva++=La+_LI-Z}m1`Xpcsf({CuR u?q~ofm14C>&;KkAs=Fx$t6rsMsB-U{s=aO6Q0}|>lHO~r3td*vbgkd(wmF#q literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0001_initial.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e75b897523a72f8fa4ec86d33f262b321d62bfd GIT binary patch literal 1098 zcmZuw&2rN)5VmDGw)4}bKfrL|$dChZxid^dLOU6zJy5v#fJe=49UI3EvRm3-={4^F zM;?I(;2juUIrSAdv9c3dm`bDd?&{lJ?I-JHr_(fOeE)Iq{>nCtU)op=PRcH=qE7-0 zFjHe@2IhcnkA{MGTq? zR-s#WqTA?vX?`{SL3Zv$b|`NP)@ZIT7}e>L-NsI`mN?0J(uED!)c(j?R@{ItZ2gDX z))=_Aup%C8!hPc7f$|PkM7&k@Ai}IvEQUSB#-korZE;%W;Y6Y+5maj~ zUV$m__B3i02iiaS~$+h2r}ANP0UAKc0$I_du2t zXK_g!s5amnGr(*TVQ^&ivaOH;={N+1Ys(F8l7!FQk5r4z1!b372ukIX4;G zHn*+%+g*LlM_Qv<#q=7=t6S>BaYb3p(!;;beswuTf7PsfqI=QxZn~;9pM1)FUf}S8bI5>#HlWacajD4~_^C`X}Z;lCo0oSbLDd+5lfd}G^fk3|WUPbDG zf6wCJi~3m1ZB!PyQEgFIP3B5l`$LE<<-lmPpYv3pzYIWt55c=fc@KI-7}~+@mdOq^ zDnPTSl>s}NOeSZtsEW2w+6F4esrIimm!xMC$wIcIka9B|(lxX72z ztD8FDJ+RpSra2aK6O~1-Wn0u$liAkJ{sAIOIWSt~IZs{mmc9iA@7**CUvBoV)&>-8MU+MH60ag-m-T(jq literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0003_auto_20200219_2352.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0003_auto_20200219_2352.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b22030fb83df54bdeda8bbe129196e69ef8f953c GIT binary patch literal 603 zcmZ`$u}>CH1|>@WLre6lBWyIlfcz%{FR!E3MZIJ;or zfp}&hkk7@FCZ&xVuiB=wVci1iZt6lGCnRG+x7#B?R&Zd22XV;@ zf&M%IDu>~G4FU*XIIO)0ibN1mi^RsiKWf``jSA4*w#tCr8I4A{G+4LyC{>9~FH2RU z^#=?cUY@@JHB31Ts2-%ortD{_AkU2`n<0I`;7^4bu2RngL@;jNG`5i(a-_70l*CzT zBzr^3yQR{O=RCj#Hh|5v!p?X^w8^RN(fo21jc^a~*-Wi`o3so3zo}Pdwp}v^|7136 zYs{3!hpepn%;+hJ{P{(2_MQE?`;1mHmTK9zG9Tr%o`WNqj}PY-ItK|xeKz=c~57_&3YX5}P{lSTAguKOUo z3Xk9`r+o!ZjI*p@EPt9m&(G&yo0~Bs`TlrzdCwVp^2S;uDTj319Rgs$4Xb$0s~`_J z`^_K#anC>?pNjt?7a%WKGFVbBO9B^HWnpz!Hg)U5ssS|Z*oW2CuHA|C}s=S|*%E)OX5YU38N~kmZL|wNI2i4*r&C;5-?+NcDcDT&xu3%?*v4XA~Sk4%U5)K{^>JBG&-y|P{0%gC zJ^QWy`ACFP@_nF}BxA(SXlB8sF4R4!O8o{8hbk7MnGgceHf zhww}I58G1ZFHkXSC(1S0^5~oQ&Nu7L;V>9HPCx#(E$ff9^f-jK=xd&m01H@Ql`LT; zPdKyoE#P4Pu)sz(v%lMk4bFRO>|Ro=HRd`f^GwM$ud7CTWer#~sc~IDK7lRznx7=l zN*GuPhX)x;Y;1el~v)BBc z6RCO_?qY#0c3C<+!m>WY-V@YwqzTN``emsn=72{06_b;?#EC5Md_p`;RFTrwo-J)~ z@;`iYStqpP7t1@I#)3?*Hs%+~{1AqU<`Id3?KuwPe8kq+DjV4j^Em09G^mR{q^sb= iOjcRF0iQZLItDuD&Cz>geltCI(-ZsF5Y-s|*6e?Qjw0{0M{P5ectiQ&%S)7z@+Vw*cU;)dm zg2k+`W1CqA7TDl?x4=O*b-p>V1N@ye>RnN;HL|r|WT}!(R+Y7OiwZEW6BD{w9x2mMZ0iWyk34J>7`gM8XE#nGKE0jIAAE-cOYsSSPd^}(ahpW9>yWP31x;hd4RylABy zR^~R<@?jP3%o%9`+=T${U3=HAy*}JGTH1>TuudavXz%dm?lee{qXbkZl~kZNqA1!D z@~o-EI2uRM_~}bA-g-XP{8%=q?F`=UYy0iqi0eU{l_;bD=wPO@LaIyg2`{x*qsnBS zeMLPuH>GP7r7Tc$LJY5n2ZP`;U_xhdG0SCwH6bc51Y~K})Ve2AESoDZnXHTCSfux83^Q%>Hl}+!rm!|CW}>6fQ1?X}7ef0& z5R+#)l0FdP^O?*|7h?g=ummiV3~Oam7ai=jqaT_E%8aDF9l~wjTu2Z0y4gC*+nq?& zslguR*kF4~2gg`c=h#L3YKC-c^PqlN>Jb%e#lMf?q$)6!IbMW>O{nsOn0m6nTBxu_ zsgjAn@;qD&+`iF}h<&z5>^KtSda*gXROUZ$Y1a=(^c|OTX4`9Ql`XS1hcnkEyOl<3 ovyX^>52mtAt4%m*@n|7vgSU6@w8vCc_g{6$zBWkJ2EbM4KgpQ{cK`qY literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..102ce962f8588ba984b4a34fa1a23b95ac8cb34b GIT binary patch literal 994 zcmZ`&&2G~`5MHkx$3JNaP$+OhLP81>O%#4k2(@a}suHabAXV~#)iyJAoNnx}cA?=~ zu6Yn%gB!1~S5AEePRu$@TO{ymM>9MB-;AFvEk(hj!N;E-W53w7k7Tw^w|qf8f-^>3L|h0loz{$#ymYBqCN6>- z(4IN;e)BKs*1{@n!tEKaGp+nH)18GS+`Z&hug6L~8zJRM4ELz<2PWKGbZlaU5>Ou& zQiECT^?J{RJgExN@AZ4Ve!nN^>7{9Gq?lKRXYgU$@ZGJBXIiz{K%=Y>Ogz!qSn8=b z#;FNQ)R|P-S2V59Hg<_3mt!<>O0;~d?v`m+MJ3hFRW^$6)g|~x87e4^ zXO+gcamhZ=NLi=EMRV>=mLKnTxNcAq?b}Q(6NtJCAxtC$?a7Hk;#)#|I+4l-w-Vq4 zbHIF%VW~Mens~FuXwNQ|w!NBggAm@fb(q#}USW#*LfV=`Fqgv3p}bH;#RM-_^gGiX zTa+cg54yu*j9sblv`avBwHnYIpI)13_kaA=(syaZFGLNUuz0LZrrQ2cw(asEk-+sm z&*6N(18Ut3U0i&fkG E1L`Lm3IG5A literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0005_agent_game.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9c6fbf710e5d70c84783ae6606fcbb416d2e919 GIT binary patch literal 989 zcmZuw&2G~`5MKYp@lVrAd|G`=2&rzqGMfWU~!A^?ee+ zz{pr`#71t$rona@m|%TjV4*RwK3lN`_G>oioKq|tn99%7M2aRYi&{B(37FL*?OLpW zlnpxd4-&{?16XW=kr=Us_N1f1(V29?rriMtx-NbWH6B z845soSPBX8S`;`^nJK*4QRd$Ez*fCBY$Q=M2r8&# znhQDQ$2e79jWQKk`UzF7+`kFBh%dkkAvFZw4=H9mIH)SKT-K%VbZ?`2l zM=54dD_c92qj4$Tl}K5qr1^90MOqvm40_7tZRMORpL3dylMG4kasJ^%WExOgfE5;i z#VEyEnpBnwwpw2H^*Bl0pYk?|)g7H%_4bMe6OyOg{ZFk>OcLu}ii-nQF1uWFua1432q(>aUJ LG%K|xt8e`UCrBJl literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0f27ecd12c3251d10846759ceeeea0061c3821f GIT binary patch literal 692 zcmZ`%&2H2%5Vqqan`FDt69+gVA>}|5fMB!B_etm8HBf;!;r zBZC0MPX+?{TKo{Tfba{;qbtf~d0?}yZH$`Qp&xDB4S;%Fy3ox^NjauHejVnLLj*C-)(OlYfpix@wsRTIKmXU?h&qJ>8snZ#Pj33#xkd$O&IV<` z-Y?7Yg;WjplWbInHvFt6%()GFZ+TzrI~7JR ziH)asm?{3J-#%nP+`W`)I}NfbtFo-BQqq2PwE1q_&*Bh{4@e{;4nrOXArI&~ygq%- mX&%}X)~auYBRKQeJP04W9eA%jqFOe2y=Uo-!#X-L4#i)zOSd2Z literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0006_auto_20200220_2208.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a33418fac1f8574e494e3e0e10c67d0c337f061 GIT binary patch literal 687 zcmZ8f!EV$r5VhlMHp#Z4r%LbvNIB4iNFWXfEd{};1;H%`jJq?Yqt-1K{<$J)`ALr~>NXDFGcuWcyaLrm?@iwRe z&fYT!K>T7Lkgvo~Q3(h?vutuhxhxB8+BUUOW7BtojoKbi4+{tFS3<^|WcWx5S;c`> z0q~kv0>jnB72k5QA_!rE(^U)+Od;L|kZfIsi>Lp`Yf&XIqc#p~a<>0JH8azw0L?|O z3{($_qIf1%jom0~)uIhQsSz`7!_Ip?7J2-so%sC*s7b0b1-w)nJ<@dQT59a-ahVD7 z+AlgkD**jNf4}C-zQtT=yw2-p%#B_U15fU; zksBOPnZ;6K_btB<+}&SJgguvPGxoA9%AzRCLXx~VS^qHZjYK5FF{xNYVaTH(m}+pXHN(K-R7i00XXB#dBVHxyRWt0}sSA z1A%-Zo8tqrRNP`6_j`dJ}42W0I!0kWI}%RLwtJQwIs z0-$ynP6iM__`+fEA}A6;L{G$ac>2@Z&S_MD=BiN!>`Inp+fvQCMvk&kmW@W4B-^!t zDzNUXZ&ZEzPBK}-?Evsv&2*Ot;_CRxT2*NM9)s%=HJl}$2`Jk*vdPd!vd@vy#!^zv zOe6X8Qr^v!c6IIqIK>*U9+%h}j|y#c2yo>38R3reCv}Gfn*Peh%@n`q^vcYVd(FYe zMS9azm@19;X;F5m(PNUh@keg@pZ`1glm@aRd-2j~-<&=e_p44%8xuq#^nLEp?(feM l-wt7->Y~|%tDb$&xexx5`|_5l-bQ<0bJ%y%S|@i=d;$yToE`uG literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0007_agent_rank.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0007_agent_rank.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ce1cf1dfbdcde55d13b7c84ac1b210c2a07dab GIT binary patch literal 588 zcmYjO%}(4f5Vm6{o85xMrR5DOMQTa3hr$6N=%E#dBBWkW4zV&h83=$B(7zpG`@l(_SJ<4f+{&o=!x7ACDyuv6GTQX2MFVHW)aNSZmGU#C zsBdkM{4J$!*4l*L5CN{x0@_83gG*?>&rbk8gc(kRaO>2L*r1CkKkHZcpPfIbnb{88{!p vf9E2Tk|%Ux{;ZIG3QKL9eh)6=`f=%4eA@2Odqwwse)velQNT6?ygT9nLol3B literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b926985966405ce05a9b53eb5e0aefd45bc100be GIT binary patch literal 618 zcmZ`$J#W-N5Zw>kXFEjDL63ywg0pdoP#_cp0#T5L&IPMI&%|eEZ69l&6l!SG@GtmF z+fwB(P%-NxN*Z=GPcyswX6DVF93Q9g)B4L#&e(5uZw2I^kxkDCfB`qG=N0coB{=)Q zK!E(gKqBwtcUegYKC>*mp|>m(F74aK>bV_<$wmDLXr|g<-L4fmXJpfw09nO>RRYq6 zR}zCR1WJcdw}KENSX~QQ`SWgF`cKGf9!}SPh;WEErz2Xy7~(HYBEv zJUwx-THYw-Ql*HqH%R^irM~X9@jM>^?r;Dc>J}#}i0INcW=8woXSC8EByYF+5W95T z;lIKCV)n5w=HZXZw_}gFHh7gc?VMXvlj7(1)aU>6@4h0Z`MgwmKaZ*`%AzRC7pgod zPS?9{)_=E`HKhcxjDmm*+ROQQ7PtgDJv8GQHj9X*@#XTa$%FTV_%42R7{_a`Z}O@i F$-fM!rau4x literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0008_auto_20200221_2307.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72734c9d3a8d3d85f3f4463ad3287af412f62bcb GIT binary patch literal 613 zcmYjPy>8S%5Z?9re6}Hiio5~R6`YMJLV-{S2t+}IMCXEK&olAaS+6f^UleL+)9@B~ z2Hs>_s=NXfvp!DASTmacnQzu72L~x5`n~%6^%rOCk2m%dl5$KuJS71PxMm$Mc^8xc zXCD{@Abv6s$XoG4lmfypY%#l~T($^Y+BLORW7C_#MO_c5hsuZcG$-YlcvzA^R&rov z0KDd zxeII6p^Loy_|7FOt*Y~u_!ej|RnGy>)K-tQvAU8PO+Bs`f-JwYG`={TMvrLU`z}^^NAh;9cD76V4gNpZ z4YN-uI*GsEvUT5KrZiqUAArI)A{HKf1CD1BU_e)q!D5lM);N6xx?U3qS{AzcP M*B;>DVLulC0IVmbCjbBd literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53e897f4b9da8e5a72bd2dc90a50ac9baaddab01 GIT binary patch literal 1219 zcmZ`&TW`}a6m~96)AX`#T*kN~B%}yfvkozk5Nx7isst4bBv2lRydE!0mrIwVusy?T ze+YlcPe?qKpTHBxPD=}7mVEsAoX_?-pY6?h-7;_YKmIHe@`Efi9q~5y><$_rpoAn+ zTqROnRUx|sRM5T>(3mpNzG$un`dea`CdehW%B?8yQvd6Pf~FbsXoBM@M<$wVk%(wA&kAd(+wCCF-*{=Xy%xBdNd8 z+>2?%xGrr)5_-a+b>8$Qfa)W$4D5i8!W?gmo_HaP{ru3@(h5dX3k@$F1S|wzmdm>x z*Ob6F(mudVY?k$EmB*- z<=jjeE;{XYxK*H+L43rk1x7ucjUMt#NKFkicAcA^RL=9b<$3seM`4F zZ2E`3k@T*}Pncg`>oAE}i-zo^g{8OBu#ZpU{=ze9orUMWvW0a&{_7z<@SOI>!}Z~5 zDt^9DBKv^G)C^r$RK-w*Rh8y+T$zrIf5usS=AZFq{@Ex`>DfB3z<|bnvJU%FMJbmI X&Py)PJ`m=A_BK4l literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/0009_auto_20200224_0216.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deb7ad5b30663a2ca34e1e64688729d0ab7bdb9a GIT binary patch literal 1214 zcmZ`&OK%e~5Z+gk&9i9>w7hRfduX!_h=PQmg@~#WL_m>1Ik32y>1NY?q`RBap5dAw z!e8O1w`Fp6 zs3%QTQBdirp!76QUA3p9F)WDWU`#afi{uxuG&G?IB`_x%lqZ5yCcGl?D&aM#PxOUI zgCZ4Jg62eBK$kB>S1!rEdLjD?p;fpF*Ql>8?70rtXZ#x6Sg3LxZeD`lBHV=A^HaIi zUJdS$jCXnYb*>+YS@n?t#)lD$fv?%N{m5bCG;-Q@+qT>7EvJ3o-sT17VwiFxX5q2C z0in7RvH-auZCMh!0?<2eyHg%F+FM<#&P_+EP5p)HMOV-tEtV|xH20X|BZP($8%ne=cC-EYZ<%@Ll(NxCLBr` brCu^PKXc}7QZ?Lsl3mDCA!{OZZ|Z*lk+D4- literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0010_auto_20200224_2034.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0010_auto_20200224_2034.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88dda6e1b44670cd0bc0c1a071a508c1d3b0bdf9 GIT binary patch literal 1004 zcmZ`&OLNmO5cV^1oTQXDH)bdYa&RL*61Ou9(+(Y&9_Rt+#RojHcjG4bkvcZhaxK@~ z`xp32x^n7Y;DqG#MF%vaPoMUaR@&9d?e|S%BmQ!(NzyOrR^xMNhxf%M2arHcrA!Xw zObHZO%#~CP)b|pop#6|QLwTm1seuN{CuyKx@IBH%VP-Z>N?J{ee8E~-0hlfhVxe8N z9w$4zFU~oj6v!Y23Or8aKt*k)3-6#W70z3nx3E1kpbf@ShR#x~=y0pattNJ7J?Ngv z(1Sj#E!AuN9;{#M_y4IsxYi&3ttWcWhete~C#>_~DiGF9kph-cK}%py2_f4dt*at* zh(n0ucp-7@G1F;+dBu!kJ}+|4nq-IsggMQSX)7#g{`ErUp$}x%2At43tp;k@;g-_m z!1T!!Q(*1J+y377myS!x$cxY#+4i>Oc@y7?e4kijG8&EJEr0BzcL99sXYQvjT$mX> z2~*6I>WH=Ke0p5-;}da-mO$ZjGIG4gcE*;2IJP`G0*gi-wTMF}b`-(L^?YWOI8W*6 zYCR#YOMJ`m#%OuI8(Yyfc-AD|vb}iAb*N1b21==mI9ePAYs?6n$itACVaQ9NPLcCo z7#`O&714mMhWRO{**3d3!`J z&01YgfoX?_`+LkR=6G3-Kc(`8xSfFC;qa))a7a@;879+eSf(+5TR;f*uG6%oVx^t^X1?9=elzP=y`C=dF}9CBovV`cTR7{%eQB4^Vv8G) zfW%TlJd((sOoT7Til@AlKmql;1S*o5`c3gvkUvQM#sxnk_2o)WrcutyX_gjMGsyts z;xH84dUQG1<+C{F1|^Sx=FG-yI=NkChQ9c>G-dpcWgOK>$PB zaVssydCbmM`zf_;>Kc|aLc?+G&4e+1#Y}eC->5XdR_ptf?)&@!EMnxi z>-)zG7K;i94{(ktU>Z)b$YpWk&U;L<6MR!k*Y*Hvlq-Vk9;78kn6F5EFD}=({d&SK z!|Gx&g-ZSS@nFBwvpHTq!e3JUgy*QupU;Cymf(QJcshut!Vw1eX8H6+Aw2j mlx;y!*Q6GoKNhzaX|Hvx&{H0(v=^%qzZ8Wk#I{YMDSrV_QwD_q literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/0011_auto_20200225_0146.cpython-36.pyc b/leaderboard/leaderboard/migrations/__pycache__/0011_auto_20200225_0146.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b1d3d56cc68d40a7c715e1f24f1e9187732d048 GIT binary patch literal 958 zcmZ`&OK;Oa5cVsH<1|nn5=cmZ014&b#<4eXBO%m^3aA9RKrcREt#`(*BR^6nmfBv+ zwfqnM(q1|BFK}YleIr-GDV`I3E`8H(~txiN&VYzbLz2n7nLnUbr4 znrnfkN?*(LK>whC4#sx{3{>aFi5?iBeNhIjGx3iy(72VSNkvy_SuA-wF9EaVj7jWr z^n|e`WcfoVR00*0K!XQ~8t7=uTQWMf=N)K48#<>Nn5S~xgf3We9lLW2dMBzt*Pwr@ zU*S63xx(-M6JNi=@7=}|Bj~|>!QvtBe!fhf_cEk_RaDXn_#?*|IU%iAW#~GtXob^-Rcd{}V#Zo_{Pec#ZiP2$G^I9l)5@*-Dg$9)=kf$!dR~3r`j(EMy3y z(XBYe40wwsSgd%bnRa)MUrjuSi0AwEh``h)(=oFn^kbXEA|2PAxW12H2YO|R^D0?l z-mZ)Ephn)7smTyAV-DSgG+T&3~BSz3f$P++uh+-xxkBS_EV{z$`qvf z9S--)9EUW+!(o!HhE>Ky`|KO79RAO~zPLlt?9r`ek3(lfCL4>RNxJB|}K5<)FhKqbh9_TmF(y)$tV`H`+;)K=W! zT7Cl@`Ad7{)W5)qUH6SxYi4KmThGonv-`5!wG=V%%ihO{p(wwlb1{UkYzZkhgaQTB zRLRs(&9qQcrLU!WsJ~G_2jiOp2C56=s~#GleNcLhQ}K_|)3}w*6Gm3^A}@I}D*)4S zLM3)FI>OizQhpZ-l~4sG)Id$tP)B3Y01b3(E?Qtf1DYoqv`*x@2`04VI<|jUVEt4D z+JUtb{Sw!pdx_urFMj(HU%!bbM%aNng2i3let(g^;L=Hv0J69s48nV^+jk>Ut%}HV zJ=gU-Ul;?Q8wtsfn^I4N9CzO#RP^!NB86v|or0h#VzmILq)Jz!K;$q=F;7;ro-RCD zq9~Ukj9NFQb4-CZNP_u_x9Vwk=lJPp0I@#^0=w_S*!IUmYR4E%ZGS4#@w|~21i07J zSzDaPWRrQb%I60a@}^8phL}?7l1+lPU=`RtiP0Wo;MyLgBR>Y;8@Mqy87@?J=DWZJ*Myy%_{!d)SZ3bUYZ*0K7?Wjhj(TAd0vZMS@V3qOjMZ=%6C0Bqcq- zCFX!Rony%~nV-20@LG~(x^&yGW`xx~x3<$2p4&!M&4C;H`@1{bDwcSDxqd0^p=2u6 zpHI%L$j~7v9y-Z<<*<~Bmf6?Z=P)dhFglAc|Lj}`uI{TNI^4g};bG+V{n5tqh{?Cn z5>h@9%G8^Np=#n=*Uskq|IGFNUW2z`LGq;7fViey6J-xXhlf~PL5*$g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(SAc#-er~FMVoqv> zetKq!eo;Ypk{ literal 0 HcmV?d00001 diff --git a/leaderboard/leaderboard/migrations/__pycache__/__init__.cpython-37.pyc b/leaderboard/leaderboard/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b842404fc99d6a594ca672b763410b1ec6f3a56d GIT binary patch literal 168 zcmZ?b<>g`k0=pkxaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpdRLCard Leaderboard: About +{% endblock title %} + +{% block header %} +About RLCard +{% endblock header %} + +{% block content %} +
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nunc lobortis mattis aliquam faucibus purus. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris. Lacus laoreet non curabitur gravida arcu ac tortor. Pulvinar elementum integer enim neque volutpat ac. Enim sit amet venenatis urna. Amet risus nullam eget felis. Eu consequat ac felis donec et odio pellentesque diam. Congue nisi vitae suscipit tellus mauris a diam. Tellus elementum sagittis vitae et leo duis ut diam. Id leo in vitae turpis. Metus dictum at tempor commodo ullamcorper. Turpis cursus in hac habitasse platea dictumst. Lacus viverra vitae congue eu consequat ac felis. Justo donec enim diam vulputate ut. Donec pretium vulputate sapien nec sagittis.

+ +

Sit amet risus nullam eget felis eget nunc lobortis. Quam vulputate dignissim suspendisse in. Tortor posuere ac ut consequat semper. Pretium aenean pharetra magna ac placerat vestibulum. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt. Iaculis urna id volutpat lacus laoreet non curabitur gravida. Odio facilisis mauris sit amet massa vitae tortor condimentum. Viverra adipiscing at in tellus integer. Et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Sapien pellentesque habitant morbi tristique senectus et netus et. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Ornare suspendisse sed nisi lacus sed viverra tellus. In tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Amet massa vitae tortor condimentum. Turpis tincidunt id aliquet risus.

+ +

Euismod lacinia at quis risus sed vulputate odio ut. Eu consequat ac felis donec. Mattis enim ut tellus elementum sagittis vitae et leo duis. Proin libero nunc consequat interdum varius sit amet mattis. Felis eget velit aliquet sagittis id consectetur purus ut. Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Cras semper auctor neque vitae tempus quam pellentesque nec. Id porta nibh venenatis cras sed felis eget. Neque viverra justo nec ultrices dui sapien eget mi. Nunc sed id semper risus in hendrerit gravida rutrum.

+ +

Orci sagittis eu volutpat odio facilisis mauris sit amet. Nisi est sit amet facilisis magna. Mi proin sed libero enim sed faucibus turpis. Magna sit amet purus gravida. A lacus vestibulum sed arcu non odio euismod. Massa tincidunt nunc pulvinar sapien et. Iaculis eu non diam phasellus vestibulum. Ultrices dui sapien eget mi proin sed. Blandit cursus risus at ultrices mi tempus imperdiet. Non arcu risus quis varius quam. Vitae congue mauris rhoncus aenean vel elit. Interdum velit laoreet id donec ultrices tincidunt arcu. Duis ultricies lacus sed turpis tincidunt id. Lacus vestibulum sed arcu non odio. Quis hendrerit dolor magna eget est. Nulla facilisi etiam dignissim diam quis enim lobortis. Placerat vestibulum lectus mauris ultrices.

+ +

Amet est placerat in egestas erat imperdiet sed euismod nisi. Volutpat est velit egestas dui id ornare arcu odio ut. At lectus urna duis convallis convallis tellus. Amet purus gravida quis blandit turpis cursus in hac. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Viverra mauris in aliquam sem fringilla ut. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Ultricies tristique nulla aliquet enim. Vivamus arcu felis bibendum ut tristique et egestas quis ipsum. Euismod nisi porta lorem mollis aliquam ut. Sed viverra ipsum nunc aliquet bibendum enim facilisis. Vitae proin sagittis nisl rhoncus mattis. Etiam sit amet nisl purus in mollis nunc. Amet nisl suscipit adipiscing bibendum est ultricies integer. Tincidunt vitae semper quis lectus nulla at volutpat diam. Vel elit scelerisque mauris pellentesque.

+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/base.html b/leaderboard/leaderboard/templates/leaderboard/base.html new file mode 100644 index 0000000..2b3736b --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/base.html @@ -0,0 +1,85 @@ +{% load static %} + + +{% block title %}{% endblock %} + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+ +
+ {% block header %}{% endblock %} +
+
+ + {% block content %}{% endblock %} +
+ +
+ © Copyright DATA Lab at Texas A&M University
+ Powered by w3.css +
+ + + + + + + + \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/blackjack.html b/leaderboard/leaderboard/templates/leaderboard/blackjack.html new file mode 100644 index 0000000..563e32b --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/blackjack.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Blackjack +{% endblock title %} + +{% block header %} +Blackjack Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/cfr.html b/leaderboard/leaderboard/templates/leaderboard/cfr.html new file mode 100644 index 0000000..e70b4ba --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/cfr.html @@ -0,0 +1,33 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: CFR +{% endblock title %} + +{% block header %} +CFR +{% endblock header %} + +{% block content %} +
+ + + + + + + + + + + {% for game in games %} + + + + + + + {% endfor %} + +
Replay IDOpponentGameReplay Link
{{ game.replayID }}{{ game.agent2 }}{{ game.gameName }}{{ game.replayLink }}
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/doudizhu.html b/leaderboard/leaderboard/templates/leaderboard/doudizhu.html new file mode 100644 index 0000000..8d58be7 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/doudizhu.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Dou Dizhu +{% endblock title %} + +{% block header %} +Dou Dizhu Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/dqn.html b/leaderboard/leaderboard/templates/leaderboard/dqn.html new file mode 100644 index 0000000..7c305cc --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/dqn.html @@ -0,0 +1,33 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: DQN +{% endblock title %} + +{% block header %} +DQN +{% endblock header %} + +{% block content %} +
+ + + + + + + + + + + {% for game in games %} + + + + + + + {% endfor %} + +
Replay IDOpponentGameReplay Link
{{ game.replayID }}{{ game.agent2 }}{{ game.gameName }}{{ game.replayLink }}
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/getting_started.html b/leaderboard/leaderboard/templates/leaderboard/getting_started.html new file mode 100644 index 0000000..6cb93f0 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/getting_started.html @@ -0,0 +1,22 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Getting Started +{% endblock title %} + +{% block header %} +Getting Started +{% endblock header %} + +{% block content %} +
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nunc lobortis mattis aliquam faucibus purus. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris. Lacus laoreet non curabitur gravida arcu ac tortor. Pulvinar elementum integer enim neque volutpat ac. Enim sit amet venenatis urna. Amet risus nullam eget felis. Eu consequat ac felis donec et odio pellentesque diam. Congue nisi vitae suscipit tellus mauris a diam. Tellus elementum sagittis vitae et leo duis ut diam. Id leo in vitae turpis. Metus dictum at tempor commodo ullamcorper. Turpis cursus in hac habitasse platea dictumst. Lacus viverra vitae congue eu consequat ac felis. Justo donec enim diam vulputate ut. Donec pretium vulputate sapien nec sagittis.

+ +

Sit amet risus nullam eget felis eget nunc lobortis. Quam vulputate dignissim suspendisse in. Tortor posuere ac ut consequat semper. Pretium aenean pharetra magna ac placerat vestibulum. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt. Iaculis urna id volutpat lacus laoreet non curabitur gravida. Odio facilisis mauris sit amet massa vitae tortor condimentum. Viverra adipiscing at in tellus integer. Et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Sapien pellentesque habitant morbi tristique senectus et netus et. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Ornare suspendisse sed nisi lacus sed viverra tellus. In tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Amet massa vitae tortor condimentum. Turpis tincidunt id aliquet risus.

+ +

Euismod lacinia at quis risus sed vulputate odio ut. Eu consequat ac felis donec. Mattis enim ut tellus elementum sagittis vitae et leo duis. Proin libero nunc consequat interdum varius sit amet mattis. Felis eget velit aliquet sagittis id consectetur purus ut. Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Cras semper auctor neque vitae tempus quam pellentesque nec. Id porta nibh venenatis cras sed felis eget. Neque viverra justo nec ultrices dui sapien eget mi. Nunc sed id semper risus in hendrerit gravida rutrum.

+ +

Orci sagittis eu volutpat odio facilisis mauris sit amet. Nisi est sit amet facilisis magna. Mi proin sed libero enim sed faucibus turpis. Magna sit amet purus gravida. A lacus vestibulum sed arcu non odio euismod. Massa tincidunt nunc pulvinar sapien et. Iaculis eu non diam phasellus vestibulum. Ultrices dui sapien eget mi proin sed. Blandit cursus risus at ultrices mi tempus imperdiet. Non arcu risus quis varius quam. Vitae congue mauris rhoncus aenean vel elit. Interdum velit laoreet id donec ultrices tincidunt arcu. Duis ultricies lacus sed turpis tincidunt id. Lacus vestibulum sed arcu non odio. Quis hendrerit dolor magna eget est. Nulla facilisi etiam dignissim diam quis enim lobortis. Placerat vestibulum lectus mauris ultrices.

+ +

Amet est placerat in egestas erat imperdiet sed euismod nisi. Volutpat est velit egestas dui id ornare arcu odio ut. At lectus urna duis convallis convallis tellus. Amet purus gravida quis blandit turpis cursus in hac. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Viverra mauris in aliquam sem fringilla ut. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Ultricies tristique nulla aliquet enim. Vivamus arcu felis bibendum ut tristique et egestas quis ipsum. Euismod nisi porta lorem mollis aliquam ut. Sed viverra ipsum nunc aliquet bibendum enim facilisis. Vitae proin sagittis nisl rhoncus mattis. Etiam sit amet nisl purus in mollis nunc. Amet nisl suscipit adipiscing bibendum est ultricies integer. Tincidunt vitae semper quis lectus nulla at volutpat diam. Vel elit scelerisque mauris pellentesque.

+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/home.html b/leaderboard/leaderboard/templates/leaderboard/home.html new file mode 100644 index 0000000..b5c6c67 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/home.html @@ -0,0 +1,22 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard +{% endblock title %} + +{% block header %} +RLCard Leaderboard +{% endblock header %} + +{% block content %} +
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nunc lobortis mattis aliquam faucibus purus. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris. Lacus laoreet non curabitur gravida arcu ac tortor. Pulvinar elementum integer enim neque volutpat ac. Enim sit amet venenatis urna. Amet risus nullam eget felis. Eu consequat ac felis donec et odio pellentesque diam. Congue nisi vitae suscipit tellus mauris a diam. Tellus elementum sagittis vitae et leo duis ut diam. Id leo in vitae turpis. Metus dictum at tempor commodo ullamcorper. Turpis cursus in hac habitasse platea dictumst. Lacus viverra vitae congue eu consequat ac felis. Justo donec enim diam vulputate ut. Donec pretium vulputate sapien nec sagittis.

+ +

Sit amet risus nullam eget felis eget nunc lobortis. Quam vulputate dignissim suspendisse in. Tortor posuere ac ut consequat semper. Pretium aenean pharetra magna ac placerat vestibulum. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt. Iaculis urna id volutpat lacus laoreet non curabitur gravida. Odio facilisis mauris sit amet massa vitae tortor condimentum. Viverra adipiscing at in tellus integer. Et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Sapien pellentesque habitant morbi tristique senectus et netus et. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Ornare suspendisse sed nisi lacus sed viverra tellus. In tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Amet massa vitae tortor condimentum. Turpis tincidunt id aliquet risus.

+ +

Euismod lacinia at quis risus sed vulputate odio ut. Eu consequat ac felis donec. Mattis enim ut tellus elementum sagittis vitae et leo duis. Proin libero nunc consequat interdum varius sit amet mattis. Felis eget velit aliquet sagittis id consectetur purus ut. Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Cras semper auctor neque vitae tempus quam pellentesque nec. Id porta nibh venenatis cras sed felis eget. Neque viverra justo nec ultrices dui sapien eget mi. Nunc sed id semper risus in hendrerit gravida rutrum.

+ +

Orci sagittis eu volutpat odio facilisis mauris sit amet. Nisi est sit amet facilisis magna. Mi proin sed libero enim sed faucibus turpis. Magna sit amet purus gravida. A lacus vestibulum sed arcu non odio euismod. Massa tincidunt nunc pulvinar sapien et. Iaculis eu non diam phasellus vestibulum. Ultrices dui sapien eget mi proin sed. Blandit cursus risus at ultrices mi tempus imperdiet. Non arcu risus quis varius quam. Vitae congue mauris rhoncus aenean vel elit. Interdum velit laoreet id donec ultrices tincidunt arcu. Duis ultricies lacus sed turpis tincidunt id. Lacus vestibulum sed arcu non odio. Quis hendrerit dolor magna eget est. Nulla facilisi etiam dignissim diam quis enim lobortis. Placerat vestibulum lectus mauris ultrices.

+ +

Amet est placerat in egestas erat imperdiet sed euismod nisi. Volutpat est velit egestas dui id ornare arcu odio ut. At lectus urna duis convallis convallis tellus. Amet purus gravida quis blandit turpis cursus in hac. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Viverra mauris in aliquam sem fringilla ut. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Ultricies tristique nulla aliquet enim. Vivamus arcu felis bibendum ut tristique et egestas quis ipsum. Euismod nisi porta lorem mollis aliquam ut. Sed viverra ipsum nunc aliquet bibendum enim facilisis. Vitae proin sagittis nisl rhoncus mattis. Etiam sit amet nisl purus in mollis nunc. Amet nisl suscipit adipiscing bibendum est ultricies integer. Tincidunt vitae semper quis lectus nulla at volutpat diam. Vel elit scelerisque mauris pellentesque.

+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/leducholdem.html b/leaderboard/leaderboard/templates/leaderboard/leducholdem.html new file mode 100644 index 0000000..284178f --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/leducholdem.html @@ -0,0 +1,31 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Leduc Hold'em +{% endblock title %} + +{% block header %} +Leduc Hold'em Leaderboard +{% endblock header %} + +{% block content %} +
+ + + + + + + + + + {% for agent in agents %} + + + + + + {% endfor %} + +
RankModelAverage Win Rate
{{ agent.rank }}{{ agent.agentName }}{{ agent.winRate }}
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/limitholdem.html b/leaderboard/leaderboard/templates/leaderboard/limitholdem.html new file mode 100644 index 0000000..d0ab847 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/limitholdem.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Limit Texas Hold'em +{% endblock title %} + +{% block header %} +Limit Texas Hold'em Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/mahjong.html b/leaderboard/leaderboard/templates/leaderboard/mahjong.html new file mode 100644 index 0000000..d91c86f --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/mahjong.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Mahjong +{% endblock title %} + +{% block header %} +Mahjong Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/nfsp.html b/leaderboard/leaderboard/templates/leaderboard/nfsp.html new file mode 100644 index 0000000..b204937 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/nfsp.html @@ -0,0 +1,33 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: NFSP +{% endblock title %} + +{% block header %} +NFSP +{% endblock header %} + +{% block content %} +
+ + + + + + + + + + + {% for game in games %} + + + + + + + {% endfor %} + +
Replay IDOpponentGameReplay Link
{{ game.replayID }}{{ game.agent2 }}{{ game.gameName }}{{ game.replayLink }}
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/nolimitholdem.html b/leaderboard/leaderboard/templates/leaderboard/nolimitholdem.html new file mode 100644 index 0000000..602e7a2 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/nolimitholdem.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: No-Limit Texas Hold'em +{% endblock title %} + +{% block header %} +No-Limit Hold'em Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/templates/leaderboard/uno.html b/leaderboard/leaderboard/templates/leaderboard/uno.html new file mode 100644 index 0000000..815d706 --- /dev/null +++ b/leaderboard/leaderboard/templates/leaderboard/uno.html @@ -0,0 +1,36 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +RLCard Leaderboard: Uno +{% endblock title %} + +{% block header %} +Uno Leaderboard +{% endblock header %} + +{% block content %} +
+

Currently Unavailable

+

Try Ludec Hold'em

+
+ + +{% endblock content %} \ No newline at end of file diff --git a/leaderboard/leaderboard/tests.py b/leaderboard/leaderboard/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/leaderboard/leaderboard/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/leaderboard/leaderboard/urls.py b/leaderboard/leaderboard/urls.py new file mode 100644 index 0000000..944a92a --- /dev/null +++ b/leaderboard/leaderboard/urls.py @@ -0,0 +1,18 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.home, name='leaderboard-home'), + path('about/', views.about, name='leaderboard-about'), + path('leaderboards/blackjack', views.blackjack, name='leaderboard-blackjack'), + path('leaderboards/doudizhu', views.doudizhu, name='leaderboard-doudizhu'), + path('leaderboards/leducholdem', views.leducholdem, name='leaderboard-leducholdem'), + path('leaderboards/limitholdem', views.limitholdem, name='leaderboard-limitholdem'), + path('leaderboards/nolimitholdem', views.nolimitholdem, name='leaderboard-nolimitholdem'), + path('leaderboards/mahjong', views.mahjong, name='leaderboard-mahjong'), + path('leaderboards/uno', views.uno, name='leaderboard-uno'), + path('getting_started/', views.getting_started, name='leaderboard-getting_started'), + path('leaderboards/nfsp', views.nfsp, name='leaderboard-nfsp'), + path('leaderboards/cfr', views.cfr, name='leaderboard-cfr'), + path('leaderboards/dqn', views.dqn, name='leaderboard-dqn'), +] diff --git a/leaderboard/leaderboard/views.py b/leaderboard/leaderboard/views.py new file mode 100644 index 0000000..a74988c --- /dev/null +++ b/leaderboard/leaderboard/views.py @@ -0,0 +1,69 @@ +from django.shortcuts import render +from .models import Agent +from .models import Game +import operator + + +def home(request): + return render(request, 'leaderboard/home.html') + + +def about(request): + return render(request, 'leaderboard/about.html') + + +def getting_started(request): + return render(request, 'leaderboard/getting_started.html') + + +def blackjack(request): + return render(request, 'leaderboard/blackjack.html') + + +def doudizhu(request): + return render(request, 'leaderboard/doudizhu.html') + + +def leducholdem(request): + context = { + 'agents': Agent.objects.all() + } + return render(request, 'leaderboard/leducholdem.html', context) + + +def limitholdem(request): + return render(request, 'leaderboard/limitholdem.html') + + +def nolimitholdem(request): + return render(request, 'leaderboard/nolimitholdem.html') + + +def mahjong(request): + return render(request, 'leaderboard/mahjong.html') + + +def uno(request): + return render(request, 'leaderboard/uno.html') + + +def nfsp(request): + context = { + 'games': Game.objects.filter(agent1="NFSP") + } + return render(request, 'leaderboard/nfsp.html', context) + + +def cfr(request): + context = { + 'games': Game.objects.filter(agent1="CFR") + } + return render(request, 'leaderboard/cfr.html', context) + + +def dqn(request): + context = { + 'games': Game.objects.filter(agent1="DQN") + } + return render(request, 'leaderboard/dqn.html', context) + diff --git a/leaderboard/manage.py b/leaderboard/manage.py new file mode 100755 index 0000000..253a4c2 --- /dev/null +++ b/leaderboard/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'research_env.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/leaderboard/media/RLCard.jpg b/leaderboard/media/RLCard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d65e3db53fb6eb2e9bdbbc05c7dff2192f3992e GIT binary patch literal 111816 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%0AXrdSBu5nz}0tC~wQhhDYP?zO=)?z14DK)>7mS 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 literal 0 HcmV?d00001 diff --git a/leaderboard/media/RLCard.png b/leaderboard/media/RLCard.png new file mode 100644 index 0000000000000000000000000000000000000000..3274105ac6d7d55dbed4825a2d8e15c3172afe5f GIT binary patch literal 7446 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 CR@*B8 literal 0 HcmV?d00001 diff --git a/leaderboard/media/default.jpg b/leaderboard/media/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36ef5e144a66941de384d1edcdfeb488de4a186a GIT binary patch literal 4687 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 literal 0 HcmV?d00001 diff --git a/leaderboard/media/profile_pics/default.jpg b/leaderboard/media/profile_pics/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b6cea56307865f39665ce5221bf121f5d792ac1 GIT binary patch literal 17165 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 literal 0 HcmV?d00001 diff --git a/leaderboard/media/profile_pics/default_cqLOpRI.jpg b/leaderboard/media/profile_pics/default_cqLOpRI.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36ef5e144a66941de384d1edcdfeb488de4a186a GIT binary patch literal 4687 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 literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__init__.py b/leaderboard/research_env/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/leaderboard/research_env/__pycache__/__init__.cpython-36.pyc b/leaderboard/research_env/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e701da0b7caca6b89da6d80bfff6deede6d622a7 GIT binary patch literal 153 zcmXr!<>lf~PL5*$g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(mz#b@er~FMVoqv> zetKq!eo;Nc(~pnO%*!l^kJl@xyv1RY Qo1apelWGStzZi%a05a_+Q2+n{ literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/__init__.cpython-37.pyc b/leaderboard/research_env/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d2f9c80fd346e904aa7a8763e0f12767448d320 GIT binary patch literal 158 zcmZ?b<>g`k0=pkxaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpdpEmGxIV_;^XxSDsOSv R3;_KXC{q9c literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/settings.cpython-36.pyc b/leaderboard/research_env/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..753733ab0ea6105fcbdb64cc9772cb97b8be5334 GIT binary patch literal 2510 zcmb7FUvtw&5Vsx0b_@w2g#XYA0)YULNYVk?>9h!22_76fV>zVU1FGyj%a`bnqdSvC zuY3)@K);e+`_!3!fdJR`SZncRV#ky%o#m24(cs_a^x?aQ1B!91JGT|bZm%BdA}dM5Qg$^F3Jr5&M^ zN*mOpfh8!&?IZaSB*0}0T;|DKSb-Q>K9UC1KH4p)z(R)_SWN9FFoab$;a zA^Y9aRaqXOBgz8#ljRI3|3AJ0+D$q73+p6P4_8;a2M-@Sc;P+odiz#?@#Erx^K{?a z^Sa%~!6I$H+}}T3J9yRoab@rI3hW;~>_2aX*9M#hT(SCnu58C*+4s844(~hE0vfb^ zD}do_?Nl+cnIGmt>G+-qSX)W*9$p#O4n!}!J*JEy)Dz;UPkDHKY?4#XaVO4BxHw_i zh`2S55V&`pc*l6SJeqSEfI|>Qbnsvre!S zT;Eg5$>TpvdC*nLIJ{@{AZ7Y;EEWq>myScjcgz~=B$b*1jxXXkQEBkzFnKA|i*GE# zVV%8QtFwpQqWrcVST1e!lQl znM*3*P?*?B9gNHmc=&jnNl9ULjJY+BBk~wzXv@QlYWcsy6CIc=xNE9dMh)U4_|BwlXRJ?OFpz zoK!ZnPgBVE9VX~nSVHAUUdlyzy}nVc>ycE~Hua!@M?m;?Ec&E=`WEL0egGyOGYk@U zNvCTfZrXvM26LHX#r^SqXyFIpFXv_2WFB(|ZjE}j=$+z!JuiOPE?c7*PYGV1m!Ljy zX}~&X878T>Jm6$vyHyU0Dt-;HZ&WhrQeakCP?M)hN^Rd4Tm)8sEu2lAdCNWDrDW3a zZRRcAjS8lTr@v`NIiE*T-x59CG8TB)A5p<-^F&iL&G-m1O;UWL8G2j+QOVHDO}%Bl z(?3L$75&ZjMl`L}YKC7s%b6Vh-P<;jcROPtCqF6!XjzcXI?Z_(OO#U+=y;y+pV|emSz|`jb_Ds zuhptJ*}(Fgu4(m+ZEZt0%Z-YTwAD@BBn_;k;x>j|U3pa>O0|{e^(Y_fS_D_pLQmy5 z8jMk|R5de>E}9z3s3!B}X4TmGU>?Vb-plWzxmp7Y)odc9sh5-GL{mc@g8s+^3s}3! z@Xxv$r(LxidZ^k=sDabL@6U2-U(~dm?x~aSq0&E!ia)zP3>^B)1*GP`;~?dV6L$*I rgp`x=xorB%OJBWBNW=Hsv34de6=He5l%I&NQV}_Z7eZ&UiJbixPJK(J literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/settings.cpython-37.pyc b/leaderboard/research_env/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..532677b70fabb59087dafbcc015be0673a7edeca GIT binary patch literal 2515 zcmb7F-Ba5}5Vwu6jS~nVbSm{nycquS zNW8{}|AiBzND9)BandAB)4Q49CPrq7PJT|ugJfZXB1e<|oNclWDj`X5cn_llZ$p zv+(Wb49K4{EKO$N4%|h}J8&t$^)jquFP`TZ6 z9NA%9$bS1|SC$9ph_XQbXgNK~|BtVLwnrTOiFJ~yhAS)Wg9rETKlh%sy?v{@@L}Pe z^JL%K^V;o4!2)f**xx@~J$TvvetGZpGVC8d=ss(NS9+WVT(P=cu58C-(f8WS4(~eD z0va@ZD}cVVa>5ws%=dGlw0utltf?e<4=;^#d!iHG9Am~N)Dz;UOL=&8OvowccoL@t zE($CgEpCik2t2!1d}2IY8pvD*;LrmrpbDq0UckhWVho7QV_Ep!IMl$oGGcG^c_UVf zr=4IaxW1?d!; z>iJhT;jq@;uGQMZZc%<-4=k6~x^Y|Z5xa|{&8YMOhllC_N>I1!U_UBN#GoDw`$Z`w zt=SleIhji;;82*@NiB@b4|w=!9OSf)0<_t)!^daP4Cp>~l?a~udNy`0A`ko6KWw&#h3;7M&COpU!IEZj3)rE z&k9iOxiny{(+HE)Tk3H#vE3+!c@@6~*f%PfbSW?^%&Ey+C55K%3oZhyyBf}p+<8kK z-=$>I@onZU-i~sniMPLLMj4++Qr8k4JTew|*dI~OYVw4WH_iA8GEI_S(+oYXfT&>T z#k$@w-|Fw9$&$Xdy%9}ol}c?#FPU#@M#G3^%2lI*EM#EW7*S!fTq;%c9j&fM=j*jv z!`!Y{inZ!`G}X{Iw<=mgH=@}cW1}4FSIR{#uCPej^_dqqF0>ug)Ph{{<&0 wlb^VilP08$l+C0^M^^e`H6iuanIU&3E9GK(zL1@WM4Z-I3mMK&H~;_u literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/urls.cpython-36.pyc b/leaderboard/research_env/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e462fd4e8f6a80bc7f8878a822ed7596305f7bce GIT binary patch literal 1512 zcma)6%Z}SN6qRgQw&lloW)e@@MM0nokAaDZP8I=-CTJd$c7U`2(j*Hls%XS(TZSka zB$X!KW?9UKaczJkuU(}t!An1IZ{_X7wV|GJ4Y1L&@fR>y3}4z67`s;!4;y@A#vYdx;5 zH*n=mcGHX&el!Mebs|5)7#fIf;qwI>UpMYL(U_h5>`ZSZWy5hKC`e?wjG=f#UOsP7*Fx$UA#*7>;qT&Py{?UW{PUV`L&gC1BE+Q_ z?DBLnIjiGZ3JzzaNI2Y^7(AH(KeQ9E~jKrQS2XL@7! zVWMIqaytEwN0&vKmn6FatRL-{P+Lj|U3Ew$c zbI)v2KHJ-?Tr4OiaJSRM7_9DOIt~8B6Xi_Z%2yhDBt_Iwpfx(L5VsP>v%&zIt!bn3 zOhKx4Ew=G3fmY6DguTT;UWr69tG?+cXqjC}&(MzlZ48rAFD3rMoG38R z_K5l-o+Wk-r~B08>J_$H)vkN43ebiT8>1W=Qg83v zRISGs4_|&?b$`5geEA^8?yG_=eE#g&iw}6eaW{hq9nR!<#nFjG(_hS|779JGimgq_G~N^%h!> zjPqy5SU@^@;cmrqDuk2cJ*a^rrQt6;9d750-x?u3DBQKte2%RRqOr z^78ppa>0v5x~xR3QeJr8ixrSpmB`9iDG-HxMY2>XB6y`h>IIT0PF|<*vkb@+E=bM= zkhEBEksBAJ%pjIPB*5Gwc&(Hw<(yK+6B)2|Tr7Dh_!<%wBs`~3(DUG&Dqg0Eq?$}| zdr7^^H*t=>XSv2%K0{3+j0at z;X9EH_sk^aqt#w#d`U5ZyPam*VEoQ}-}@6!l;zvCD;4%gf~Y4!DHJaecVd>Og$5>D zeyetLLF#VfY~vaNt*y-jdy9d%=CNSL`=&2oi46*Z*1a7>SB|dU#zhfnK{u01f{@gV zf|bfMWQ-JGd&LSOO|3g-a?`~RwmRJ$zF&evv!>SGaIooN`!3Q9Xx(j)Z-*mn?<$8v zMS^qnz5i+5jUu!~QFzj1Sr^BM4z_6!cpR;Ius18(XbH#vT9inyg`;W59~y(WQY(SK zFe~&lG(95UJJSUfF3yUsUfeOkgr5F1Oh={)YR3@!n$v%(bM+&(THS4WuJ+J|5o@Cu zYtmrv+|-@Nmyce4UH8Ace0=pV!tSfREqwm$*^6H-@tNLVzy7|U`WVqTgEw@UDk`!B z3wU?0m~{WY^x;5D49d54?_SPXmBE7pbSXc_mtzl`dtwjU8jtNM-bapW_w0WFS|ZuZ literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/wsgi.cpython-36.pyc b/leaderboard/research_env/__pycache__/wsgi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2e336235522776a0402a86fd7c29df819da9722 GIT binary patch literal 566 zcmYjNO>Yx15cPV~CR!-s0GuuL6baU-+z>(qwM0Q}dPosc4mj?5vT@|KSGJpeT>A_7 z8T=)S8z=q(Cnkw1ttF4g9?yGk-n)Z?VsKdf_?Z#%hjdns`7!SB7K0))qB2EIHp}qL z4Q=vSo)O4az15!Tsl5k^xBP+3_7$Cy;r{*a;`?+oW|gxGU9*Mr%tHX_tEB+DX03NC zsA5?ZX#WKb=yyslGDwJv^ZS5X4Rj%P+`B8bqm+mGy zuAnvUt^phQO{g_5{-P&jGR)G88lu>|iH?l)>g4OE$>>5%PcJXWlhIV1Uz~h9JH3C| zwV(_TqqcPz_ETR7)FDKoE~Mu>HD!fElpAbMkuCMnHtn5F1vV;J$ZHeRlMd}K;tTw^ z4gWr)^ai*zaLa2Qxi^*c3O$qx{FTF;ck`~W?Tlr6mj)kp&VL*rY}kYz9nh!r8T}8m CU9+qJ literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/__pycache__/wsgi.cpython-37.pyc b/leaderboard/research_env/__pycache__/wsgi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2d455108c59a796a1761dc652c2dcf194daafd4 GIT binary patch literal 571 zcmY*WO>Yx15cN7~6D<^R0M5QfDr?juLKPn^Q7T9eDMHEt$6Zf0j=c8DcGHh5zkq)L zNB)wZ!AdDg{d(&v-QNJwLzS+sg^A!`qW@KQco8w#CEhV)7Puc!fccDN&iC zCYxq>b_}gM(@sVpTXui$sIJ=iMX~C9C(~U;CuFdD^C$m08ID-#>|9rD?mY7lK>Bha zz^+*1-4e=JGis0WetkWX0mCF zE@jlt&Sr@B5vgkDfoY4Z^}4~FMQ|P1TpQSD0U%$**o4=dD_4d>Ev2p8gQn8e94tR5 z4*0@dM#mL2#$DH7Bfkul=J`MLgp3DSdR9Rc?VZ??kzO2~yc-Ws#pL+xY&0HD#OKqa zFQ1NYo^M-F1c*`FDhzt5Cj{ycB2gF8(~X*<#77h@wx`IJdT5*W&ZZm(70l&@iRsZ6 z?Qi1S?_7tw4=B9`E)87qN=NQZDZN4ur2>EMFz4H1{x4e6qPb4}Hyi5@`-mIb(4~F) Hm_DKRQAV|c literal 0 HcmV?d00001 diff --git a/leaderboard/research_env/settings.py b/leaderboard/research_env/settings.py new file mode 100644 index 0000000..131425e --- /dev/null +++ b/leaderboard/research_env/settings.py @@ -0,0 +1,130 @@ +""" +Django settings for research_env project. + +Generated by 'django-admin startproject' using Django 2.2.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '2fw%$$6n0fnqap&^&#l+qnknff(r&eb7qqx3w8f91k@1dqx%p0' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'users.apps.UsersConfig', + 'leaderboard.apps.LeaderboardConfig', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + '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 = 'research_env.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'research_env.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.2/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/2.2/howto/static-files/ + +STATIC_URL = '/static/' + +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' + +CRISPY_TEMPLATE_PACK = 'bootstrap3' + +LOGIN_REDIRECT_URL = 'leaderboard-home' +LOGIN_URL = 'login' diff --git a/leaderboard/research_env/urls.py b/leaderboard/research_env/urls.py new file mode 100644 index 0000000..e678833 --- /dev/null +++ b/leaderboard/research_env/urls.py @@ -0,0 +1,35 @@ +"""research_env URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.conf.urls.static import static +from django.conf import settings +from django.contrib import admin +from django.contrib.auth import views as auth_views +from django.urls import path, include +from users import views as user_views + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('leaderboard.urls')), + path('register/', user_views.register, name='register'), + path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'), + path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'), + path('profile/', user_views.profile, name='profile'), +] + + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, + document_root=settings.MEDIA_ROOT) diff --git a/leaderboard/research_env/wsgi.py b/leaderboard/research_env/wsgi.py new file mode 100644 index 0000000..f409cef --- /dev/null +++ b/leaderboard/research_env/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for research_env 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/2.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'research_env.settings') + +application = get_wsgi_application() diff --git a/leaderboard/tests.py b/leaderboard/tests.py new file mode 100644 index 0000000..1c74979 --- /dev/null +++ b/leaderboard/tests.py @@ -0,0 +1,118 @@ +# when done python3 manage.py syncdb +import os, sys + +proj_path = "/Users/juanvargas/Desktop/Research/rlcard-leaderboard/research_env/" +# This is so Django knows where to find stuff. +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "research_env.settings") +sys.path.append(proj_path) + +# This is so my local_settings.py gets loaded. +os.chdir(proj_path) + +# This is so models get loaded. +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() +from leaderboard.models import Agent, Game + +# a = Agent(gamesPlayed = 100, winRate = 0.123, gamesWon = 12, opponent = '123', agentID = '321', totalGamesPlayed = 100) +# a.save() + +# game = Game(gameID='int',agent1='agent-name',agent2='agent-name',replayID='int',replayLink="http://link") +# game.save() +# a = Agent(gamesPlayed='int',winRate='1.234',gamesWon='int',opponent='char',totalGamesPlayed="http://link") +# a.save() + +# We may need a function to generate a unique random id or append to current + +# We need to unpack user data +# Should be in the form + +# These need to be gotten from DB +# replayID = 10000 +# gameID = 10000 + +data = [ + { + 'agent' : '1', + 'gamesWon' : 'int', + 'gamesPlayed': 'int', + 'winRate' : 'float', + 'path' : '~/Test', + 'opponent' : 'opp' + }, + { + 'agent' : '2', + 'gamesWon' : 'int', + 'gamesPlayed': 'int', + 'winRate' : 'float', + 'path' : '~/Test', + 'opponent' : 'opp' + } + +] + +agents = [] +games_won = [] +games_played = [] +win_rates = [] +opponents = [] +for item in range(len(data)): + agents.append(data[item]['agent']) + games_won.append(data[item]['gamesWon']) + games_played.append(data[item]['gamesPlayed']) + win_rates.append(data[item]['winRate']) + opponents.append(data[item]['opponent']) + + +def add_agent(games_Played, win_Rate, games_Won, _opponent, agent_ID, total_GamesPlayed): + agent = Agent(gamesPlayed = games_Played, winRate = win_Rate, gamesWon = games_Won, opponent = _opponent, agentID = agent_ID, totalGamesPlayed = total_GamesPlayed) + agent.save() + +def add_game(game_ID, agent_1, agent_2, replay_ID, replay_Link): + game = Game(gameID = game_ID, agent1 = agent_1, agent2 = agent_2, replayID = replay_ID, replayLink = replay_Link) + game.save() + +# Will return true on new entry, false otherwise +def checkAgentID(agent_ID): + if len(Agent.obejects.filter(agentID = agent_ID)) == 0 + return True + return False + +# Function to update agentID +def updateAgentID(opponent, gamesWon, gamesPlayed): + #if agent is new, then add to database, else modify agent + for i in range(len(data)): + if checkAgentID(agents[i]) == True: + add_agent(games_won[i], win_rates[i], games_won[i], opponents[i], agents[i, games_played[i]]) + else: + agent = Agent.objects.get(agentID = agents[i]) + + agent.save() + + +# Will return true on new entry, false otherwise +# def checkAgentID(agentID): +# command_line = os.popen("python3 manage.py shell < agenthelper.py").read() +# if command_line == '0': +# return True +# else: +# return False + +# #Should return a tuple in format ([agent1, winrate1], [agent2, winrate2]) +# def calculateWinRate(agent1ID, agent2ID, gamesAgent1, gamesAgent2, gamesPlayed): +# #Check to see if ID is in DB if so update currrent info else just return +# return([[agent1ID, gamesAgent1/gamesPlayed], [agent2ID, gamesAgent2/gamesPlayed]]) + +# # Function to update game +# def updateGame(replayID, gameID): +# os.system("a = Game(gameID='int',agent1='agent-name',agent2='agent-name',replayID='int',replayLink='path')") +# time.sleep(0.5) +# os.system("a.save()") + + + + +def updateRanking(): + print("brb") + +# when done python3 manage.py syncdb \ No newline at end of file diff --git a/leaderboard/updateDataBase.py b/leaderboard/updateDataBase.py new file mode 100644 index 0000000..6a770ac --- /dev/null +++ b/leaderboard/updateDataBase.py @@ -0,0 +1,126 @@ +# when done python3 manage.py syncdb +import os, sys +import uuid + +PATH = "/Users/juanvargas/Desktop/Research/rlcard-leaderboard/research_env/" +# This is so Django knows where to find stuff. +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "research_env.settings") +sys.path.append(PATH) + +# This is so my local_settings.py gets loaded. +os.chdir(PATH) + +# This is so models get loaded. +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() +from leaderboard.models import Agent, Game + +# a = Agent(gamesPlayed = 100, winRate = 0.123, gamesWon = 12, opponent = '123', agentID = '321', totalGamesPlayed = 100) +# a.save() + +# game = Game(gameID='int',agent1='agent-name',agent2='agent-name',replayID='int',replayLink="http://link") +# game.save() +# a = Agent(gamesPlayed='int',winRate='1.234',gamesWon='int',opponent='char',totalGamesPlayed="http://link") +# a.save() + +# We may need a function to generate a unique random id or append to current + +# We need to unpack user data +# Should be in the form + +# These need to be gotten from DB +# replayID = 10000 +# gameID = 10000 + +agentData = [ + { + 'gamesPlayed': 1, + 'winRate' : 0.5, + 'gamesWon' : 1, + 'opponent' : 'DQN', + 'agentID' : uuid.uuid4(), + 'agentName' : 'DQN', + 'totalGames' : 1 + } +] + +games_played = [] +win_rates = [] +games_won = [] +opponents = [] +agent_ids = [] +agent_names = [] +total_games = [] + +# b = Agent(gamesPlayed = 100, winRate = 0.5, gamesWon = 1, opponent = 'NFSP' , agentID = 'NFSP123', agentName = 'DQN', totalGamesPlayed = 100) + +for item in range(len(agentData)): + games_played.append(agentData[item]['gamesPlayed']) + win_rates.append(agentData[item]['winRate']) + games_won.append(agentData[item]['gamesWon']) + opponents.append(agentData[item]['opponent']) + agent_ids.append(agentData[item]['agentID']) + agent_names.append(agentData[item]['agentName']) + total_games.append(agentData[item]['totalGames']) + +gameData = [ + { + 'gameID' : 1, + 'agent1' : uuid.uuid4(), + 'agent2' : uuid.uuid4(), + 'replayID' : uuid.uuid4(), + 'replayLink' : '~/Test' + } +] + +game_ids = [] +agent_1_IDs = [] +agent_2_IDs = [] +replay_IDs = [] +replay_Links = [] + +for item in range(len(gameData)): + game_ids.append(gameData[item]['gameID']) + agent_1_IDs.append(gameData[item]['agent1']) + agent_2_IDs.append(gameData[item]['agent2']) + replay_IDs.append(gameData[item]['replayID']) + replay_Links.append(gameData[item]['replayLink']) + + +def add_agent(games_Played, win_Rate, games_Won, _opponent, agent_ID, agent_Name, total_GamesPlayed): + agent = Agent(gamesPlayed = games_Played, winRate = win_Rate, gamesWon = games_Won, opponent = _opponent, agentID = agent_ID, agentName = agent_Name, totalGamesPlayed = total_GamesPlayed) + agent.save() + +def add_game(game_ID, agent_1, agent_2, replay_ID, replay_Link): + game = Game(gameID = game_ID, agent1 = agent_1, agent2 = agent_2, replayID = replay_ID, replayLink = replay_Link) + game.save() + +# Will return true on new entry, false otherwise +def checkAgentID(agent_ID): + if len(Agent.obejects.filter(agentID = agent_ID)) == 0: + return True + return False + +# Function to update agentID +def updateAgentID(_opponent, games_Won, games_Played): + #if agent is new, then add to database, else modify agent + for i in range(len(data)): + if checkAgentID(agents[i]) == True: + add_agent(games_played[i], win_rates[i], games_won[i], opponents[i], agent_ids[i], agent_names[i], games_played[i]) + else: + agent = Agent.objects.get(agentID = agents[i]) + agent.gamesWon = agent.gamesWon + games_Won + agent.gamesPlayed = agent.gamesPlayed + games_Played + agent.winRate = agent.gamesWon / agent.gamesPlayed + agent.save() + + +# At the end of the game, update the rankings +def updateRanking(): + db_size = Agent.objects.all().count() + for i in range(db_size): + agent = Agent.objects.order_by('winRate')[i] + agent.Rank = i+1 + agent.save() + +updateRanking() \ No newline at end of file diff --git a/leaderboard/users/__init__.py b/leaderboard/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/leaderboard/users/__pycache__/__init__.cpython-36.pyc b/leaderboard/users/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78d26e2c466ee2011a617696b22fd4db2c94420e GIT binary patch literal 146 zcmXr!<>lf~PL5*$g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m%V;Qer~FMVoqv> zetKq!eo;g`k0=pkxaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpd6aF#78UEq$7kkcmc+;F W6;$5hu*uC&Da}c>1DX68h#3IY1tp09 literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/admin.cpython-36.pyc b/leaderboard/users/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c25f6450d604c5c71a5eeac27d037a230052a3ea GIT binary patch literal 260 zcmYjL%Sr=55bWMZvV_E+@ZuhlId~1?7X-oE3c_T&v(7TJ6M8lf&wh=+v{z601y9aI z5F4tfDjKTpSF1&J+rGX4z*ofIWl=pwgu6%tgcck&h(HPx# literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/admin.cpython-37.pyc b/leaderboard/users/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83c092c42d7ff17cf60987b6909cc470da908001 GIT binary patch literal 265 zcmXv|K~BRk5cI}LiBQWs$btF;P$7;S5E8c_f!yqpy0T-mP7(YDj(jOsPW=Jm#JY%) zc6Mg9(#+LjajXQZ@9T$q*Y}&8$7atsVNf?BX!8TXP{V(=0?JpSaAXOm3v9X6juU zi9Z$Baz4<{h1tYF#(H`+y&Dbt&N7~PvPis+q773b%iZRYh8MF-#K|1WET7+|`dor` No>sY7%4u_$7r%vpM8E(5 literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/apps.cpython-36.pyc b/leaderboard/users/__pycache__/apps.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd2249fff76401a4607b9dd7e6301b2832e1595c GIT binary patch literal 503 zcmYjNyH3O~5M0LzgnJZplt@%5ND4|2I&=lyHHan!mWh2K$a!FM5{E#Wa0m zMWo_uk|p0TMKbD-&bw~jHp_KY;>pe;NM_*f1VEF5Dgv9dU_Dn6_bh&RfloGA zloVFbkOO@V?nVF#SPXdu1O?H;;$TLLaahaUx@x3xS>$7<&C=q7K8Zbm@H^qFw$@x4 z{miTNBe$lMR-G9wm9}>+$9|%#mYGW`T3GuLz=D!nTv?;IzWqW}9mI0t}hmg`Z3MY$<`JuX(P1WWo Z%A$*iiucfY)GO6LeeyOC2nA-T+HuX=(80 zXVPh1gE!Kl#vSG=)1Ww)S}6Fo@%v5*R;2ml91gE(b<_W-@?k2)0ROysY*2cz^a~Jz zM3j@r686|xkjMq!lw082T3C_CZSd<<_@6|Q>Ov^Q-@viIMt-s}pzgnrU`yI~&ag6uk*wo`V%lS;A-i+g~ zGbXDOg$WuL4uv${Fcp&PUqtPLwG@BO!cm@ykV)}9OwuA$a=;Wnm4b1hu5!@Bbsb~V zVaa)S`olOFaUH-kCLU0SszXrv9bYxkMGM6q3TPW*>hCe3bBsdO(2AE=!BpA-+I$eW zmbigcS~jTu|I+Ot;g?g+3UQ}!7+((^J_WIAgsO0f1w|{%KR?{WC`+aS_@_(=sNukoKE}IpjZaGl8nyzQNE|eppa4L+qyj-S)O>JryIFHza e3JX*E-PIW;ID>y-tluKb8b_*0%hzrP2f<%No*mKv literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/forms.cpython-37.pyc b/leaderboard/users/__pycache__/forms.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e55f269a14d94013fab4414a5c67154b2b13bca6 GIT binary patch literal 1433 zcmb7DOK;Oa5Z?7WuadU3K*fn$4#a{pR1t_GAvHpvUVOmXW;c$jbsTmb9=Vnu0!RMR zUODw2AWqEKNzW_uP&G*ay4@`t;Ew<;f|QVj6V#bblg zgQXvV5G10UM3%6>J3mO|f^W(#@NJ!2k;iTD>s0vfM3U-4D8ygEyJX|x3SQ(O61TaN zIFZX;K=NjL80l4{?y)GC38r8kvrHIQWGt1YHep(S&J};MRG;=co(bX@@5QmH$8nbP zsYJaQ#~-ImRwoJ*G%g$pX}n=7B-cNQ+6HSW{yYyyc_u<8#g{Nii%`h{Q~a?Mj0<&| zgB~iO1yh4jEXJQg3{Hn7>D|d!<6y|x92zqZs6*8*DE*GFn&_j2VhaWI4Kejsn9&i2 zp=xNw%gbmgZ3k^W2wZdAz$z^(T>pRVwvh3Y31@}4RymBXhYs(9Saw2Hxx|91mGz(P zu40rmQvv)_CIn?!PaMNkcTluZTvC4}S!4mTz7>h;F2ekqy*;>sE|=_~WixvRaI(mE zrQ_{+$8XOE=LX_%yn3+o{uLl$BXJ1@+AL^xd$xZKr0RAz%~&Ef(B=W!Eoj4Pt<&bL zm*B=O!;tSG0#-ku3itg^(|G)hjg!1;+JkD-9pvLerKepsEk@mPqI5N04>nyWM?~RN s7;k>LObMIX)Q)i=u?H0vru4h1GfeOd{)M?dM3yy9l_(voPuHZb0sP*$gNM!)I?~K$id;57Z zl_|zI1GC~V&%j9%Q$b=Tow+ML@V=m5SsVZg1rv^NVbu|y@GnT*y(AMV0uf$>aqp72 zB<@4@jtvfVG0BvKe4S#!fr6~$vM1yusZ}+cm(#dkwp)0ar6yuFSO;yVE>)2TUKJ^A zXc2-lNJaL*%oey6nUgvF4g&pPkdPfL!`qvb%(^vP)rRO7Nsc63Bh}<5(S11k`|)U2 zt)ym)-982X8oDW zrnAa=r{K?d?8)p*y(hHVxi}Z^8?W4bxDugEh%iDzzbs)FP^Pa8pAX_42_? z2ri`8=oSl|M#Y0Dv>h=|7Sm!V#x0+n^*SvUmCnY)q^@Sewpm(o&f)&+R(S6X{)^3* YT8%LEKecT5sJ-|TYV-$G5;5-VjcJq>Pp#a(M6qhhN z2YEE-v5BvT$!dn$1IJN_843xvGMhW#U53Aq&;#T%!YpRPs>dAWUZJpmjb@m6%)j!( z!8Ni`IE3sy?H$Q-mI@B}dSyX@0#OK;H=@B!>(C{yHVmb^}+{zVStr8xpqSV)g^cA)NiQ zGfB#vPa?rTPUdMnks^*HdnkCsxSW=NCz2~3$vC0BIGdR7s7WW}xca0$N>wc>HDy$W z7Q&0oRrc{J_K&&)VGC>%Or3zMQH_`Al4N9wm*gwdwzh6;xR8^%xA?+ZTA9c2sjVIX z@(q$lj9l1D>!!D~Z(%Wy9rO{Nv)mpl+{VttCJ?57Evk!M-JLEk(?{-o}Ra}mFDwsP&Red)KsO5 zw$7BsB2tRdR%JPYV{!|e0m=xE@HW{Xcd(87crjcHW_Sf7?Ne%MMXByn3R*Y9;31_S znn-jJX|&d(w*@~b!M#YiVA5!-z5U(e{oQBJWzVeoZHIT^ZFnI~$Fx-RXhkySLad1z zY5|sa&8C*L(aQx>J~$t5;SJ(jt%`?%uX`+uig`I^(~i%*)jBSVTBg%+)YQqiYnG0j kb#(B$6W)1ae#Z7ookk}0f3>v#q`UZz>33x)3^6>`UkkqqhX4Qo literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/signals.cpython-36.pyc b/leaderboard/users/__pycache__/signals.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de243ecd2da793122f30b40a9f724a8d704f235e GIT binary patch literal 706 zcmY*W!H&}~6ttZ*NxSVX0)!A(PC3vVxS|zzq-rI^B|@y+_|YafN%fpAAoaFf_d~es z2l>ire}NP4IbEqZ^7zFbduHsni^VK^U46NiLi`aYEvEWCb@!RT2qUd%Who`s%BnUh zqfkdSZYSl0>ex(d(xzo91x!FfWRg2&Qj`4>x3bJm=B8#A=BDQCqsZqEq#$zXr@P(_ z*G}I6{luRfAdMM91@#T!136??dWHSh+A=3`&>6rg;sdC$XRbd`cP|JI3ZD+5k&QY? zBkzKHQdBDz*t0-{3GsZ|uN$Za=aULS50J;0@_bfzZqQu?J{=c~PriNExN*M)o)hEm zWwGsBD71wi#ikw#w3SBl#)2ki>z?Z3v}RFPxO&rR>z2Ep{(L<5dN-zGRmVAmiX}dw z@xOF@2O%A6A7n$>ZUw&srIM>$`Sf^>kHbBVG4PDoIA>Te@a7RNsPc2BJ{n+xQv^cc zGs0CqD_@#Mcbk4`*2}gxK*o;&kcs})ak=Wd0qgZr?}zP?i2NM>;&FfNc6z9`$N_ya ho)sP-Bn^5e=7P=OFndSby@gB8?`8yZ8NTRw@(*M0r}qE= literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/signals.cpython-37.pyc b/leaderboard/users/__pycache__/signals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c23b86ac1e8819903014a5c45730b1c75fd8937b GIT binary patch literal 711 zcmY*X!H&}~5VeyuNxSVX0)!BMkOR#RpapRRsX{_rB1GlJL!00v)i~{f)Z6ZL{{fC% z_#j_7?H?dc%s8#IIP!Qre)fAW_UqYfBB)*ddGqO)6yi5ePA#J36?OZOf)-jD(a1td z&I1!PVG;T~G*L4uMwCZ-Wa1_%5-DH=5<(r{20GE{jkuOYdapLt6JHzav-cvK-VuYy zq#JKL+b^x!15Kh27Ldjip@eD=ct;8umAu35b7dG4TWB?48S(+tSTpBusoN(M4go&w zMJ?;#Aho>p>WMK}Fu{%qLW~LLl5SN)*;^Nv2&#uH!i4K-)!JUQCAef*&@TRRrEqP3 z3Opyo-YJ?l&w0-a|8Tf6IWF=)a`1s?gvKd{83*1x zgbT{tl%Xd946sZi0(?Yqkxh!Hx>oJFo9orQ=`@h=qXA@~dv;tdySB$_HCMZSa|9ya whr2lKuk2R!(<@A05O!zak{^NPS38yd3m?b-0E7yu&Hw-a literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/views.cpython-36.pyc b/leaderboard/users/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2749d6c0f6a63e4459387c09f80c5e4ef1ad5c19 GIT binary patch literal 1240 zcmZuwOK%i85VqaV>C6lRgoijp9dViiGY4)6A*9tJt%R}>fdhRY>a?Ai9{Lf=?f}t5 zT4}iMbx(*pf5}%){DnPH<&MHbbjzQs%67HC`l|1bMoE0Pc=ah@>){3#HK>SM8!~4ne)?a9Mukbj-7p7h1tH zwJ5bw@T7&>jw$luMCL|0|LQ)p$7Q9yhYC7NkHCSH*&jIcKEj%bt|0w2FZsqpdf}e+_y0b4e)iyH z+d-NaMcXwdUFJGHQmRP{PF8);~th(}4|ZWtOdk2w6aaVB=CBp5|34t*`S_1wI8M-4z8E6-Zei{#g2mimJ4M zA^M*gT*K-Ahx27yt9f3jck@MQ=1>(m$a|H_QKh36?fH*(f49?8z16dm_oQMk3Ef9i zLdFw(V;&11F%cn$ZH!)OLD##~;y-jQwK(pzK;M(%Ux8KjNgEsi#a1Cky>o&3M5xn0 zYjH92RZM!J?`AVtC8&<)blZ}?)9sGSO?gpim$%QyDc@Si;G;PA%n;9oYtJbf?YZ(& zcb1Jdc~hvfo!^Vwxh9mmHah8BklMUEB*koa;^wn!ec>)PI8CP`7$JX%37nKZZGr*% zHhA*a(?1X3CasMLt`Jc1U_$U+S0AoY;1V^5S_oAiXKkAAtmjUU#n>?-w$eriqSn(!gM+g?2W1{h^9 A(*OVf literal 0 HcmV?d00001 diff --git a/leaderboard/users/__pycache__/views.cpython-37.pyc b/leaderboard/users/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..020a8244b39fbaacbf1c0e38dfec16912860e9ba GIT binary patch literal 1245 zcmZvbOK;Rj5XZaQ&za234iFyNL*yLiz|0-(BD4r35DF2213nNr?#_&}eq^iL0iub7 zG+eoILMS=%mHNtwZ-6*a)eb?6u+`OF)poi6^(+4~9QGMrx4%Ao@iAcRGdVvl4;OcE z=%;8Tle}aVPkAL$!O0h;SNW;$)?OJ@VH)Dvmq8g-aT-^>v{&`hKE^^By=Cc|3S}&N zZ`q2c1KHnUleI6HnN5TZLDf=$jX}u*RBk5R#+A}Kn=6g$QQ6FkdKc7xEpE#%oL=+n z_?cGlM9m9r6x?s1vLlK-JCvDG&cCz`&3;j;pP`)IrAy#I$?Pr;y^Utc4p8L30&W?O zYq8=de92F}GX{5X_Rkn+CO8e3DE$meU?S!&mHtn;3Uc{*o7b<)OTA%lg}o zcb*>Kdfv2on)Yrx_Oyod!}*j4q>tUKIM zpD9d7?b%4)`v?JxK8E<8XM(JZPY8{0C(mJ zZBnkQIP?Y@Ci;BL1z$&tuy_Y+z(=0ovFD!Mnhfn&9%S{rnd(IYCU1>)&E&prN9TL= zIVkqJ&fEBZaGJGdF_kKBATteUAoMn%(&(;95vQ Mt}!3rz3#=M@663K^#A|> literal 0 HcmV?d00001 diff --git a/leaderboard/users/admin.py b/leaderboard/users/admin.py new file mode 100644 index 0000000..d914f1f --- /dev/null +++ b/leaderboard/users/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import Profile + +admin.site.register(Profile) diff --git a/leaderboard/users/apps.py b/leaderboard/users/apps.py new file mode 100644 index 0000000..b8d67f1 --- /dev/null +++ b/leaderboard/users/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' + + def ready(self): + import users.signals diff --git a/leaderboard/users/forms.py b/leaderboard/users/forms.py new file mode 100644 index 0000000..ee5757a --- /dev/null +++ b/leaderboard/users/forms.py @@ -0,0 +1,26 @@ +from django import forms +from django.contrib.auth.models import User +from django.contrib.auth.forms import UserCreationForm +from .models import Profile + + +class UserRegisterForm(UserCreationForm): + email = forms.EmailField() + + class Meta: + model = User + fields = ['username', 'email', 'password1', 'password2'] + + +class UserUpdateForm(forms.ModelForm): + email = forms.EmailField() + + class Meta: + model = User + fields = ['username', 'email'] + + +class ProfileUpdateForm(forms.ModelForm): + class Meta: + model = Profile + fields = ['image'] diff --git a/leaderboard/users/migrations/0001_initial.py b/leaderboard/users/migrations/0001_initial.py new file mode 100644 index 0000000..732a3ea --- /dev/null +++ b/leaderboard/users/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.7 on 2019-11-15 00:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(default='default.jpg', upload_to='profile_pics')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/leaderboard/users/migrations/__init__.py b/leaderboard/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/leaderboard/users/migrations/__pycache__/0001_initial.cpython-36.pyc b/leaderboard/users/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acbc01b549cebaf2f913d29b9a0b1437cf6cc5a7 GIT binary patch literal 911 zcmYjPOK;Oa5VqHjV>?b-pcjq^36uj#5jTWTqduS#Z4oUOA6RWN6JxV}uy%m-3fKM+ z{?cAK@fSETYp0L3cJ$4|voqh!i{UWzA1^)yj%EF^?i`o!9^LvS39!JHR&K|(Z7`E8 zcVZ`ZW4F~E*^9k57P!#+WkC;}tpC%A`{0~gWA88hZ;fs3*Vr^^k{ulQ=NEVwCMZjHuo%9h_VjccJ_5Rk=(hYL>#0 zX2%C(S4U#ilzgF3GzfZ7sWcaA&A;GU2Q{ix$n+9*^bOU#tdSQYN8O{C1TP1GOR&yyur0k)e-~9H<`f86VF6ey)`}U|*6icOTmJF< z@B=?NJ2-r&qnn5nYdzR+n?EswQ)W?gFe6TmOffnaeVEvlYKB^@Q@a;@|1?bD85*Nc=HP(q^jULMV79QGnr?@boS= zl-1MQ4V&)n?mp+6)+g0k^(eDXw;mb5TxaCEHe);Xw%z*1z8-XyP8Mac>?jE~7MQo} qb!|VqF;2QIo?LgO9+~pZOSg@5=qcH>|Ee3&Ycq-3BN5T-zVjaz!3wPa literal 0 HcmV?d00001 diff --git a/leaderboard/users/migrations/__pycache__/0001_initial.cpython-37.pyc b/leaderboard/users/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1be47a6d94bca935d8b891a62d546ed1afb59a6 GIT binary patch literal 916 zcmYLHJ9E=O5Z23jS#|=Xp`?Lvffd>elZnX#!jOa^Nuz?Bvv;jX=*3A6I4!jK4^Z-# zuBGB1FjVYGc5<5A*_Zad{dQjs2EImT_wU<}o~dcSm9ah+DSLG59TK2{o@u!r>AKR5 z%*f5i%&o|3Z8Pgd_G=9+=zZ6qhi2-0Gb0Dgb8Te*q5rj!F5McNCMn{2WJo_xV!@lF zENW@zC16&c&Q#v|c%ipDWJ#x`XJutvTKkb7~A0Yty z)|wmOkS_oiJn(M~vioEYaF}kSe!7`HP&FV>k=TU6twGfu!jSN8Nbh6~?m{~6MLAD0 zltuza(l|aCSu)^@rergLyg`utN+dZKOZEwu(yLJMy*i_>>X>D=Ywu*-{uPv@yB7 zc*8Ew4?nPzvxCETGPuh~u$KM(w)qn^IH49rdK2R0NP&_5v1+x`2WJIdlq5RShLjg^ zDGiuPw{3?uKsx)A^Zm)eq4diNS6lH*6HlpbEB>8@S7nYN&+uy)Crv1_85i(8Lk@~# z(nEnYaxuGNSX_sSvpT$Av2c5P`vqI|KCYIcN2Oi5^-w8>WezP%H;gTPQ*UDlf~PL5*$g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(mzRD zetKq!eo;g`k0=pkxaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpd6aF#78UE~W~LV 300 or img.width > 300: + output_size = (300, 300) + img.thumbnail(output_size) + img.save(self.image.path) diff --git a/leaderboard/users/signals.py b/leaderboard/users/signals.py new file mode 100644 index 0000000..3a691d7 --- /dev/null +++ b/leaderboard/users/signals.py @@ -0,0 +1,15 @@ +from django.db.models.signals import post_save +from django.contrib.auth.models import User +from django.dispatch import receiver +from .models import Profile + + +@receiver(post_save, sender=User) +def create_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_profile(sender, instance, created, **kwargs): + instance.profile.save() diff --git a/leaderboard/users/templates/users/login.html b/leaderboard/users/templates/users/login.html new file mode 100644 index 0000000..c460d29 --- /dev/null +++ b/leaderboard/users/templates/users/login.html @@ -0,0 +1,25 @@ +{% extends "leaderboard/base.html" %} +{% load crispy_forms_tags %} +{% block title %} +Log In +{% endblock title %} + +{% block content %} +

+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/users/templates/users/logout.html b/leaderboard/users/templates/users/logout.html new file mode 100644 index 0000000..b531d78 --- /dev/null +++ b/leaderboard/users/templates/users/logout.html @@ -0,0 +1,13 @@ +{% extends "leaderboard/base.html" %} +{% block title %} +Logged Out +{% endblock title %} + +{% block content %} +

You have been logged out

+
+ + Log In Again + +
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/users/templates/users/profile.html b/leaderboard/users/templates/users/profile.html new file mode 100644 index 0000000..30f66ce --- /dev/null +++ b/leaderboard/users/templates/users/profile.html @@ -0,0 +1,28 @@ +{% extends "leaderboard/base.html" %} +{% load crispy_forms_tags %} +{% block title %} +Profile +{% endblock title %} + +{% block content %} +
+
+ +
+ +

{{ user.email }}

+
+
+
+ {% csrf_token %} +
+ Profile Info + {{ u_form|crispy }} + {{ p_form|crispy }} +
+
+ +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/users/templates/users/register.html b/leaderboard/users/templates/users/register.html new file mode 100644 index 0000000..a82c622 --- /dev/null +++ b/leaderboard/users/templates/users/register.html @@ -0,0 +1,25 @@ +{% extends "leaderboard/base.html" %} +{% load crispy_forms_tags %} +{% block title %} +Register +{% endblock title %} + +{% block content %} +
+
+ {% csrf_token %} +
+ Join Today + {{ form|crispy }} +
+
+ +
+
+
+ + Already Have An Account? Sign In + +
+
+{% endblock content %} \ No newline at end of file diff --git a/leaderboard/users/tests.py b/leaderboard/users/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/leaderboard/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/leaderboard/users/views.py b/leaderboard/users/views.py new file mode 100644 index 0000000..c9e6d3f --- /dev/null +++ b/leaderboard/users/views.py @@ -0,0 +1,42 @@ +from django.shortcuts import render, redirect +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm + + +def register(request): + if request.method == 'POST': + form = UserRegisterForm(request.POST) + if form.is_valid(): + form.save() + # username = form.cleaned_data.get('username') + messages.success( + request, f'Your account has been created! You are now able to log in!') + return redirect('login') + else: + form = UserRegisterForm() + return render(request, 'users/register.html', {'form': form}) + + +@login_required +def profile(request): + if request.method == 'POST': + u_form = UserUpdateForm(request.POST, instance=request.user) + p_form = ProfileUpdateForm( + request.POST, request.FILES, instance=request.user.profile) + if u_form.is_valid() and p_form.is_valid(): + u_form.save() + p_form.save() + messages.success( + request, f'Your account has been updated!') + return redirect('profile') + else: + u_form = UserUpdateForm(instance=request.user) + p_form = ProfileUpdateForm(instance=request.user.profile) + + context = { + 'u_form': u_form, + 'p_form': p_form + } + + return render(request, 'users/profile.html', context)