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 list and stats

@@ -45,8 +45,28 @@
- {{content}} -
+
+ {{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. +

+
+