from roxiadebug import *
SPEED_NUM, TEL_NUM = range(2)
class NamedListMetaClass(type):
def __init__(cls, cls_name, bases, attrs):
# cls -> cls_name을 갖는 class
members = attrs['members']
member_list = members.split()
setattr(cls, '__slots__', ())
def property_factory(index):
def property_get(self):
return self[index]
def property_set(self, v):
self[index] = v
return property_get, property_set
for i, member in enumerate(member_list):
setattr(cls, member, property(*property_factory(i)))
super(NamedListMetaClass, cls).__init__(cls_name, bases, attrs)
def __call__(self, *args):
# self: class
instance = super(NamedListMetaClass, self).__call__(args)
return instance
class SpeedItem(list):
__metaclass__ = NamedListMetaClass
members = 'speed_num tel_num'
def __init__(self, args):
if not args:
list.__init__(self, [''] * len(self.members.split()))
elif len(args) == 1:
list.__init__(self, *args)
else:
list.__init__(self, args)
def is_valid(self):
return self[0] or self[1]
class SpeedDB:
def __init__(self):
self.db = []
try:
self.load_db()
except:
pass
self.max_speed_num = len(self.db)
def get_item(self, i):
return self.db[i]
def is_valid_speed_num(self, n_speed_num):
if n_speed_num >=0 and n_speed_num <= self.max_speed_num:
return True
return False
def set_speed_tel_num(self, str_speed_num, tel_num):
# print "[yylee debug] str_speed_num:", str_speed_num
if str_speed_num == '':
return False
num = int(str_speed_num)-1
if self.is_valid_speed_num(num):
item = self.db[num]
item[TEL_NUM] = tel_num
self.save()
return True
else:
return False
def get_speed_num_by_tel_num(self, tel_num):
for item in self.db:
if tel_num == item[TEL_NUM]:
return item[SPEED_NUM]
return 0 # default group index =0
def get_tel_num_by_speed_num(self, str_speed_num):
if str_speed_num == '':
return None
num = int(str_speed_num)
if self.is_valid_speed_num(num):
item = self.get_item(num-1)
return item[TEL_NUM]
else:
return None
def is_empty(self, str_speed_num):
tel_num = self.get_tel_num_by_speed_num(str_speed_num)
if tel_num != None: # check speed num is valid
if tel_num == '': # speed num is empty
return True
return False
def clear_speed_num(self, str_speed_num):
'''
등록된 speed dial을 지우는 방법은 speed dial 번호를 key로 지우는 것만 허용한다.
등록된 전화번호로 speed dial을 지울 경우, 전화번호는 중복이 허용되므로,
의도하지 않은 speed dial이 지워지는 경우가 발생한다.
'''
max_speed_num = len(self.db)+1
if str_speed_num == '':
return False
num = int(str_speed_num)
if self.is_valid_speed_num(num):
item = self.get_item(num-1)
item[TEL_NUM] = ''
self.save()
return True
return False
def find_next_empty_speed_num(self, str_speed_num):
'''
입력한 speed_num 보다 크면서, 빈 speed dial을 찾는다.
0을 return 한 경우는 Full 혹은 입력한 speed num이 잘못된 것을 의미한다.
'''
if str_speed_num == '':
return False
num = int(str_speed_num)
if not self.is_valid_speed_num(num):
return 0
index = num
while index < max_speed_num:
if self.is_empty(index):
return index
index=+1
index = 1
while index < num:
if self.is_empty(index):
return index
index=+1
return 0
def find_prev_empty_speed_num(self, str_speed_num):
'''
입력한 speed_num 보다 적으면서, 빈 speed dial을 찾는다.
0을 return 한 경우는 Full 혹은 입력한 speed num이 잘못된 것을 의미한다.
'''
if str_speed_num == '':
return False
num = int(str_speed_num)
if not self.is_valid_speed_num(num):
return 0
index = num
while index > 0:
if self.is_empty(index):
return index
index -= 1
index = self.max_speed_num
while index > num:
if self.is_empty(index):
return index
index -= 1
return 0
def get_empty_speed_num_list(self):
list=[]
index = 1
while index <= self.max_speed_num:
if self.is_empty(index):
list.append(str(index))
index += 1
return list
def insert_speed_num_to_list(self, str_speed_num, list):
num = int(str_speed_num)
if len(list) > 0:
index = 0
for item in list:
if num < int(item):
list.insert(index, str_speed_num)
return True
else:
index += 1
list.append(str_speed_num)
return True
else:
return False
def change_speed_num(self, str_org, str_new):
if str_org != str_new:
if str_new == '':
self.clear_speed_num(str_org)
elif self.is_empty(str_new):
telnum = self.get_tel_num_by_speed_num(str_org)
self.clear_speed_num(str_org)
self.set_speed_tel_num(str_new, telnum)
def load_db(self):
for line in file('speed.txt'):
try:
item = line[:-1].split('\t')
self.db.append(item)
except:
pass
def save(self):
fp = open('speed.txt','w')
for item in self.db:
fp.write('\t'.join(item) + '\n')
def reset(self):
for item in self.db:
item[TEL_NUM] = ''
self.save()
def __del__(self):
pass
speeddb = SpeedDB()
if __name__ == '__main__':
speeddb.save()