def dispatch(self, request, **args):
        current_uri = args["uri"]
        graph = graphstore.graph()

        try:
            iconv = grrm2.Interconversion.get(graph, current_uri)
        except:
            return None

        ctx = {}

        ctx["steps"] = []
        ctx["start"] = ResultInfo()
        ctx["end"] = ResultInfo()

        start = grrm2.interconversionStart(iconv).get()[0]
        ctx["start"].uri = start.uri()
        ctx["start"].link = "/resources/%7B" + utils.uriToUuid(
            start.uri()) + "%7D"
        iconstorage = filestorage.ResourceIcon(
            start, settings=settings.filestorage_settings)
        ctx["start"].icon = iconstorage.url(filestorage.ResourceIcon.STATIC)
        ctx["start"].energy = grrm2.energy(start).get()
        ctx["start"].label = _getLabel(start)

        end = grrm2.interconversionEnd(iconv).get()[0]
        ctx["end"].uri = end.uri()
        ctx["end"].link = "/resources/%7B" + utils.uriToUuid(end.uri()) + "%7D"
        iconstorage = filestorage.ResourceIcon(
            end, settings=settings.filestorage_settings)
        ctx["end"].icon = iconstorage.url(filestorage.ResourceIcon.STATIC)
        ctx["end"].energy = grrm2.energy(end).get()
        ctx["end"].label = _getLabel(end)

        for s in grrm2.interconversionStep(iconv).getAll():
            step = s[0]
            iconstorage = filestorage.ResourceIcon(
                step, settings=settings.filestorage_settings)
            info = StepInfo()
            info.link = "/resources/%7B" + utils.uriToUuid(step.uri()) + "%7D"
            info.icon = iconstorage.url(filestorage.ResourceIcon.STATIC)
            info.uri = step.uri()
            info.energy = grrm2.energy(step).get()
            info.number = grrm2.stepNumber(step).get()
            ctx["steps"].append(info)

        def cmpFunc(x, y):
            return cmp(x.number, y.number)

        ctx["steps"] = sorted(ctx["steps"], cmp=cmpFunc)

        return ctx
    def dispatch(self, request, **args):
        current_uri = args["uri"]
        graph = graphstore.graph()
 
        try:
            route = grrm2.Interconversion.get(graph, current_uri)
        except:
            return None

        start = grrm2.interconversionStart(route).get()[0]
        end = grrm2.interconversionEnd(route).get()[0]
        
        iconstorage_start = filestorage.ResourceIcon(start, settings=settings.filestorage_settings)
        iconstorage_end = filestorage.ResourceIcon(end, settings=settings.filestorage_settings)
        iconstorage_route = filestorage.ResourceIcon(route, settings=settings.filestorage_settings)

        ctx = {}
        ctx["startUrl"] = "/resources/%7B"+utils.uriToUuid(start.uri())+"%7D"
        ctx["endUrl"] = "/resources/%7B"+utils.uriToUuid(end.uri())+"%7D"
        ctx["startIcon"] = iconstorage_start.url(filestorage.ResourceIcon.STATIC)
        ctx["endIcon"] = iconstorage_end.url(filestorage.ResourceIcon.STATIC)
        ctx["connectionRouteIcon"] = iconstorage_route.url(filestorage.ResourceIcon.ANIMATED)

        ctx["startStructureLabel"] = _getLabel(start)
        ctx["endStructureLabel"] = _getLabel(end)
    
        energies = {}
        for step in grrm2.interconversionStep(route).getAll():
            step = step[0]
            energies[grrm2.stepNumber(step).get()] = grrm2.energy(step).get()

        energies[0] = grrm2.energy(start).get()
        energies[max(energies.keys())+1] = grrm2.energy(end).get()

        chart_query = http.QueryDict("").copy()
        chart_query.update( {
                "cht": "lxy",
                "chs": "400x400",
                "chd": "t:"+",".join([ str(x) for x in energies.keys()])+"|"+",".join( [str(x) for x in energies.values()]),
                "chds": str(min(energies.keys()))+","+str(max(energies.keys()))+","+str(min(energies.values()))+","+str(max(energies.values())),
                "chco": "3072F3,ff0000,00aaaa",
                "chls": "2,4,1",
                "chf": "bg,s,F0F0FF",
                "chm": "s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5",
                "chxt": "x,y",
                "chxr": "0,"+str(min(energies.keys()))+","+str(max(energies.keys()))+"|1,"+str(min(energies.values()))+","+str(max(energies.values())),
            } )
        ctx["chartUrl"] = "http://chart.apis.google.com/chart?"+chart_query.urlencode()


        return ctx
    def _getMoleculeInfo(self, molecule):
        info = MoleculeInfo()

        info.icon = filestorage.ResourceIcon(
            molecule, settings=settings.filestorage_settings).url(
                filestorage.ResourceIcon.STATIC)
        info.link = "/resources/%7B" + utils.uriToUuid(molecule.uri()) + "%7D"
        info.structureLabel = "Unknown"
        info.isInterconversionStep = False

        interconversion_step = grrm2.InterconversionStep.tryCast(molecule)
        icresult = grrm2.InterconversionResult.tryCast(molecule)
        if interconversion_step:
            info.isInterconversionStep = True
            info.structureLabel = "IC - step " + str(
                grrm2.stepNumber(interconversion_step).get())
        elif icresult:
            struct_number = grrm2.structureNumber(icresult).get()
            if grrm2.EquilibriumStructure.tryCast(icresult):
                struct_type = "EQ"
            elif grrm2.TransitionState.tryCast(icresult):
                struct_type = "TS"
            elif grrm2.BarrierlessDissociated.tryCast(icresult):
                struct_type = "DDC"
            elif grrm2.BarrierDissociated.tryCast(icresult):
                struct_type = "UDC"

            info.structureLabel = struct_type + str(struct_number)

        return info
    def _getFromRoutesContext(self, molecule):

        icres = grrm2.InterconversionResult.tryCast(molecule)

        context = []
        iconvs = grrm2.interconversionEndOf(icres).getAll()
        if iconvs is None:
            return context

        for iconv in iconvs:
            iconv = iconv[0]
            start = grrm2.interconversionStart(iconv).get()[0]

            route_info = RouteInfo()
            route_info.link = "/resources/%7B" + utils.uriToUuid(
                iconv.uri()) + "%7D"

            route_info.targetLink = "/resources/%7B" + utils.uriToUuid(
                start.uri()) + "%7D"
            route_info.targetIcon = filestorage.ResourceIcon(
                start, settings=settings.filestorage_settings).url(
                    filestorage.ResourceIcon.STATIC)
            struct_number = grrm2.structureNumber(start).get()
            if grrm2.EquilibriumStructure.tryCast(start):
                struct_type = "EQ"
            elif grrm2.TransitionState.tryCast(start):
                struct_type = "TS"
            elif grrm2.BarrierlessDissociated.tryCast(start):
                struct_type = "DDC"
            elif grrm2.BarrierDissociated.tryCast(start):
                struct_type = "UDC"

            route_info.targetStructureLabel = struct_type + str(struct_number)
            route_info.targetEnergy = grrm2.energy(start).get()

            route_info.energyDifference = grrm2.energy(
                start).get() - grrm2.energy(molecule).get()

            route_info.icon = filestorage.ResourceIcon(
                iconv, settings=settings.filestorage_settings).url(
                    filestorage.ResourceIcon.ANIMATED)

            context.append(route_info)

        return context
def foo():
    end = grrm2.interconversionEnd(route).get()[0]

    iconstorage_start = filestorage.ResourceIcon(
        start, settings=settings.filestorage_settings)
    iconstorage_end = filestorage.ResourceIcon(
        end, settings=settings.filestorage_settings)
    iconstorage_route = filestorage.ResourceIcon(
        route, settings=settings.filestorage_settings)

    ctx = {}
    ctx["startUrl"] = "/resources/%7B" + utils.uriToUuid(start.uri()) + "%7D"
    ctx["endUrl"] = "/resources/%7B" + utils.uriToUuid(end.uri()) + "%7D"
    ctx["startIcon"] = iconstorage_start.url(filestorage.ResourceIcon.STATIC)
    ctx["endIcon"] = iconstorage_end.url(filestorage.ResourceIcon.STATIC)
    ctx["connectionRouteIcon"] = iconstorage_route.url(
        filestorage.ResourceIcon.ANIMATED)

    ctx["startStructureLabel"] = _getLabel(start)
    ctx["endStructureLabel"] = _getLabel(end)
    def _getTableData(self,request,uri):
        try:
            uris = request.GET.getlist("uris")
#            page = int(request.POST['page'])
#            rows_per_page = int(request.POST['rp'])
#            sortname = request.POST['sortname']
#            sortorder = request.POST['sortorder']
        except:
            return http.HttpResponseBadRequest()
       
        json_response = {}
        json_response["rows"] = []
        for uri in uris:
            resclass = ordfm.classByUri(graphstore.graph(),uri)
            resource = resclass.get(graphstore.graph(),uri)
            storage = filestorage.ResourceStorage(resource, web_accessible=True, settings=settings.filestorage_settings)
            iconstorage = filestorage.ResourceIcon(resource, settings=settings.filestorage_settings)

            row = {}
            row["icon"] = iconstorage.url(filestorage.ResourceIcon.STATIC)
            row["animatedicon"] = iconstorage.url(filestorage.ResourceIcon.ANIMATED)
            row["uri"] = uri
            row["url"] = utils.resourceUrl(resource)
            row["type"] = resclass.visibleName()
            json_response["rows"].append(row)


#        if page < 0:
#            return http.HttpResponseBadRequest("Invalid page number")
#
#        graph = graphstore.graph()
#        c = ordfm.Collection.get(graph, uri)
#
#        json_response = { "page": page, 
#                          "total": len(c.contents()), 
#                          "rows" : []
#                        }
#
#        for m_uri in c.contents().values()[(page-1)*rows_per_page:(page-1)*rows_per_page+rows_per_page]:
#            m = ordfm.Molecule.get(graph, m_uri)
#            json_response["rows"].append( { "cell" : [ "<span style=\"font-family: Courier\"><a href=\"/molecules/{"+utils.uriToUuid(m_uri)+"}\">"+utils.uriToUuid(m_uri)+"</a></span>", "", m.formula(), str(m.structureType()), str(m.energy()) ] } )
        return http.HttpResponse(simplejson.dumps(json_response), mimetype='application/javascript')
    def dispatch(self, request, **args):
        current_uri = args["uri"]
        graph = graphstore.graph()

        try:
            transition_state = grrm2.TransitionState.get(graph, current_uri)
        except:
            return None

        ctx = {}

        iconv_start_tuple_list = grrm2.interconversionStartOf(
            transition_state).getAll() or []
        iconv_end_tuple_list = grrm2.interconversionEndOf(
            transition_state).getAll() or []
        if len(iconv_start_tuple_list) + len(iconv_end_tuple_list) != 2:
            return None  # we have a problem... a transition state must have two links

        if len(iconv_start_tuple_list) == 2:
            iconv_left = iconv_start_tuple_list[0][0]
            iconv_right = iconv_start_tuple_list[1][0]
            energies_left = _getEnergies(iconv_left)
            energies_right = _getEnergies(iconv_right)
            energies = {}
            energies[0] = grrm2.energy(transition_state).get()
            for k, v in sorted(map(lambda x:
                                   (-x[0], x[1]), energies_left.items()) +
                               energies_right.items(),
                               key=lambda x: x[0]):
                print k
                energies[k] = v

            end_left = grrm2.interconversionEnd(iconv_left).get()[0]
            end_right = grrm2.interconversionEnd(iconv_right).get()[0]

            energies[min(energies.keys()) - 1] = grrm2.energy(end_left).get()
            energies[max(energies.keys()) + 1] = grrm2.energy(end_right).get()

        else:
            return None

        chart_query = http.QueryDict("").copy()
        chart_query.update({
            "cht":
            "lxy",
            "chs":
            "400x400",
            "chd":
            "t:" + ",".join([
                str(x[0]) for x in sorted(energies.items(), key=lambda x: x[0])
            ]) + "|" + ",".join([
                str(x[1]) for x in sorted(energies.items(), key=lambda x: x[0])
            ]),
            "chds":
            str(min(energies.keys())) + "," + str(max(energies.keys())) + "," +
            str(min(energies.values())) + "," + str(max(energies.values())),
            "chco":
            "3072F3,ff0000,00aaaa",
            "chls":
            "2,4,1",
            "chf":
            "bg,s,F0F0FF",
            "chm":
            "s,FF0000,0,-1,5|s,0000ff,1,-1,5|s,00aa00,2,-1,5",
            "chxt":
            "x,y",
            "chxr":
            "0," + str(min(energies.keys())) + "," +
            str(max(energies.keys())) + "|1," + str(min(energies.values())) +
            "," + str(max(energies.values())),
        })
        ctx["chartUrl"] = "http://chart.apis.google.com/chart?" + chart_query.urlencode(
        )

        iconstorage = filestorage.ResourceIcon(
            transition_state, settings=settings.filestorage_settings)
        if iconstorage.readable(filestorage.ResourceIcon.STATIC):
            icon_url = iconstorage.url(filestorage.ResourceIcon.STATIC)
        elif iconstorage.readable(filestorage.ResourceIcon.ANIMATED):
            icon_url = iconstorage.url(filestorage.ResourceIcon.ANIMATED)
        else:
            icon_url = None

        ctx["transitionStateIcon"] = icon_url

        iconstorage = filestorage.ResourceIcon(
            end_left, settings=settings.filestorage_settings)
        if iconstorage.readable(filestorage.ResourceIcon.STATIC):
            icon_url = iconstorage.url(filestorage.ResourceIcon.STATIC)
        elif iconstorage.readable(filestorage.ResourceIcon.ANIMATED):
            icon_url = iconstorage.url(filestorage.ResourceIcon.ANIMATED)
        else:
            icon_url = None

        ctx["leftEndIcon"] = icon_url

        iconstorage = filestorage.ResourceIcon(
            end_right, settings=settings.filestorage_settings)
        if iconstorage.readable(filestorage.ResourceIcon.STATIC):
            icon_url = iconstorage.url(filestorage.ResourceIcon.STATIC)
        elif iconstorage.readable(filestorage.ResourceIcon.ANIMATED):
            icon_url = iconstorage.url(filestorage.ResourceIcon.ANIMATED)
        else:
            icon_url = None

        ctx["rightEndIcon"] = icon_url

        ctx["leftEndUrl"] = "/resources/%7B" + utils.uriToUuid(
            end_left.uri()) + "%7D"
        ctx["rightEndUrl"] = "/resources/%7B" + utils.uriToUuid(
            end_right.uri()) + "%7D"
        return ctx
        print str(__file__) + " : Unable to convert to uri " + str(
            resource_uuid) + " " + e.message
        raise http.Http404()

    graph = graphstore.graph()
    try:
        thing = grrm2.Thing.get(graph, resource_uri)
    except:
        log.info(str(__file__) + " : not found " + str(resource_uri))
        raise http.Http404

    if not thing:
        log.info(str(__file__) + " : not found " + str(resource_uri))
        raise http.Http404

    iconstorage = filestorage.ResourceIcon(
        thing, settings=settings.filestorage_settings)
    if iconstorage.readable(filestorage.ResourceIcon.STATIC):
        icon_url = iconstorage.url(filestorage.ResourceIcon.STATIC)
    elif iconstorage.readable(filestorage.ResourceIcon.ANIMATED):
        icon_url = iconstorage.url(filestorage.ResourceIcon.ANIMATED)
    else:
        icon_url = None

    resource_type = None
    if grrm2.Run.tryCast(thing):
        resource_type = "Run"
    elif grrm2.TransitionState.tryCast(thing):
        resource_type = "TransitionState"
    elif grrm2.EquilibriumStructure.tryCast(thing):
        resource_type = "EquilibriumStructure"
    elif grrm2.BarrierDissociated.tryCast(thing):