Moving cube in cube's heading?

So basically self.cube is a child of render and camera is a child of self.cube. That’s pretty much the entire scene graph with environment a child of render.

self.heading is initially set to 0, with it changing with this:

            self.heading += 40*dt
        if self.keyMap["lookR"]:
            self.heading -= 40*dt
        if self.heading > 360:
            self.heading -= 360
        elif self.heading < 0:
            self.heading += 360

If you simply want the entire code, here it is:

from panda3d.core import loadPrcFile
import math
loadPrcFile("configuration.prc")
from direct.showbase.ShowBase import ShowBase
class MyGame(ShowBase):
    def __init__(self):
        super().__init__()
        self.disableMouse()
        self.test = self.loader.loadModel("models/environment")
        self.test.reparentTo(self.render)
        self.x = 0
        self.y = -140
        self.z = 5
        self.heading = 0
        self.cube = self.loader.loadModel("cube.obj")
        self.cube.reparentTo(self.render)
        self.camera.setPos(0,-20,2)
        self.camera.reparentTo(self.cube)
        self.cube.setPos(self.x,self.y,self.z)
        self.keyMap = {
            "forward": False,
            "backward": False,
            "right": False,
            "left": False,
            "Rotate": False,
            "lookL": False,
            "lookR": False
        }
        self.accept("w", self.updateKeyMap, ["forward", True])
        self.accept("w-up", self.updateKeyMap, ["forward", False])

        self.accept("a", self.updateKeyMap, ["left", True])
        self.accept("a-up", self.updateKeyMap, ["left", False])

        self.accept("s", self.updateKeyMap, ["backward", True])
        self.accept("s-up", self.updateKeyMap, ["backward", False])

        self.accept("d", self.updateKeyMap, ["right", True])
        self.accept("d-up", self.updateKeyMap, ["right", False])

        self.accept("arrow_left", self.updateKeyMap, ["lookL", True])
        self.accept("arrow_left-up", self.updateKeyMap, ["lookL", False])

        self.accept("arrow_right", self.updateKeyMap, ["lookR", True])
        self.accept("arrow_right-up", self.updateKeyMap, ["lookR", False])
        self.taskMgr.add(self.update, "update")


    def updateKeyMap(self, controlName, controlState):
        self.keyMap[controlName] = controlState
    def update(self,task):
        dt = globalClock.getDt()

        # If any movement keys are pressed, use the above time
        # to calculate how far to move the character, and apply that.
        if self.keyMap["forward"]:
            #self.y += 7*dt*(math.cos(math.radians(self.heading)))
            #self.x += 7*dt*(math.sin(math.radians(self.heading)))
            quat = self.cube.getQuat(self.render)

            forwardVec = quat.getForward()
            self.cube.setPos(self.cube.getPos(self.render) + forwardVec * 40 * dt)

        if self.keyMap["backward"]:
            self.y += -17*dt
        if self.keyMap["left"]:
            self.x += -17*dt
        if self.keyMap["right"]:
            self.x += 17*dt
        if self.keyMap["lookL"]:
            self.heading += 40*dt
        if self.keyMap["lookR"]:
            self.heading -= 40*dt
        if self.heading > 360:
            self.heading -= 360
        elif self.heading < 0:
            self.heading += 360
        #self.cube.setPos(self.x,self.y,self.z)
        self.cube.setH(self.heading)
        return task.cont


game = MyGame()
game.run()