Newer
Older
Import / projects / LGN-IP3870 / t / new / speeddb.py
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()