| @@ -0,0 +1,5 @@ | |||
| # -*- coding: utf-8 -*- | |||
| from .getters import get_current, get_count, get_summary, get_unit | |||
| from .routes import home, navitem | |||
| from .._provided import config | |||
| @@ -0,0 +1,47 @@ | |||
| # -*- coding: utf-8 -*- | |||
| from flask import g | |||
| from .._provided import config | |||
| __all__ = ["get_current", "get_count", "get_summary", "get_unit"] | |||
| def get_current(): | |||
| """Return the name of the currently selected campaign, or None.""" | |||
| if not config["enabled"]: | |||
| return None | |||
| setting = g.auth.get_character_modprop("campaigns", "current") | |||
| if not setting or setting not in config["enabled"]: | |||
| return config["enabled"][0] | |||
| return setting | |||
| def get_count(cname, opname): | |||
| """Return the primary operation count for the given campaign/operation.""" | |||
| key = cname + "." + opname | |||
| operation = config["campaigns"][cname]["operations"][opname] | |||
| optype = operation["type"] | |||
| qualifiers = operation["qualifiers"] | |||
| ... | |||
| import random | |||
| return [random.randint(0, 500), random.randint(10000, 500000), random.randint(10000000, 50000000000)][random.randint(0, 2)] | |||
| def get_summary(name, opname, limit=5): | |||
| """Return a sample fraction of results for the given campaign/operation.""" | |||
| ... | |||
| return [] | |||
| def get_unit(operation, num): | |||
| """Return the correct form of the unit tracked by the given operation.""" | |||
| types = { | |||
| "killboard": "ship|ships", | |||
| "collection": "item|items" | |||
| } | |||
| if "unit" in operation: | |||
| unit = operation["unit"] | |||
| else: | |||
| unit = types[operation["type"]] | |||
| if "|" in unit: | |||
| return unit.split("|")[0 if num == 1 else 1] | |||
| return unit | |||
| @@ -3,16 +3,11 @@ | |||
| from flask import abort, g, redirect, request, url_for | |||
| from flask_mako import render_template | |||
| from ._provided import blueprint, config | |||
| from .getters import get_current | |||
| from .._provided import blueprint, config | |||
| def get_current(): | |||
| """Return the name of the currently selected campaign, or None.""" | |||
| if not config["enabled"]: | |||
| return None | |||
| setting = g.auth.get_character_modprop("campaigns", "current") | |||
| if not setting or setting not in config["enabled"]: | |||
| return config["enabled"][0] | |||
| return setting | |||
| __all__ = ["home", "navitem", "current_campaign", "campaign", "operation", | |||
| "set_campaign"] | |||
| def home(): | |||
| """Render and return the main campaign page.""" | |||
| @@ -36,6 +36,7 @@ campaigns: | |||
| titan: | |||
| title: Let's Build a Titan | |||
| type: collection | |||
| unit: unit|units | |||
| qualifiers: |- | |||
| return item_type == "Tritanium" | |||
| bar: | |||
| @@ -376,24 +376,24 @@ h2 .disabled::after { | |||
| justify-content: space-between; | |||
| } | |||
| .operation .stats .primary { | |||
| .operation .overview .num { | |||
| line-height: 60px; | |||
| height: 60px; | |||
| } | |||
| .operation .stats .primary .big { | |||
| .operation .overview .num.big { | |||
| font-size: 300%; | |||
| } | |||
| .operation .stats .primary .medium { | |||
| .operation .overview .num.medium { | |||
| font-size: 200%; | |||
| } | |||
| .operation .stats .primary .small { | |||
| .operation .overview .num.small { | |||
| font-size: 150%; | |||
| } | |||
| .operation .stats .unit { | |||
| .operation .overview .unit { | |||
| font-style: italic; | |||
| } | |||
| @@ -421,11 +421,11 @@ h2 .disabled::after { | |||
| margin: 0.5em 0; | |||
| } | |||
| .operation .stats > div { | |||
| .operation .overview > div { | |||
| display: inline-block; | |||
| } | |||
| .operation .stats .unit { | |||
| .operation .overview .unit { | |||
| margin-left: 0.25em; | |||
| } | |||
| } | |||
| @@ -6,28 +6,33 @@ | |||
| <span class="understate">Campaign:</span> | |||
| <span${"" if enabled else ' class="disabled"'}>${campaign["title"] | h}</span> | |||
| </h2> | |||
| <% mod = g.config.modules.campaigns %> | |||
| <div id="operations"> | |||
| % for section in campaign["layout"]: | |||
| <% klass = "loose" if len(section) < 3 else "tight" %> | |||
| <section class="${klass}"> | |||
| % for opname in section: | |||
| <% operation = campaign["operations"][opname] %> | |||
| <% | |||
| operation = campaign["operations"][opname] | |||
| num = mod.get_count(name, opname) | |||
| summary = mod.get_summary(name, opname, limit=5) | |||
| klass = "big" if num < 1000 else "medium" if num < 1000000 else "small" | |||
| %> | |||
| <div class="operation"> | |||
| <h3><a href="${url_for('campaigns.operation', cname=name, opname=opname)}">${operation["title"] | h}</a></h3> | |||
| <div class="stats"> | |||
| <!-- ... --> | |||
| <% | |||
| random = __import__("random") | |||
| n = [random.randint(0, 500), random.randint(10000, 500000), random.randint(10000000, 50000000000)][random.randint(0, 2)] | |||
| %> | |||
| <% | |||
| klass = "big" if n < 1000 else "medium" if n < 1000000 else "small" | |||
| %> | |||
| <div class="primary"> | |||
| <span class="${klass}">${"{:,}".format(n)}</span> | |||
| </div> | |||
| <div class="unit">${"ships" if klass == "big" else "points" if klass == "medium" else "ISK"}</div> <!-- ... plural --> | |||
| <h3> | |||
| <a href="${url_for('campaigns.operation', cname=name, opname=opname)}">${operation["title"] | h}</a> | |||
| </h3> | |||
| <div class="overview"> | |||
| <div class="num ${klass}">${"{:,}".format(num)}</div> | |||
| <div class="unit">${mod.get_unit(operation, num)}</div> | |||
| </div> | |||
| % if summary: | |||
| <ul class="summary"> | |||
| % for item in summary: | |||
| <li>${item}</li> | |||
| % endfor | |||
| </ul> | |||
| % endif | |||
| </div> | |||
| % endfor | |||
| </section> | |||