Fuller Web Development

  BLOG | CONTACT | CLIENTS

The Importance in Rewriting Code

I needed a way of translating “644″, an object permission setting, into something more readable.

I wanted to be able to do the following:

def determinePermissions(obj):
    obj_usr= {"owner":obj.owner, "group":obj.group, "everyone":True}

    usr = {
        "owner":cherrypy.session.get('user'),

        "group":cherrypy.session.get('group'),
        "everyone":True

    }
    perms = self.translatePermissions(obj)
    r, w = False, False

    for x in ["owner", "group", "everyone"]:

        r = True if perms[x]["read"] and obj_user[x] == usr[x] else r

        w = True if perms[x]["write"] and obj_user[x] == usr[x] else w

    if usr["owner"] == "root":
        r, w = True, True

    return {"read":r, "write":w}

So I first wrote this [unexecuted]:

    def translatePermissions(self, obj):

        obj = self.get(oid=object_id)
        user, group, everyone = struct.unpack("3c",str(obj.permissions)):</p><p>        if owner == 6:

            owner["read"] = True
            owner["write"] = True

        if owner == 4:
            owner["read"] = True

            owner["write"] = False
        if owner == 0:

            owner["read"] = False
            owner["write"] = False</p><p>        if group == 6:

            group["read"] = True
            group["write"] = True

        if group == 4:
            group["read"] = True

            group["write"] = False
        if group == 0:

            group["read"] = False
            group["write"] = False</p><p>        if everyone == 6:

            everyone["read"] = True
            everyone["write"] = True

        if everyone == 4:
            everyone["read"] = True

            everyone["write"] = False
        if everyone == 0:

            everyone["read"] = False
            everyone["write"] = False</p><p>        return {"owner": owner, "group": group, "everyone": everyone}

And then I rewrote it to the following:

    def translatePermissions(self, object_id):
        rw = []

        obj = self.get(oid=object_id)
        for value in struct.unpack("3c",str(obj.permissions)):

            if value == 6:
                r = True

                w = True
            elif value == 4:

                r = True
                w = False
            elif value == 2:

                r = False
                w = True
            else:

                r = False
                w = False
            rw.append({"read":r, "write":w})

        return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}

And then checking for read and write rather than going through each possibility of v, as well as passing an object prior to reduce multiple seeks:

    def checkPermissions(self, obj):
        rw = []

        for v in struct.unpack("3c",str(obj.permissions)):

            if v == 6 or v == 4:

                r = True
            else:
                r = False

            if v == 6 or v == 2:

                w = True
            else:
                w = False

            rw.append({"read":r, "write":w})
        return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}

But with Python2.5 you can go even further and reduce it to:

    def translatePermissions(self, obj):
        rw = []

        for v in struct.unpack("3c",str(obj.permissions)):

            r = True if v == 6 or v == 4 else False

            w = True if v == 6 or v == 2 else False

            rw.append({"read":r, "write":w})
        return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}

From 32 lines at the start to 8 lines in the end! :) And both together they look like this:

def determinePermissions(obj):
    obj_usr= {"owner":obj.owner, "group":obj.group, "everyone":True}

    usr = {
        "owner":cherrypy.session.get('user'),

        "group":cherrypy.session.get('group'),
        "everyone":True

    }
    perms = self.translatePermissions(object_id)
    r, w = False, False

    for x in ["owner", "group", "everyone"]:

        r = True if perms[x]["read"] and obj_user[x] == usr[x] else r

        w = True if perms[x]["write"] and obj_user[x] == usr[x] else w

    if usr["owner"] == "root":
        r, w = True, True

    return {"read":r, "write":w}</p><p>def translatePermissions(self, obj):

    rw = []
    for v in struct.unpack("3c",str(o.permissions)):

        r = True if v == 6 or v == 4 else False

        w = True if v == 6 or v == 2 else False

        rw.append({"read":r, "write":w})
    return {"owner": rw[0], "group": rw[1], "everyone": rw[2]}

Poetry!