Welcome, guest | Sign In | My Account | Store | Cart
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: lintao
import copy

class Entry(object):
    def __init__(self, fields):
        self.__fields = fields
        # Some inner status
        self.__isenableedit = False
        self.__isenablequery = False
        # The really data to save
        self.__realdict = {}

    def getfield(self):
        return self.__fields

    def __getitem__(self, key):
        # keep safe to get item
        if not self.__isenablequery:
            raise Exception, "Please enable query first"
            return
            pass
        if not self.__check_key(key):
            raise Exception, "the Key (%s) is not in the Entry"%repr(key)
        return self.__realdict.get(key, None)
        pass

    def __setitem__(self, key, value):
        # keep safe to set item
        if not self.__isenableedit:
            raise Exception, "Please enable edit first"
            return
        if not self.__check_key(key):
            raise Exception, "the Key (%s) is not in the Entry"%repr(key)
        self.__realdict[key] = value
        pass

    def __check_key(self, key):
        if not key:
            return False
        if isinstance(key, str):
            return (key in self.__fields)
        return all( (i in self.__fields) for i in key)

    # use a dict to update self.__realdict
    def update(self, indict):
        # keep safe to set item
        if not self.__isenableedit:
            raise Exception, "Please enable edit first"
            return
        if not self.__check_key(indict.keys()):
            raise Exception, "the Key (%s) may be not in the Entry"%repr(key)
        self.__realdict.update(indict)
        pass

    def copydict(self):
        return copy.deepcopy(self.__realdict)

    # query
    def enablequery(self):
        if self.__isenablequery:
            return
        self.disableedit()
        self.__isenablequery = True
        pass

    def disablequery(self):
        if not self.__isenablequery:
            return
        self.__isenablequery = False
        pass

    # use with statement
    class __inner_query(object):
        def __init__(self, outer):
            self.outer = outer
        def __enter__(self):
            self.outer.enablequery()
            return self.outer
        def __exit__(self, exc_type, exc_value, traceback):
            self.outer.disablequery()
            #self.outer.test_disp_status()
    def query(self):
        return self.__inner_query(self)

    # ###########################################

    # edit
    def enableedit(self):
        if self.__isenableedit:
            return
        # also to enable query
        self.enablequery()
        self.__isenableedit = True
        pass
        pass

    def disableedit(self):
        if not self.__isenableedit:
            return
        self.__isenableedit = False
        self.disablequery()
        pass
        pass
    # with statement
    class __inner_edit(object):
        def __init__(self, outer):
            self.outer = outer
        def __enter__(self):
            self.outer.enableedit()
            return self.outer
        def __exit__(self, exc_type, exc_value, traceback):
            self.outer.disableedit()
            #self.outer.test_disp_status()
    def edit(self):
        return self.__inner_edit(self)
    # ###########################################

    def test_check_key(self, key):
        return self.__check_key(key)

    def test_disp_status(self):
        print "__isenableedit", self.__isenableedit
        print "__isenablequery", self.__isenablequery
        pass

    pass

if __name__ == '__main__':
    keys = ["id", "name", "age"]
    notkeys = ["not_%s"%i for i in keys]
    oneentry = Entry(keys)
    for i in keys:
        print oneentry.test_check_key(i)
    for i in notkeys:
        print oneentry.test_check_key(i)

    oneentry.enableedit()
    oneentry.test_disp_status()
    oneentry["id"] = 10
    oneentry["name"] = "lintao"
    oneentry["age"] = 22
    oneentry.disableedit()
    oneentry.test_disp_status()

    oneentry.enablequery()
    oneentry.test_disp_status()
    print oneentry["id"]
    print oneentry["name"]
    print oneentry["age"]
    oneentry.disablequery()
    oneentry.test_disp_status()
    # Exception
    #print oneentry["age"]
    #oneentry["name"] = "lintao"

    # with statement
    print "with statement:"
    with oneentry.edit():
        oneentry["id"] = 2
        oneentry["name"] = "lintao51"
        oneentry["age"] = 22
        #oneentry["noage"] = "no"
    with oneentry.query():
        print oneentry["id"]
        print oneentry["name"]
        print oneentry["age"]
        #print oneentry["noage"]

    newdict = {"id":"3","name":"lint","age":"22"}
    with oneentry.edit():
        oneentry.update(newdict)
    with oneentry.query():
        print oneentry["id"]
        print oneentry["name"]
        print oneentry["age"]

    def test_query(entry):
        return entry.query()

    with test_query(oneentry):
        print oneentry["id"]
        print oneentry["name"]
        print oneentry["age"]

    print oneentry.copydict()

    # use class
    #print "use class"

    #class test_query_2(object):
    #    def __init__(self, entry):
    #        self.entry = entry
    #    def __enter__(self):
    #        print "enter in test_query_2"
    #        self.entry.enablequery()
    #        print "self.entry.enablequery"
    #        return self.entry #.query()

    #    def __exit__(self, exc_type, exc_value, traceback):
    #        self.entry.disablequery()
    #        print "self.entry.disablequery"
    #        print "exit from test_query_2"

    #with test_query_2(oneentry) as f:
    #    #with f.query():
    #    print f["id"]




    pass

History