Newer
Older
Import / projects / LGN-IP3870 / t / new / alarmdb.py
from roxiadebug import *
from setting import setting
import config
## Index

INDEX,DATE,DAY,MONTH,YEAR, HOLIDAY, HOUR, MINUTER, INTERVAL,CNT, RINGPATH, RINGNAME,MESS = range(13)
record = 'index', 'date','day','month','year', 'holiday', 'hour', 'minuter', 'interval', 'cnt', 'ringpath', 'ringname','mess'
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 AlarmItem(list):
	__metaclass__ = NamedListMetaClass
	members = 'index date day month year holiday hour minuter interval cnt ringpath ringname mess'
	def __init__(self, args):
		if not args:
			import time,ntptime
			year,month,day,hour, min, sec, date = time.localtime(setting.current_time)[:7]	
			lst = ['0',_('Disable'),str(day),str(month),str(year),'1',str(hour),str(min),'1','1','','','']
			list.__init__(self, lst)
		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 AlarmDB:
	def __init__(self):		
		self.db = []
		try:
			self.load_db()
		except:
			pass

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

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

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

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

	def has_number(self, number):
		for item in self.db:
			if number in (item[INDEX]):
				return True
		return False

	def load_db(self):		
		for line in file('alarm.txt'):
			try:
				item = line[:-1].split('\t')				
				self.db.append(AlarmItem(item))				
			except:
				pass		
		self.sort()

	def find(self, number):
		if not number:
			return -1
		for i, item in enumerate(self.db):
			if number in (item[NUMBER], item[MOBILE], item[FAX]):
				return i
		return -1
	

	def get_item(self, i):
		return self.db[i]
		
	
		
	
	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

	

	
	

	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):	
		self.db.append(item)		
		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 remove(self, index):
		#assert 0 <= index < len(self.db)
		item = self.db[index]		
		del self.db[index]
		self.save()	

	def get_sym_name(self, index):
		item = self.db[index]
		return item[0] or item[1] or item[2] or item[3]
		
	def get_names(self):
		list = []
		for item in self.db:
			s = ''
			#s = '%s            ' % item[1]			
			#s = s[0:10] + '[%02d:%02d - %d %s - %s] ' % (eval(item[6]),eval(item[7]),eval(item[9]),_('Times'),_('Wakeup'))
			ap_str = ''
			if config.datetime_24hour:
				s = '%s %02d:%02d, %d%s %s, %d%s %s, %s' % (ap_str, eval(item[6]),eval(item[7]),eval(item[8]),_('Minutes'),_('Interval'),eval(item[9]),_('Times'),_('Count'),item[1])
				list.append(s)

			else:
				hour = eval(item[6])
				if hour >= 12:
					ap_str = _('PM')
				else:
					ap_str = _('AM')

				if hour == 0 or hour == 12:
					hour = 12
				else:
					hour = hour % 12
				s = '%s %02d:%02d, %d%s %s, %d%s %s, %s' % (ap_str, hour,eval(item[7]),eval(item[8]),_('Minutes'),_('Interval'),eval(item[9]),_('Times'),_('Count'),item[1])
				list.append(s)
		return  list

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

	def reset(self):		
		self.db = []
		self.save()


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


alarmdb = AlarmDB()
if __name__ == '__main__':		
	alarmdb.save()