def put(self, soknad_id=None, action_id=None):
        data = request.get_json()
        # hent søknad
        soknad = SoknadRepo.find_by_id(soknad_id)

        # sjekk om angitt action er lovlig transition
        user = get_user_from_auth()

        sm = SoknadStateMachine()
        transitions = sm.get_transitions(soknad.status, user)
        if action_id not in transitions:
            abort(
                403, __error__=[u"Aksjon %s ikke tilgjengelig for søknader med status %s" % (action_id, soknad.status)]
            )
        action = transitions[action_id]

        SoknadActionExecutor.execute(soknad, action, data)

        return None, 200
def filter_actions(soknad, user):
    mapping_roles_and_transitions = {
        'tilskudd_soker': [
            SoknadStateMachine.t_slett,
            SoknadStateMachine.t_sende_inn,
            SoknadStateMachine.t_trekk,
            SoknadStateMachine.t_rediger_soknad,
            SoknadStateMachine.t_lever_rapport,
            SoknadStateMachine.t_opprett_rapport,
            SoknadStateMachine.t_rediger_rapport,
            SoknadStateMachine.t_godta_vedtak,
            SoknadStateMachine.t_send_tilbake_til_saksbehandling,
            SoknadStateMachine.t_endre_kontakt
        ],
        'tilskudd_saksbehandler': [
            SoknadStateMachine.t_trekk,
            SoknadStateMachine.t_apne_soknad_for_redigering,
            SoknadStateMachine.t_behandle,
            SoknadStateMachine.t_endre_saksbehandler,
            SoknadStateMachine.t_til_vedtak,
            SoknadStateMachine.t_godkjenn_rapport,
            SoknadStateMachine.t_rediger_rapportfrist,
            SoknadStateMachine.t_avslutt,
            SoknadStateMachine.t_til_utbetaling,
            SoknadStateMachine.t_underkjenn_rapport,
            SoknadStateMachine.t_avskriv_rapportkrav,
            SoknadStateMachine.t_krev_tilbakebetaling,
            SoknadStateMachine.t_vurder_klage,
            SoknadStateMachine.t_registrer_utbetaling,
            SoknadStateMachine.t_last_opp_saksvedlegg,
            SoknadStateMachine.t_endre_tilskuddsordning
        ],
        'tilskudd_godkjenner': [
            SoknadStateMachine.t_fatt_vedtak,
            SoknadStateMachine.t_tilbake_til_innstilling,
            SoknadStateMachine.t_fatt_klagevedtak,
            SoknadStateMachine.t_tilbake_til_vurder_klage
        ],
        'tilskudd_administrator': []
    }

    if soknad.status == SoknadStateMachine.s_vedtak_fattet.id and if_soker_can_manage_soknad(soknad, user):
        if len(soknad.vedtak) != 0:
            nyeste_vedtak = soknad.nyeste_vedtak()
            if nyeste_vedtak.vedtatt_belop > 0:
                mapping_roles_and_transitions.get('tilskudd_soker').append(SoknadStateMachine.t_takke_nei)
            if not nyeste_vedtak.behandlet_av_formannskapet:
                if len(soknad.klage) > 0:
                    mapping_roles_and_transitions.get('tilskudd_soker').append(SoknadStateMachine.t_oppretthold_klage)
                else:
                    mapping_roles_and_transitions.get('tilskudd_soker').append(SoknadStateMachine.t_vedtak_klaget)

    roles = user.get('roles', [])

    if if_soker_can_manage_soknad(soknad, user):
        roles.append({'name': 'tilskudd_soker'})

    soker_can_manage_soknad = if_soker_can_manage_soknad(soknad, user)
    saksbehandler_for_soknad = is_saksbehandler_for_soknad(soknad, user)
    saksbehandler_for_tilskuddsordning = is_saksbehandler_for_tilskuddsordning(soknad.tilskuddsordning, user)
    godkjenner_for_tilskuddsordning = is_godkjenner_for_tilskuddsordning(soknad.tilskuddsordning, user)

    role_actions = {}
    sm = SoknadStateMachine()
    actions = sm.get_transitions(soknad.status, user)

    for role, mapped_actions in mapping_roles_and_transitions.iteritems():
        for action in actions.values():
            if action in mapped_actions and (
                            (role == 'tilskudd_soker' and soker_can_manage_soknad)
                        or (role == 'tilskudd_godkjenner' and godkjenner_for_tilskuddsordning)
                    or (role == 'tilskudd_saksbehandler' and (saksbehandler_for_soknad or (action == SoknadStateMachine.t_behandle and saksbehandler_for_tilskuddsordning)
                                                              or (action == SoknadStateMachine.t_endre_saksbehandler and saksbehandler_for_tilskuddsordning)))):
                role_actions[action.id] = action

    return role_actions