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()