10 | That URL doesn't make any sense. 404, dude.
11 |
12 |
13 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/bestdays.html:
--------------------------------------------------------------------------------
1 |
2 |
Best Days in Gaming
3 | These are your best days in gaming. Playing a game more than once counts as only 1.5 plays, so the best days will be those on which you played a variety of games you liked.
4 |
19 | The Whitmore Rating was inspired by Kevin Whitmore.
20 | The Whitmore Rating without expansions was apparently discussed on The Dice Tower but it was suggested to me by Aaron Seeber.
21 |
11 |
12 | The Crazy Recommendations algorithm assesses games based on whether they share various characteristics with games you rate 9 or higher.
13 | There is no popularity factor, so this algorithm avoids the fault of recommending Agricola and Puerto Rico to everyone.
14 | This listing includes games that are recommended but you've already rated, but not expansions or books.
15 | However there are 50 actual games listed for you that you neither own nor have rated - they're coloured black and are bold.
16 | If an entry really annoys you, you can rate the game a "Don't Buy This For Me" on your BGG wishlist, and it will no longer appear in the Crazy Recommendations when the changes are noticed.
17 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/csrf.html:
--------------------------------------------------------------------------------
1 |
2 | Friendless has no idea what this means, but he's working on it.
3 |
The Randy Cox not-Unhappiness Metric (R!UHM) is described here.
9 |
10 |
11 | Your correlation with BGG ratings is {{bggCorrelation}}.
12 | Joe Huber points out that games with a small number of ratings bias this number upwards, as your contribution to the BGG average is relatively larger.
13 | Therefore, your correlation with BGG ratings for ranked (common) games only is {{bggCorrelationRankedOnly}}.
14 |
15 | You H-index is {{hindex}} - you've played {{hindex}} games {{hindex}} times.
16 |
The Friendless Happiness Metric (FHM) is (rating * 5 + plays + months played * 4 + hours played).
6 |
The Huber Happiness Metric is (HHM) ((rating - 4.5) * hours played).
7 |
The Randy Cox not-Unhappiness Metric (RC!UHM) is described here.
8 |
9 |
10 | Your correlation with BGG ratings is {{bggCorrelation}}.
11 | Joe Huber points out that games with a small number of ratings bias this number upwards, as your contribution to the BGG average is relatively larger.
12 | Therefore, your correlation with BGG ratings for ranked (common) games only is {{bggCorrelationRankedOnly}}.
13 |
14 | You H-index is {{hindex}} - you've played {{hindex}} games {{hindex}} times.
15 |
37 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/favourites2_result.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Favourite Games for {{username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
10 |
11 | {% include 'stats/favourites2.html' %}
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/favourites_result.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Favourite Games for {{username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
Your Favourite Games
10 |
11 | Your correlation with BGG ratings is {{bggCorrelation}}.
12 | Joe Huber points out that games with a small number of ratings bias this number upwards, as your contribution to the BGG average is relatively larger.
13 | Therefore, your correlation with BGG ratings for ranked (common) games only is {{bggCorrelationRankedOnly}}.
14 |
15 | You H-index is {{hindex}} - you've played {{hindex}} games {{hindex}} times.
16 |
17 |
18 |
19 | {% include 'stats/genericgamestable.html' %}
20 |
3 | In Extended Stats lingo, a feature is a table or other item that can be displayed by itself.
4 | This is an automatically generated index of the simple features (complex features require parameters for which there are no defaults).
5 |
14 | This diagram is inspired by Florence Nightingale's Polar Area Diagrams.
15 | The area of each colour is proportional to the number of games you have played with that BGG subdomain.
16 | Looking at this diagram, people can see at a glance what sort of, and how many, games you play.
17 |
18 | Click on the buttons above to change the range of data displayed.
19 |
6 | The theory behind this graph is that over time gamers become curmudgeonly, liking new titles less and less. This is a graph of the date you first played a game, against the rating you currently give it. The alternate theory is that when you first joined BGG you found the titles you would like, and it had all been downhill since then.
7 |
13 | Addition to stats.drfriendless.com has been suspended since January 2018.
14 | Since the end of 2018 there is a new site running at https://extstats.drfriendless.com.
15 | New users are being added to that site.
16 | It has less functionality than this site, but I'm working on that.
17 | To see if you've been added, go to https://extstats.drfriendless.com/ and use the Where's My Page widget to get a link.
18 | Follow the blog at https://blog.drfriendless.com for excruciating detail.
19 |
20 |
21 |
22 |
23 |
The War Table
24 |
25 | Let's admit it - we all want to be at the top of the list.
26 | You can sort by different columns to see if you can get yourself there.
27 | When I compare myself to these guys I'm happy just to make the first page.
28 | Jim Carvin suggested the Previously Owned ranking because he thought he could be at the top of it.
29 |
30 | The User column links to your personal page. Tooltips on the numeric columns show your rank for that particular statistic.
31 |
10 | That user doesn't seem to be in Extended Stats. Make sure you have the case exactly right, and use %20 in the URL instead of spaces.
11 |
12 | If you're not in Extended Stats and you'd like to be, please email Friendless (friendless.farrell@gmail.com) and ask to be added.
13 | You just need to tell him your BGG user ID.
14 | The list of current users is stored in the cloud so you can see whether you've been added yet.
15 |
16 |
17 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/geekwidget.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The Gini Coefficient is a measure of inequality.
5 | In this case, it's a matter of how unequally you play your board games.
6 | This feature was suggested by megamau.
7 |
8 | This feature is not finished yet.
9 |
10 | {% for gd in giniData %}
11 |
12 |
6 | Do you play new games, or do you play old games? In particular, how many years elapse between a game's release and you playing it? This is a histogram of the number of calendar years between a game's release and your first play of it. The vertical axis is number of games, the horizontal axis is number of years. The percentages across the top are the accumulated percentage of games you play within that many years of it being released.
7 |
6 | This graph is similar to the previous one, but contains only games you've played on two or more different days and you've rated. In this case, the line for the game is coloured according to the rating you gave it, using the BGG colours for those ratings.
7 |
6 | What's the lifetime of a game? How long does it remain in play rotation for? This graph shows, for each game you've ever played on two different days, what the timespans between the first and last plays of that game were. The timespans are capped at 10 years - that's "forever" for my purposes. The black dot on the line is a guess at the age of the game, i.e. no lifetime can go past that because the game hasn't been released that long.
7 |
8 | Each horizontal block represents one game. The colours are:
9 |
10 |
green - game you own
11 |
pink - a game you don't own
12 |
yellow - an expansion you own
13 |
blue - an expansion you don't own
14 |
15 |
16 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/list.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | List
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
{{title}}
10 |
11 | {% for x in items %}
12 | {{x}}
13 | {% endfor %}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/locations.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Location
Plays
#
Game
Dates
5 |
6 | {% for loc in locations %}
7 | {% for game in loc.games %}
8 |
14 | This diagram is inspired by a BGG blog entry by Mike Hulsebus.
15 | Each wedge of the pie chart represents the proportion of your plays in the period which have been of a particular game.
16 |
17 | Click on the buttons above to change the range of data displayed.
18 |
6 | This graph shows, across the last few years, how fast you learn new games. The black lines (dots) are the number of new games learned in that year, and the blue line (triangles) is the number of new games learned since the beginning of the graph. The scale for the black lines is on the left hand axis, the scale for the blue line is on the right hand axis. Thanks to Randy Cox for the data presentation design.
7 |
8 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/newCollection.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Create New Collection
5 | {% include 'stats/stylesheets.html' %}
6 |
38 |
39 |
40 | {% include 'stats/navbar.html' %}
41 |
Edit Collection
42 |
43 | On this page you can edit the description of the collection and the groups in it.
44 | If you remove groups containing games, those games will be lost from the collection.
45 | Nothing in collections affects anything on BoardGameGeek.
46 |
47 |
11 | {% for c in categories %}
12 | {{c}}
13 | {% endfor %}
14 |
15 | {% for c in mechanics %}
16 | {{c}}
17 | {% endfor %}
18 |
19 |
20 |
Normalised Rankings
21 | The Normalised Ranking column is a different calculation of rankings.
22 | For each user, games are ordered in descending order of rating. The user's top-rated games all score 1.0.
23 | All other games score (c - n) / c where c is the user's number of rated games, and n is the number of games rated strictly higher by that user.
24 | This ranking consequently treats BGG ratings as relative values and places less emphasis on the actual value of those ratings.
25 | Note however that each user rating a game does contribute to its total, so the ranking does reward popularity.
26 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/numplayers.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Favourite Games for Number of Players for {{geek.username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
10 |
Favourite Games for Number of Players
11 |
12 | These tables are based on the BGG polls for best and recommended numbers of players. A game only makes it to a list if it is best or recommended for more votes than it is not recommended. I'm not sure how well that actually works. Scrabble, which is easily best with 2 players, is still recommended for 3 and 4 players. As an experienced player, I don't agree, but who am I to argue with the Wisdom of Crowds? Please discuss this problem on the Extended Stats mailing list.
13 |
14 | When it comes to liking games from a particular year, do you put your money where your mouth is? How many games from each year do you actually own? White boxes represent unrated games that you own.
15 |
4 |
5 | The month column links to a summary of plays for the month. The "percent played" number refers to the percentage of your current collection that you had ever played at that time.
6 |
7 |
8 |
Month
Plays
New Nickels
New Dimes
New Quarters
New Dollars
Plays Ever
Distinct Ever
H-Index YTD
H-Index Ever
Percent Played
Days Played On
9 |
10 | {% for row in pbm %}
11 | {% if row.january %}
12 |
5 | This graph shows your plays in each month over time. The number of plays of new games are shown as red, the number of plays of distinct games are shown as blue, and the total number of plays is shown as green. If your gaming history is too long and your graph is too wide, you can drag it to scroll to the right.
6 |
7 |
4 |
5 | The month column links to all plays for the month. The "percent played" number refers to the percentage of your current collection that you had played in that year by that time.
6 |
7 |
8 |
Month
Plays
Distinct Games
Expansions
New Games
New Nickels
New Dimes
Hours Played
Plays YTD
Distinct YTD
New YTD
H-Index
Percent Played
9 |
10 | {% for row in pbm %}
11 | {% if row.january %}
12 |
14 | This was an idea from Almecho. White spaces indicate games with no plays, red indicates one play, and the darkest green indicates 25+ plays. The games displayed here are the same games displayed in the Plays of Games Owned table (i.e. this graph uses the cookies for that graph).
15 |
6 | This graph shows for each quarter, what year the games you played in that quarter were released in. This shows you how you play new games and abandon old ones.
7 |
3 |
4 | kataclysm and Dazeysan have done some work on hacking the BGG play-logging utility to be customisable to include your frequently used locations and opponents. I've added some support for extracting the data that utility will use from your logged plays.
5 |
6 | The step by step instructions are in this geeklist.
7 |
8 |
Cut and Paste
9 | Copy and paste this text into the play logging widget:
10 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/playlogging_result.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Data for Play Logging for {{geek.username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
10 |
13 | This scatter plot relates the number of times you've played a game compared to the rating you gave it.
14 | Ideally we'd all always play 10s, but since that's not going to happen we can at least hope that the more
15 | we like a game the more we play it. The size of a circle corresponds to the number of games with that
16 | rating and that many plays. The number of plays is capped at 25 so the graph doesn't need to be
17 | infinitely tall. The green line across the graph is your average number of plays for games with that
18 | rating. The numbers used for that average are also capped at 25.
19 |
20 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/playrate_result.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Play Rate Graph for {{username}} for {{selector}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
10 |
4 | This table was suggested by vader78.
5 | This table has one cell for each game in the BGG rankings.
6 | If you have played that game, the cell is coloured according to the number of plays you have recorded - white for zero, red for 1, progressing through yellow and green to dark green for 25+.
7 | Most cells have tooltips telling you what the game at that rank is.
8 | There can be anomalies as the download process can observe different games at the same rank at different times - the BGG rankings may differ from the data used to calculate this table.
9 |
10 | There's a tooltip on the row header summarising your feelings on the games.
11 | Due to the observation errors mentioned above, some rows won't have exactly 100 games.
12 |
13 |
14 |
15 | {% for row in playsByRanking %}
16 |
{{row.base}}
17 | {% for datum in row.data %}
18 | {% if datum %}
19 |
13 | {% for c in categories %}
14 | {{c}}
15 | {% endfor %}
16 |
17 | {% for c in mechanics %}
18 | {{c}}
19 | {% endfor %}
20 |
21 |
22 |
Rankings for {{title}}
23 | These rankings are calculated quite simply - I just total up the ratings given to all games by the Extended Stats users. This results in a nice combination of hot games and classic games. This is maybe more in line with what new board gamers will expect to see as a list of top-ranked games than the BGG system which tends to favour heavy Euros.
24 |
25 | The Normalised Ranking column is a different calculation of rankings. For each user, games are ordered in descending order of rating. The user's top-rated games all score 1.0. All other games score (c - n) / c where c is the user's number of rated games, and n is the number of games rated strictly higher by that user. This ranking consequently treats BGG ratings as relative values and places less emphasis on the actual value of those ratings. Note however that each user rating a game does contribute to its total, so the ranking does reward popularity.
26 |
5 |
6 | This section is for people who gather ratings for each play from the players. For all plays of each game, I count how many ratings have been given, and what the total of those ratings is (a useful combination of popularity and high rating). The average is exactly the mean of those two.
7 |
8 |
4 | This table has one cell for each game in the BGG rankings.
5 | If you have rated that game, the cell is coloured with the BGG colour for that rating. This lets you see highly ranked games you don't like, and lowly rated games you do like.
6 | Most cells have tooltips telling you what the game at that rank is.
7 | There can be anomalies as the download process can observe different games at the same rank at different times - the BGG rankings may differ from the data used to calculate this table.
8 |
9 | There's a tooltip on the row header summarising your feelings on the games.
10 | Due to the observation errors mentioned above, some rows won't have exactly 100 games.
11 |
12 |
13 |
14 | {% for row in ratingByRanking %}
15 |
{{row.base}}
16 | {% for datum in row.data %}
17 | {% if datum %}
18 |
14 | Do you like the old games better than the new games?
15 | This image goes back to 1995 or the year that you've said your games start from in the cookies.
16 | The numbers at the top of the image are the number of games from that year that you've rated.
17 |
18 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/refresh.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Refresh Done
4 |
5 |
6 | Done! The chosen files will be refreshed soon, which means when the downloading program gets to it.
7 | That's often as soon as 10 minutes, but can be much longer if it has a lot of work to do.
8 |
9 | {{errors}}
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/result_tabbed.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Extended Stats for {{username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/geekwidget.html' %}
9 | {% include 'stats/navbar.html' %}
10 |
{% if game.rating %}{{game.rating}}{% else %} {% endif %}
36 |
{% if game.plays %}{{game.plays}}{% else %} {% endif %}
37 |
{% if game.owned %}YES{% else %} {% endif %}
38 |
{% if game.want %}YES{% else %} {% endif %}
39 |
{% if game.trade %}YES{% else %} {% endif %}
40 |
{% if game.wish %}YES{% else %} {% endif %}
41 |
{{game.yearpublished}}
42 |
{% if game.comment %}{{game.comment}}{% else %} {% endif %}
43 |
44 | {% endfor %}
45 |
46 |
47 | {% endfor %}
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/series.html;:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'pretitle.html' %}
4 | Series Summaries for {{geek.username}}
5 | {% include 'stylesheets.html' %}
6 |
7 |
8 | {% include 'navbar.html' %}
9 |
10 |
Crazy Recommendations for {{geek.username}}
11 |
12 | The Crazy Recommendations algorithm assesses games based on whether they share various characteristics with games you rate 9 or higher. There is no popularity factor, so this algorithm avoids the fault of recommending Agricola and Puerto Rico to everyone. This listing includes games that are recommended but you've already rated, expansions, and even books. However there are 20 actual games listed for you that you neither own nor have rated - they're coloured black and are bold. If an entry really annoys you, you can rate the game a "Don't Buy This For Me" on your BGG wishlist, and it will no longer appear in the Crazy Recommendations when the changes are noticed.
13 |
19 | This table implements an analysis suggested by polychrotid.
20 | For each day of the week, how many games have you played on that day?
21 | I extended the idea to see how that changed over the years.
22 |
19 | This table implements an analysis designed by Randy Cox.
20 | For each month since you really got into games, how many games did you play? The values are coloured according to the number of games played.
21 |
22 |
23 |
1+ standard deviations below the mean
24 |
0.5 - 1 standard deviations below the mean
25 |
within 0.5 standard deviations of the mean
26 |
0.5 - 1 standard deviations above the mean
27 |
1+ standard deviations above the mean
28 |
29 |
30 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/testajax.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | List
5 | {% include 'stats/stylesheets.html' %}
6 |
18 |
19 |
20 | {% include 'stats/navbar.html' %}
21 |
{{title}}
22 |
23 | This is a test.
24 |
25 |
31 |
32 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/totalplays.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Total Plays for {{username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/navbar.html' %}
9 |
10 |
Plays for {{username}}
11 |
12 | {% for link in links %}
13 | {{link.name}}
14 | {% endfor %}
15 |
11 | This table summarises when files containing your data have been downloaded, and when it's planned to download them next. Dates are in Brisbane time (GMT +10). The refresh link causes the server to reload your data (within about a minute). This is a slow process and usually not necessary, so please don't use it unless you know what you're doing.
12 |
13 | Any file which says "None" in the Next Update column is a file that is updated by request only. The extended stats downloader will never download that file unless the Last Update column also says None. Clicking on the refresh button will set the Last Update column to None - so that's what you've got to do. (I had to make it a button because the GoogleBot was clicking on the link for everyone!)
14 |
15 | At the moment, the only files which are not scheduled for updates are plays for months which ended more than 120 days ago. So, if you enter your plays within 4 months you won't notice any difference.
16 |
17 |
2 | The aim of this tab is to convince Jeroen Doumen to reprint Roads and Boats.
3 | So far this is just a proof of concept but I'm sure as the page gets better he'll understand his obligations. :p
4 | Go to the Cookies page to choose what you see here.
5 |
3 | {% include 'stats/pretitle.html' %}
4 | What If... for {{geek.username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 |
9 | {% include 'stats/navbar.html' %}
10 |
11 |
12 |
What If...
13 |
14 | This page allows you to do experiments with your continuous Friendless metric and utilisation numbers. For example, what if I got rid of this game? What if I played all of these?
15 |
16 | The columns are:
17 |
18 |
Game - clicking on the name of the game resets the row to its initial state
19 |
Plays - how many plays you have recorded for this game
20 |
Own - whether you own this game
21 |
Hypothetical Plays - how many plays you might have. Clicking on the cell increases this number by one. The Hypothetical CFM and utilisation are then recalculated.
22 |
Hypothetical Own - whether you own this game. Clicking on the cell toggles this value. The Hypothetical CFM and utilisation are then recalculated.
23 |
Modified - whether the row has been modified. Click on the game name to reset it.
24 |
25 |
26 |
Real CFM
27 |
Real Utilisation
28 |
Hypothetical CFM
29 |
Hypothetical Utilisation
30 |
31 |
32 |
33 |
Game
Plays
Own
Hypothetical Plays
Hypothetical Own
Modified
34 |
35 | {% for game in games %}
36 |
37 |
{{game.name}}
38 |
{{game.plays}}
39 |
{{game.own}}
40 |
{{game.plays}}
41 |
{{game.own}}
42 |
43 |
44 | {% endfor %}
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/year.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Yearly Statistics for {{username}} for {{year}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/geekwidget.html' %}
9 | {% include 'stats/navbar.html' %}
10 |
39 |
40 | {% if bestDays %}
41 | {% include 'stats/bestdays.html' %}
42 | {% endif %}
43 |
44 | {% if designerDimes %}
45 | {% include 'stats/dimesbydesigner.html' %}
46 | {% endif %}
47 |
48 | {% if ndd %}
49 | {% include 'stats/nickeldime.html' %}
50 | {% endif %}
51 |
52 | {% if playedLastYear %}
53 | {% include 'stats/playedlastyear.html' %}
54 | {% endif %}
55 |
56 | {% if florence %}
57 | {% include 'stats/florence.html' %}
58 | {% endif %}
59 |
60 | {% if morePieDefault %}
61 | {% include 'stats/morepie.html' %}
62 | {% endif %}
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/yearcomparison.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% include 'stats/pretitle.html' %}
4 | Extended Stats for {{username}}
5 | {% include 'stats/stylesheets.html' %}
6 |
7 |
8 | {% include 'stats/geekwidget.html' %}
9 | {% include 'stats/navbar.html' %}
10 |
Florence Nightingale Gamer Characterisation
11 |
12 |
13 |
14 | This diagram is inspired by Florence Nightingale's Polar Area Diagrams.
15 | The area of each colour is proportional to the number of games you have played with that BGG subdomain.
16 | Looking at this diagram, people can see at a glance what sort of, and how many, games you play.
17 |
18 |
19 | {% for year in playsYears %}
20 |
{{year}}
21 |
22 |
23 |
24 |
25 | {% for flo in florence %}
26 |
{{flo.name}}
27 | {% endfor %}
28 |
29 |
30 |
31 | {% endfor %}
32 |
33 |
34 |
--------------------------------------------------------------------------------
/extended/stats/templates/stats/yearlysummaries.html:
--------------------------------------------------------------------------------
1 | Yearly Summaries:
2 | {% for row in playsYearsRows %}
3 | {% for year in row %}
4 | {{year}}
5 | {% endfor %}
6 | {% endfor %}
--------------------------------------------------------------------------------
/extended/stats/tests.py:
--------------------------------------------------------------------------------
1 | """
2 | This file demonstrates writing tests using the unittest module. These will pass
3 | when you run "manage.py test".
4 |
5 | Replace this with more appropriate tests for your application.
6 | """
7 |
8 | from django.test import TestCase
9 |
10 |
11 | class SimpleTest(TestCase):
12 | def test_basic_addition(self):
13 | """
14 | Tests that 1 + 1 always equals 2.
15 | """
16 | self.assertEqual(1 + 1, 2)
17 |
--------------------------------------------------------------------------------
/extended/stats/webserver_factory.py:
--------------------------------------------------------------------------------
1 | webserver = None
2 |
3 | def get():
4 | global webserver
5 | if webserver is None:
6 | import django_webserver
7 | webserver = django_webserver
8 | return webserver
9 |
10 |
--------------------------------------------------------------------------------
/extended/test/testCreateDatabase.py:
--------------------------------------------------------------------------------
1 | # First test of using sqlite3 in memory to run unit tests
2 | import sys
3 | sys.path.append("..")
4 |
5 | import stats.mydb as mydb
6 | mydb.TESTING = True
7 | db = mydb.get()
8 | with open("simple.sql", "r") as scriptfile:
9 | lines = map(lambda s: s.strip(), scriptfile.readlines())
10 | text = "".join(lines)
11 | db.executescript(text)
12 | cursor = db.execute("select * from files")
13 | for row in cursor:
14 | print row
15 | print "Done"
--------------------------------------------------------------------------------
/extended/test/testLibrary.py:
--------------------------------------------------------------------------------
1 | import sys
2 | sys.path.append("..")
3 |
4 | import stats.library as library
5 |
6 | def testCalcHIndex():
7 | assert library.calcHIndex([]) == 0
8 | assert library.calcHIndex([0]) == 0
9 | assert library.calcHIndex([1]) == 1
10 | assert library.calcHIndex([1,2]) == 1
11 | assert library.calcHIndex([1,2,2]) == 2
12 | assert library.calcHIndex([2,3,1]) == 2
13 | assert library.calcHIndex([1,2,3,4,5]) == 3
14 | assert library.calcHIndex([23L, 0L, 0L, 2L, 20L, 1L, 13L, 1L, 3L, 3L, 4L, 1L, 9L, 2L, 8L, 7L, 0L, 24L, 4L, 2L, 5L, 1L, 4L, 0L, 3L, 0L, 1L, 0L, 1L, 4L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 13L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 9L, 7L, 2L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 11L, 0L, 0L, 6L, 1L, 0L, 10L, 1L, 1L, 0L, 0L, 1L, 9L, 42L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 2L, 2L, 1L, 0L, 1L, 0L, 9L, 11L, 1L, 0L, 1L, 1L, 2L, 2L, 1L, 1L, 0L]) == 9
15 | # assert library.calcHIndex(sa266) == 64
16 |
17 | if __name__ == "__main__":
18 | testCalcHIndex()
19 |
--------------------------------------------------------------------------------
/images/arrow_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/arrow_down.png
--------------------------------------------------------------------------------
/images/arrow_up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/arrow_up.png
--------------------------------------------------------------------------------
/images/bgg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/bgg.png
--------------------------------------------------------------------------------
/images/bullet_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/bullet_down.png
--------------------------------------------------------------------------------
/images/bullet_go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/bullet_go.png
--------------------------------------------------------------------------------
/images/external.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/external.png
--------------------------------------------------------------------------------
/images/eye.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/eye.png
--------------------------------------------------------------------------------
/images/pencil.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/pencil.png
--------------------------------------------------------------------------------
/images/sort_down.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/sort_down.gif
--------------------------------------------------------------------------------
/images/sort_up.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/sort_up.gif
--------------------------------------------------------------------------------
/images/sp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/sp.gif
--------------------------------------------------------------------------------
/images/stats.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/stats.gif
--------------------------------------------------------------------------------
/images/table_excel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/table_excel.png
--------------------------------------------------------------------------------
/images/table_gear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/table_gear.png
--------------------------------------------------------------------------------
/images/wtfcat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DrFriendless/ExtendedStats/edb664d29777377dbfbee5ad0b15614f6e887df1/images/wtfcat.jpg
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | simplejson
2 |
--------------------------------------------------------------------------------
/scripts/common.js~:
--------------------------------------------------------------------------------
1 | /*==========================================
2 | String functions
3 | ==========================================*/
4 | String.prototype.trim = function() {
5 | return this.replace( /^\s+|\s+$/, "" );
6 | }
7 |
8 | /*==========================================
9 | Class Manipulation
10 | ==========================================*/
11 |
12 | function hasClassName( elem, className ) {
13 | if ( !elem.className ) return false;
14 | var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
15 | return pattern.test(elem.className);
16 | }
17 |
18 | function removeClassName( elem, className ) {
19 | var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
20 | elem.className = elem.className.replace( pattern, "" ).trim();
21 | }
22 |
23 | function addClassName( elem, className ) {
24 | removeClassName( elem, className );
25 | elem.className = ( elem.className + " " + className ).trim();
26 | }
27 |
28 | // http://www.dustindiaz.com/getelementsbyclass
29 | function getElementsByClass(searchClass,node,tag) {
30 | var classElements = new Array();
31 | var els = node.getElementsByTagName(tag);
32 | var elsLen = els.length;
33 | var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
34 | for (i = 0, j = 0; i < elsLen; i++) {
35 | if ( pattern.test(els[i].className) ) {
36 | classElements[j] = els[i];
37 | j++;
38 | }
39 | }
40 | return classElements;
41 | }
42 |
43 | /*==========================================
44 | Add event
45 | ==========================================*/
46 |
47 | function addEvent(elm, evType, fn, useCapture) {
48 | if (elm.addEventListener) {
49 | elm.addEventListener(evType, fn, useCapture);
50 | return true;
51 | }
52 | else if (elm.attachEvent) {
53 | var r = elm.attachEvent('on' + evType, fn);
54 | return r;
55 | }
56 | else {
57 | elm['on' + evType] = fn;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/scripts/dynamic.js:
--------------------------------------------------------------------------------
1 | function changeImageURL(imgId, newUrl) {
2 | //The image object accessed through its id we mentioned in the DIV block which is going to be visible currently
3 | var img = document.getElementById(imgId);
4 | img.src = newUrl;
5 | return;
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/scripts/dynamic.js~:
--------------------------------------------------------------------------------
1 | function changeImageURL(imgId, newUrl) {
2 | //The image object accessed through its id we mentioned in the DIV block which is going to be visible currently
3 | var img = document.getElementById(imgId);
4 | alert(imgId);
5 | img.src = newUrl;
6 | return;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/scripts/greenbar.js:
--------------------------------------------------------------------------------
1 | /*==========================================
2 | Green Bar
3 | ==========================================*/
4 |
5 | addEvent(window, "load", init_tables);
6 |
7 | function init_tables() {
8 | greenbar_init();
9 | bluebar_init();
10 | }
11 |
12 | function greenbar_init() {
13 | // Find all tables with class greenbar and make them greenbar
14 | if (!document.getElementsByTagName) return;
15 | tbls = document.getElementsByTagName("table");
16 | for (ti=0;ti')
14 | if (thetitle.length>1){
15 | thetitles=''
16 | for (i=0;i'+text+'')
26 | document.tooltip.document.close()
27 | document.tooltip.left=e.pageX+5
28 | document.tooltip.top=e.pageY+5
29 | document.tooltip.visibility="show"
30 | }
31 | }
32 | function hidetip(){
33 | if (document.layers)
34 | document.tooltip.visibility="hidden"
35 | }
36 |
--------------------------------------------------------------------------------
/scripts/jqtouch.transitions.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | _/ _/_/ _/_/_/_/_/ _/
4 | _/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
5 | _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
6 | _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
7 | _/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
8 | _/
9 | _/
10 |
11 | Created by David Kaneda
12 | Documentation and issue tracking on Google Code
13 |
14 | Special thanks to Jonathan Stark
15 | and pinch/zoom
16 |
17 | (c) 2009 by jQTouch project members.
18 | See LICENSE.txt for license.
19 |
20 | */
21 |
22 | (function($) {
23 |
24 | $.fn.transition = function(css, options) {
25 | return this.each(function(){
26 | var $el = $(this);
27 | var defaults = {
28 | speed : '300ms',
29 | callback: null,
30 | ease: 'ease-in-out'
31 | };
32 | var settings = $.extend({}, defaults, options);
33 | if(settings.speed === 0) {
34 | $el.css(css);
35 | window.setTimeout(settings.callback, 0);
36 | } else {
37 | if ($.browser.safari)
38 | {
39 | var s = [];
40 | for(var i in css) {
41 | s.push(i);
42 | }
43 | $el.css({
44 | webkitTransitionProperty: s.join(", "),
45 | webkitTransitionDuration: settings.speed,
46 | webkitTransitionTimingFunction: settings.ease
47 | });
48 | if (settings.callback) {
49 | $el.one('webkitTransitionEnd', settings.callback);
50 | }
51 | setTimeout(function(el){ el.css(css) }, 0, $el);
52 | }
53 | else
54 | {
55 | $el.animate(css, settings.speed, settings.callback);
56 | }
57 | }
58 | });
59 | }
60 | })(jQuery);
--------------------------------------------------------------------------------
/scripts/jquery.mousewheel.js:
--------------------------------------------------------------------------------
1 | /* Copyright (c) 2006 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
2 | * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
3 | * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
4 | * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
5 | * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
6 | *
7 | * $LastChangedDate: 2007-12-14 23:57:10 -0600 (Fri, 14 Dec 2007) $
8 | * $Rev: 4163 $
9 | *
10 | * Version: @VERSION
11 | *
12 | * Requires: $ 1.2.2+
13 | */
14 |
15 | (function($) {
16 |
17 | $.event.special.mousewheel = {
18 | setup: function() {
19 | var handler = $.event.special.mousewheel.handler;
20 |
21 | // Fix pageX, pageY, clientX and clientY for mozilla
22 | if ( $.browser.mozilla )
23 | $(this).bind('mousemove.mousewheel', function(event) {
24 | $.data(this, 'mwcursorposdata', {
25 | pageX: event.pageX,
26 | pageY: event.pageY,
27 | clientX: event.clientX,
28 | clientY: event.clientY
29 | });
30 | });
31 |
32 | if ( this.addEventListener )
33 | this.addEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
34 | else
35 | this.onmousewheel = handler;
36 | },
37 |
38 | teardown: function() {
39 | var handler = $.event.special.mousewheel.handler;
40 |
41 | $(this).unbind('mousemove.mousewheel');
42 |
43 | if ( this.removeEventListener )
44 | this.removeEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
45 | else
46 | this.onmousewheel = function(){};
47 |
48 | $.removeData(this, 'mwcursorposdata');
49 | },
50 |
51 | handler: function(event) {
52 | var args = Array.prototype.slice.call( arguments, 1 );
53 |
54 | event = $.event.fix(event || window.event);
55 | // Get correct pageX, pageY, clientX and clientY for mozilla
56 | $.extend( event, $.data(this, 'mwcursorposdata') || {} );
57 | var delta = 0, returnValue = true;
58 |
59 | if ( event.wheelDelta ) delta = event.wheelDelta/120;
60 | if ( event.detail ) delta = -event.detail/3;
61 | if ( $.browser.opera ) delta = -event.wheelDelta;
62 |
63 | event.data = event.data || {};
64 | event.type = "mousewheel";
65 |
66 | // Add delta to the front of the arguments
67 | args.unshift(delta);
68 | // Add event to the front of the arguments
69 | args.unshift(event);
70 |
71 | return $.event.handle.apply(this, args);
72 | }
73 | };
74 |
75 | $.fn.extend({
76 | mousewheel: function(fn) {
77 | return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
78 | },
79 |
80 | unmousewheel: function(fn) {
81 | return this.unbind("mousewheel", fn);
82 | }
83 | });
84 |
85 | })(jQuery);
--------------------------------------------------------------------------------
/scripts/ruler.js:
--------------------------------------------------------------------------------
1 | /*==========================================
2 | Ruler
3 | ==========================================*/
4 | addEvent(window, "load", ruler_init);
5 |
6 | function ruler_init() {
7 | // Find all tables with class greenbar and make them ruler
8 | if (!document.getElementsByTagName) return;
9 | tbls = document.getElementsByTagName("table");
10 | for (ti=0;ti
2 |
3 | Because this page kept breaking I rewrote the way I make it. It's more up-to-date now, and can be found
4 | here. Please update your bookmarks.
5 |