Newer
Older
Import / projects / LGN-IP3870 / qtpyui / sql-test / phonedbsql.py
from roxiadebug import *
# -*- encoding: UTF-8 -*-

## Index

NAME, GROUP, PRIORITY, HOME, MOBILE, OFFICE, SPEED, EMAIL, MELODY, SNAPSHOT, CDATE, MDATE = range(12)
record = 'name', 'group', 'prority', 'home', 'mobile', 'office', 'speed', 'email', 'melody', 'snapshot', 'cdate', 'mdate'

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 PhoneItem(list):
	__metaclass__ = NamedListMetaClass
	members = 'name group prority home mobile office speed email melody snapshot cdate mdate'
	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] or self[2] or self[3] or self[4]


class PhoneDB:
	def __init__(self):
		#try:
		#	self.load_db()
		#except:
		pass

	def new_item(self, item=None):
		if item: PhoneItem(item)
		return PhoneItem()

	def is_empty(self):
		return len(self.db) == 0

	def is_empty_for_call(self):
		for item in self.db:
			if item[HOME] or item[MOBILE]:
				return False
		return True

	def has_name(self, name):
		for item in self.db:
			if item[0] == name:
				return True
		return False
		'''
		name = name.lower()
		for item in self.db:
			if item[0].lower() == name:
				return True
		return False
		'''

	def has_number(self, number):
		if not number:
			return False

		for item in self.db:
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				return True
		return False

	def load_db(self):
		import os, sys, popen2
		self.db = []
		print 'load db called'
		r, w = popen2.popen2('echo "select * from phonedb;" | sqlite3 phonedb.db', 1024)
		print 'popen init'
		line = ''
		for line in r.readlines():
				try:
					item = line[:-1].split('|')
					self.db.append(PhoneItem(item))
				except:
					pass
		self.sort()

	# KA: [20080429] for group DB serarh
	def load_group_db(self, group_index):
		group_db = []
		for item in self.db:
			if item[GROUP] == str(group_index):
				group_db.append(item)
		self.db = []
		self.db = group_db
		self.sort()

	def load_group_db_new(self, group_index):
		group_db = []
		index = []
		i = 0
		for item in self.db:
			if item[GROUP] == str(group_index):
				group_db.append(item)
				index.append(i)
			i +=1
		self.group_db = group_db
		self.group_db_index = index

	def get_names_by_group_new(self):
		return [item[0] for item in self.group_db]

	def get_names_by_group(self):
		return [item[NAME] for item in self.db]
	# KA: [20080429] for group DB serarh
	
	def find(self, number):
		if not number:
			return -1
		for i, item in enumerate(self.db):
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				return i
		return -1

	def get_name(self, number):
		if not number:
			return ''
		if number == 'P':
			return _('Private number')
		elif number == 'O':
			return _('Not available')
		for item in self.db:
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				return item[0] or number
		# not found
		return number	

	def get_name_by_number(self, number):
		if not number:
			return ''
		for item in self.db:
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				return item[0] or number
		return ''

	def get_name_by_email(self, email, isreturn=True):
		if not email:
			return ''
		for item in self.db:
			if email == item[EMAIL]:
				return item[0] or email
		# not found
		if isreturn:
			return email
		else:
			return ''

	def get_name_by_fax(self, fax):
		if not fax:
			return ''
		for item in self.db:
			if fax == item[OFFICE]:
				return item[0] or fax
		# not found
		return fax


	# KA: [20080321] phonebook priority
	def get_priority_number(self, item):
		#NAME, GROUP, PRIORITY, HOME, MOBILE, OFFICE, EMAIL, SPEED, MELODY, SNAPSHOT = range(10)
		if not item[PRIORITY]:
			return 0, ''
		elif item[PRIORITY] == '0':
			return int(item[PRIORITY]), item[HOME]
		elif item[PRIORITY] == '1':
			return int(item[PRIORITY]), item[MOBILE]
		else:
			return int(item[PRIORITY]), item[OFFICE]
	# KA: [20080321] phonebook priority

	# KA: [20080428] groupdb count members
	def get_group_number_of_members(self, index):
		count = 0
		for item in self.db:
			if  index == int(item[GROUP]):
				count += 1
		return count
	# KA: [20080428] groupdb count members ==

	def set_group(self, oldIndex, newIndex=0):
		newDB = []
		for item in self.db:
			if int(item[GROUP]) == oldIndex:
				item[GROUP] = str(newIndex)
			newDB.append(item)

		self.db = newDB
		self.sort()
		self.save()

	# 영상 광고를 위해 임시로 만든 함수 / 아래 get_snapshot()함수와 뭉치는게 가능하면 뭉칠 것.
	def get_snapshot2(self, number):
		if not number:
			return ''
		for item in self.db:
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				snapshot = item[SNAPSHOT]
				if snapshot == '/usr/local/lgvp/photos/snapshot/no_photo.png':
					snapshot = 'images/no_photo.png'
	
				import os
				if not os.access(snapshot, os.R_OK):
					snapshot = 'images/no_photo.png'
				return snapshot

		
	def get_snapshot(self, number):
		if not number:
			return ''
		for item in self.db:
			if number in (item[HOME], item[MOBILE], item[OFFICE]):
				snapshot = item[SNAPSHOT]
				#return snapshot
	
				import os
				if not os.access(snapshot, os.R_OK):
					snapshot = 'photos/snapshot/no_photo.png'
				return snapshot
		# 새로운 값으로 저장
		#index = self.find(number)			
		#self.remove(index)
		#item = groupdb.new_item()
		#self.insert_item(item)

	# KA: [20080506] long key 처리 -speed dialing
	def get_speed_dial(self, speed):
		for item in self.db:
			if not item[SPEED]:
				continue
			if int(speed) == int(item[SPEED]):
				tmp, number = self.get_priority_number(item)
				return number
		return False
	# KA: [20080506] long key 처리 -speed dialing ==

	def set_snapshot(self, snapshot, index=-1):
		import status
		if index < 0:
			index = status.editing_phone_number_index
			if index < 0:
				#print 'WARNING::: set snapshot: phone index is negative'
				return
		item = self.db[index]
		self.update_snapshot(item, snapshot)
		self.save()

	def update_snapshot(self, item, snapshot):
		import utils, os, config
		old_snapshot = item[SNAPSHOT]
		if old_snapshot:
			utils.remove(old_snapshot)
		if not snapshot:
			item[SNAPSHOT] = ''
			return

		image_type = utils.image_type(snapshot)
		tmp_w, tmp_h = utils.get_img_size(snapshot)
		if tmp_w * tmp_h > 640 * 480:
			snapshot = '/usr/local/lgvp/images/image_big.png'
		snapshot = utils.changefile_gif(snapshot)
		sname = os.path.split(snapshot)[-1]
		new_snapshot_name = config.image_snapshot_dir + image_type + '_' + sname
		if os.path.exists(new_snapshot_name):
			i = 1
			while 1:
				new_snapshot_name = config.image_snapshot_dir + image_type + '_' + str(i) + sname
				if not os.path.exists(new_snapshot_name):
					break
				i += 1
		item[SNAPSHOT] = new_snapshot_name
		utils.image_resize(snapshot, new_snapshot_name)
		if not os.path.exists(new_snapshot_name):
			utils.file_copy(snapshot, new_snapshot_name)

	def set_melody(self, melody, index=-1):
		import status
		if index < 0:
			index = status.editing_phone_number_index
			if index < 0:
				#print 'WARNING::: set melody: phone index is negative'
				return
		item = self.db[index]
		item[MELODY] = melody
		self.save()

	def get_item(self, i):
		#assert 0 <= i < len(self.db)
		return self.db[i]

	def find_items_by_char(self, name, index_tables):
		index = []
		name = name.lower()
		for i, index in enumerate(index_tables):
			item = self.db[index]
			if name <= item[0].lower():
				if item[0].lower().startswith(name):
					index.append(i)

		return index


	def find_by_char(self, name, index_tables):
		name = name.lower()
		for i, index in enumerate(index_tables):
			item = self.db[index]
			if name <= item[0].lower():
				if item[0].lower().startswith(name):
					return i
				return -1
		return -1

	def find_by_name_near(self, name, index_tables=None):
		name = name.lower()
		if index_tables == None:
			for i, item in enumerate(self.db):
				if name <= item[0].lower():
					return i
		else:
			for i, index in enumerate(index_tables):
				item = self.db[index]
				if name <= item[0].lower():
					return i
		return -1

	# KA: [20080425] searh near name and number
	def find_by_all_near(self, key, index_tables=None):
		result =[]
		kor = unicode(key,'utf-8')	
		if key.isdigit():
			#self.get_name_by_number(key)
			for item in self.db:
				print 'ka....item[HOME]=%s item[MOBILE]=%s item[OFFICE]=%s'%(item[HOME], item[MOBILE], item[OFFICE])
				if key in item[HOME] or key in item[MOBILE]  or key in item[OFFICE]:
					print 'ka........its matched'
					result.append(item[NAME])
		else:
			key = key.lower()
			for item in self.db:
				if key in item[0].lower():
					result.append(item[NAME])
		print 'ka......result =', result
		return result
		
	# KA: [20080425] serarh near name and number ==	
	def find_by_name_near_for_call(self, name):
		name = name.lower()
		for i, item in enumerate(self.get_list_for_call()[1]):
			if name <= item[0].lower():
				return i
		return -1 # not valid

	def find_by_name_near_for_email(self, name):
		name = name.lower()
		for i, item in enumerate(self.get_list_for_email()[1]):
			if name <= item[0].lower():
				return i
		return -1# not valid

	def find_by_name_near_for_fax(self, name):
		name = name.lower()
		for i, item in enumerate(self.get_list_for_fax()[1]):
			if name <= item[0].lower():
				return i
		return -1 # not valid

	def get_item_by_number(self, number):
		index = self.find(number)
		if index < 0:
			return None
		return self.get_item(index)

	def find_by_item(self, item):
		return self.db.index(item)

	def count(self):
		return len(self.db)

	def insert_item(self, item):
		#print 'ka.............insert item=', item
		try:
			assert len(item) == 12
		except:
			try:
				import traceback
				traceback.print_exc()
			except:
				pass
			return
		self.db.append(item)
		#if item[SNAPSHOT]:
		#	snapshot = item[SNAPSHOT]
		#	item[SNAPSHOT] = ''
		#	self.update_snapshot(item, snapshot)
		self.sort()
		self.save()

	def sort(self):
		def sort_func(x, y):
			xname = x[0] or x[1] or x[2] or x[3]
			yname = y[0] or y[1] or y[2] or y[3]
			xname = xname.lower()
			yname = yname.lower()
			return cmp(xname, yname)
		self.db.sort(sort_func)

	def groupdb_sort(self):
		def sort_func(x, y):
			xname = x[0] or x[1] or x[2] or x[3]
			yname = y[0] or y[1] or y[2] or y[3]
			xname = xname.lower()
			yname = yname.lower()
			return cmp(xname, yname)
		self.group_db.sort(sort_func)
	
	def sort_cdate(self):
		def sort_func(x, y):
			xname = int(x[10])
			yname = int(y[10])
			return cmp(xname, yname)
		self.db.sort(sort_func)		

	def remove(self, index):
		#assert 0 <= index < len(self.db)
		item = self.db[index]
		#if item[SNAPSHOT]:
		#	self.update_snapshot(item, '')
		del self.db[index]
		self.save()

	# KA: [20080329] NEW phonebook
	def get_phonelist_by_text(self, keys=''): # key value should not be null
		import popen2
		result_db = []
		r, w = popen2.popen2('echo "select NAME from phonedb where NAME like \'%' + keys + '%\' ;" | sqlite3 phonedb.db')
		line = ''
		for ch in r.read():
			if ( ch == '\n' ):
				result_db.append(line)
				line = ''
			else:
				line = line + ch
		return result_db		
	# KA: [20080329] NEW phonebook ==

	def get_list_for_call(self):
		index_list = []
		name_list = []
		for i, item in enumerate(self.db):
			if item[NUMBER] or item[MOBILE]:
				name_list.append(item[NAME] or item[HOME] or item[MOBILE])
				index_list.append(i)
		return index_list, name_list

	def get_list_for_fax(self):
		index_list = []
		name_list = []
		for i, item in enumerate(self.db):
			if item[WORK]:
				name_list.append(item[NAME] or item[WORK])
				index_list.append(i)
		return index_list, name_list

	def get_list_for_email(self):
		index_list = []
		name_list = []
		for i, item in enumerate(self.db):
			if item[EMAIL]:
				name_list.append(item[NAME] or item[EMAIL])
				index_list.append(i)
		return index_list, name_list

	def get_sym_name(self, index):
		item = self.db[index]
		return item[NAME] or item[HOME] or item[MOBILE] or item[OFFICE]

	def get_names(self):
		return [item[NAME] or item[HOME] or item[MOBILE] or item[OFFICE] or item[EMAIL] for item in self.db]

	def save(self):
		fp = open('phonenumber.txt','w')
		for item in self.db:
			fp.write('\t'.join(item) + '\n')

	def reset(self):
#		for item in self.db:
#			if item[SNAPSHOT]:
#				self.update_snapshot(item, '')
		self.db = []
		self.save()

	def get_vip_list(self):
		vip_list = []
		index_list = []
		for i, item in enumerate(self.db):
			if item[VIP]:
				vip_list.append(item[0] or item[1] or item[2] or item[3])
				index_list.append(i)
		return index_list, vip_list

	def get_not_vip_list(self):
		not_vip_list = []
		index_list = []
		for i, item in enumerate(self.db):
			if not item[VIP]:
				not_vip_list.append(item[0] or item[1] or item[2] or item[3])
				index_list.append(i)
		return index_list, not_vip_list


	def delete_vip_list(self):
		for item in self.db:
			item[VIP] = ''
		self.save()

	def __del__(self):
		pass
		#print 'phonedb destroy'


phonedb = PhoneDB()
try:
	phonedb.load_db()
except:
	pass

if __name__ == '__main__':	
	phonedb.save()