Addresses comment "not good call setup_portal_student here"

It probably is not good call setup_portal_student here. This creates the learner object if it doesn't exist, and we've used the existance of the learner object to indicate that student has run a runnable. It looks like it is already bailing out if learner is null, so if you look up the leaner without setup_portal_student you should be good.
Address comments regarding lightweight JnlpLaunchables without statuses.

Unfortunately lightweight Activities, are still JnlpLaunchable and they don't have status updates. Perhaps this will work anyhow. If you want to see an example of one look at: features/student_runs_html_activity.feature

You might be able to get by using the run_format method. You might need to add it to ExternalActivity for it work properly. I see it is already added to ResourcePage.
Factor out common copy/paste code. use_jnlps? and pop_up_options_for.

Others too like use_adhoc_workgroups? and some common styling.
Tests for new runnable_helper methods.