def gen_flows_from_choice(choice, flow_event_model, choice_stocks):
    """
    Generate a series of flows from a choices tuple array.
    """
    rv = []
    i = 0
    try:
        while(True):
            up = choice[i+1]
            down = choice[i]
            up_stock_slug = up[0]
            down_stock_slug = down[0]
            up_slug = "rising_%s" % up_stock_slug
            up_name = "Rising to %s" % up[1].lower()
            down_slug = "dropping_%s" % down_stock_slug
            down_name = "Dropping to %s" % down[1].lower()
            rv.append(Flow(slug=up_slug, name=up_name, flow_event_model=flow_event_model,
                           sources=[choice_stocks[down_stock_slug]],
                           sinks=[choice_stocks[up_stock_slug]]))
            rv.append(Flow(slug=down_slug, name=down_name, flow_event_model=flow_event_model,
                           sources=[choice_stocks[up_stock_slug]],
                           sinks=[choice_stocks[down_stock_slug]]))
            i += 1
    except IndexError:
        pass
    return rv
def profile_states_to_stocks(prev_field_vals, cur_field_vals):
    """
    Compare the field values to determine the state.
    """
    prev_consist_slug, = prev_field_vals if prev_field_vals else (None, )
    cur_consist_slug, = cur_field_vals if cur_field_vals else (None, )

    prev_consist_stock = consist_slug_to_stock.get(prev_consist_slug, None)
    cur_consist_stock = consist_slug_to_stock.get(cur_consist_slug, None)

    return ((prev_consist_stock,), (cur_consist_stock,))

## The flows
flows = []
flows.append(Flow(slug="starting_user", name="Starting user",
                  flow_event_model=ProfileFlowEvent,
                  sources=[None], sinks=consist_slug_to_stock.values()))

#An example of how to generate flows for a choice set
def gen_flows_from_choice(choice, flow_event_model, choice_stocks):
    """
    Generate a series of flows from a choices tuple array.
    """
    rv = []
    i = 0
    try:
        while(True):
            up = choice[i+1]
            down = choice[i]
            up_stock_slug = up[0]
            down_stock_slug = down[0]
from stockandflow.tracker import ModelTracker
from profiles.models import Profile
from processes.models import UserFlowEvent

# The stocks - user-specific stocks are in profile
stocks = []

# The flows
flows = []

# Track a record of logins, and as part of that flow update the profile consistency
# The states do not need to be recorded, so instead of stocks there are just
# integers for the source and sink.
login_flow = Flow(slug="logging_in",
                  name="Logging in",
                  flow_event_model=UserFlowEvent,
                  sources=[0],
                  sinks=[1],
                  event_callables=(Profile.logged_in, ))
flows.append(login_flow)


# The tracker
def user_states_to_stocks(prev_field_vals, cur_field_vals):
    """
    Check if the last login day has changed.
    """
    no_change = ((0, ), (0, ))
    yes_change = ((0, ), (1, ))
    if prev_field_vals is None:
        if cur_field_vals is None:
            return no_change