diff --git a/crtools/_version.py b/crtools/_version.py
index 5eb8c57..d60e0c1 100644
--- a/crtools/_version.py
+++ b/crtools/_version.py
@@ -1 +1 @@
-__version__ = "1.3.1"
\ No newline at end of file
+__version__ = "1.4.0"
\ No newline at end of file
diff --git a/crtools/crtools.py b/crtools/crtools.py
index 5984030..e4ee214 100644
--- a/crtools/crtools.py
+++ b/crtools/crtools.py
@@ -5,7 +5,7 @@
__docformat__ = 'reStructuredText'
import codecs
-from datetime import datetime
+from datetime import datetime, date
from jinja2 import Environment, PackageLoader, select_autoescape
import json
import os
@@ -85,8 +85,8 @@ def member_warlog(member_tag, warlog):
member_warlog.append(participation)
return member_warlog
-def member_danger(member, member_warlog):
- good = ok = bad = 0
+def member_rating(member, member_warlog, days_from_donation_reset):
+ good = ok = bad = na = 0
for war in member_warlog:
if war != None:
if war['status'] == 'good':
@@ -95,13 +95,20 @@ def member_danger(member, member_warlog):
ok += 1
elif war['status'] == 'bad':
bad += 1
+ else:
+ na += 1
+
+ # then calculate score based on based on 20/day. We exempt them the first day
+ donation_score = 0;
+ if days_from_donation_reset > 1:
+ target_donations = 12 * (days_from_donation_reset - 1)
+ donation_score = member['donations'] - target_donations
- if bad > good:
- return True
- if good == 0 and member['donations'] == 0:
- return True
+ # bigger penalty for 0 donations
+ if member['donations'] == 0:
+ donation_score -= (days_from_donation_reset - 1) * 10;
- return False
+ return (good * 20) + (ok) + (bad * -30) + (na * -1) + donation_score
def render_dashboard(env, members, clan_name, clan_id, clan_description, clan_min_trophies, clan_stats, war_dates):
"""Render clan dashboard."""
@@ -113,14 +120,25 @@ def render_dashboard(env, members, clan_name, clan_id, clan_description, clan_mi
war_dates = war_dates
)
+ members_by_score = newlist = sorted(members, key=lambda k: k['rating'])
+
+ suggestions = [];
+ for index, member in enumerate(members_by_score):
+ if member['rating'] < 0:
+ if index < len(members) - 46:
+ suggestions.append('Kick {} (score: {})'.format(member['name'], member['rating']))
+ elif member['role'] != 'member':
+ suggestions.append('Demote {} (score: {})'.format(member['name'], member['rating']))
+
return env.get_template('page.html.j2').render(
version = __version__,
page_title = clan_name + "Clan Dashboard",
update_date = datetime.now().strftime('%c'),
- content = member_table,
+ member_table = member_table,
clan_name = clan_name,
clan_id = clan_id,
clan_description = clan_description,
+ suggestions = suggestions,
clan_stats = clan_stats
)
@@ -176,12 +194,33 @@ def build_dashboard(api_key, clan_id, logo_path, favicon_path, description_path,
warlog = get_warlog(api_key, clan_id)
write_object_to_file(os.path.join(log_path, 'warlog.json'), json.dumps(warlog, indent=4))
+ # calculate the number of days since the donation last sunday, for donation tracking purposes:
+ today = date.today().toordinal()
+ sunday = today - (today % 7)
+ days_from_donation_reset = today - sunday
+
# grab importent fields from member list for dashboard
member_dash = []
for member in clan['memberList']:
member_row = member
+
+ member['donation_status'] = 'normal'
+ if member['donations'] > (days_from_donation_reset) * 40:
+ member['donation_status'] = 'good'
+ if days_from_donation_reset > 1:
+ if member['donations'] == 0:
+ member['donation_status'] = 'bad'
+ elif member['donations'] < (days_from_donation_reset-1) * 10:
+ member['donation_status'] = 'ok'
+
member_row['warlog'] = member_warlog(member['tag'], warlog)
- member_row['danger'] = member_danger(member, member_row['warlog'])
+
+ member_row['rating'] = member_rating(member, member_row['warlog'], days_from_donation_reset)
+ if member_row['rating'] > 0:
+ member_row['danger'] = False
+ else:
+ member_row['danger'] = True
+
if member['role'] == 'leader' or member['role'] == 'coLeader':
member_row['leadership'] = True
else:
diff --git a/crtools/static/crtools.css b/crtools/static/crtools.css
index 20569cc..476bddb 100644
--- a/crtools/static/crtools.css
+++ b/crtools/static/crtools.css
@@ -18,10 +18,9 @@ html, body {
main {
background-color: #f2f2f2;
- overflow-x: scroll;
}
-main > article, header > .inner, footer > .inner {
+main > section, header > .inner, footer > .inner {
padding: 15px;
}
@@ -234,9 +233,16 @@ body > header h1 em {
}
}
+#members article {
+ background-color: #fff;
+ box-shadow: 0 1px 2px 0 rgba(0,0,0,.2);
+ padding: 15px;
+ margin: 8px 0 22px 0;
+}
+
/* Member table
–––––––––––––––––––––––––––––––––––––––––––––––––– */
-#members h2 {
+#members h2, #members h3, #members h4 {
margin: 0;
}
diff --git a/crtools/templates/member-table.html.j2 b/crtools/templates/member-table.html.j2
index 5ac661e..f3bf46d 100644
--- a/crtools/templates/member-table.html.j2
+++ b/crtools/templates/member-table.html.j2
@@ -13,7 +13,7 @@
{% for member in members %}
-
+
{% if member.clanRank < member.previousClanRank %}
@@ -33,6 +33,7 @@
Name{{member.name}}
Tag{{member.tag}}
Clan Role{{member.role}}
+ Clan Score{{member.rating}}
XP Level{{member.expLevel}}
Trophies{{member.trophies}}
@@ -57,13 +58,7 @@
{% endif %}
{{member.trophies}}
|
- {% if member.donations == 0 %}
-
- {% elif member.donations > 300 %}
- |
- {% else %}
- |
- {% endif %}
+ |
{{member.donations}}
|
{% for war in member.warlog %}
diff --git a/crtools/templates/page.html.j2 b/crtools/templates/page.html.j2
index a52c50a..6165e20 100644
--- a/crtools/templates/page.html.j2
+++ b/crtools/templates/page.html.j2
@@ -18,7 +18,7 @@
{{clan_name}} Clan Dashboard
-
+
{{clan_description}}
@@ -27,8 +27,8 @@
{{clan_stats}}
-
-
+
+
+
+ {{member_table}}
+
+
+ Suggested actions for leadership:
+
+
+ {% for suggestion in suggestions %}
+ - {{suggestion}}
+ {% endfor %}
+
+
+ Score for each individual is derived from war participation and
+ donations. Anyone with a score below 0 will be recommended for
+ kicking and demotion, depending on the number of people in the clan.
+
+
+ If you want to stay off this list, donate at least 10 cards per
+ day, and participate fully in 1 out of every 10 wars.
+
+
+