next up previous contents
Next: Построение отчетов Up: Работа сервера приложений Previous: Общая схема работы и   Contents

Классы и модули для автоматизации прикладных процессов

В процессе разработки приложения описание интерфейса на уровне тэгов, которые будут переданы клиенту, достаточно затруднено и неудобно, поэтому в были написаны модули сервисов, которые несколько автоматизируют данный процесс и расположены в каталоге service. Фундаментальным в этом плане является модуль service.xml, который позволяет генерировать практически любые пакеты. Модуль предоставляет собой интерфейс к классу xmlObject, который во многом похож на парадигму DOM XML. У класса имеются следующие методы:
__init__(keywords) - создает новый экземпляр класса xmlObject с указанными параметрами. Обязательным параметром создания является name и type.
addTag(keywords) - создает и добавляет к объекту "дочерний" объект с указанными параметрами.
rmTag(name) - удаляет дочерний объект указанного объекта.
getDoc() - возвращает текстовое представление объекта и его дочерних объектов в xml-формате.

В качестве примера можно привести следующий код:

	import service.xml as x
	a=x.xmlObject(type='window',x='center',y='center',name='main',
			main=1,width=100,height=200,caption='myWindow')
	v=a.addTag(type='vgrid',name='',border=10,space=10)
	v.addTag(type='button',name='b',value='Test button')
	print a.getDoc()

Данный код вернет следующий результат:

	<?xml version='1.0' encoding='KOI8-R'?>
	<window name='main' caption='MyWindow' x='center' y='center'
			 width='100' height='200' main='1'>
	<vgrid name='' border='10' space='10'>
	<button name='b'>Test button</button>  
	</vgrid>
	</window>

Аналогичным способом можно формировать практически все применяющиеся тэги, включая тэги <info> и <updates>.

Cуществует более "автоматизированный" пакет service.widget, схема работы которого позволяет улучшить читабельность кода. Вышеприведенный код можно было бы переписать в виде

	from service.widget import  *
	a=window(x='center',y='center',name='main',
			main=1,width=100,height=200,caption='myWindow')
	v=a.addObj(vgrid(border=10,space=10))
	v.addObj(button(name='b',value='Test button'))
	print a.getDoc()
который вернет аналогичный xml-код, однако исходный код стал несколько короче и изящнее.

Имеется также ряд модулей, которые несколько упрощают работу с тэгами.

service.close_window(serv,name) передает через объект класса child с именем serv тэги, приводящие к закрытию окна с именем <name>. Примером может послужить код
		...
		service.close_window(serv,'prevWindow')
		...

service.get_obj_info(serv,name,id=0) через объект класса child с именем serv передает тэги, запросов (<info>), необходимые для получения информации о данных виджета name (в случае, если виджет является таблицей или radio, необходимо указывать параметр id), ожидает ответа от клиентского приложения и возвращает ответ.

Примером может послужить код

		...
		a=service.get_obj_info(serv,'password')
		...

Модуль service.table предоставляет класс table, необходимый для более удобной работы с тэгами таблиц <table>...</table>. Методы класса таковы:

__init__(**kw) создает экземпляр класса. Параметры инициализации таковы:
-
name имя виджета;
-
dbh ccылка на объект соединения с БД, доступной как child.dbh
-
query текст sql-запроса, результат которого будет передан в качестве содержимого таблицы.
get_view(xmlO) добавит к указанному объекту xmlO класса xmlObject тэги содержимого таблицы. Заголовочные тэги, а также тэги колонок НЕ ДОБАВЛЯЮТСЯ.
get_clear(xmlO) добавит к указанному объекту класса xmlObject тэги для очистки содержимого таблицы.
get_changes(xmlO) добавит к указанному объекту класса xmlObject тэги для обновления содержимого таблицы.
get_summ(fs) просуммирует содержимое колонок, номера которых указаны в наборе или последовательности fs. Результат суммирования возвращается также в виде последовательности. Перед применением данного метода необходимо, чтобы предварительно были выполнены методы get_view или get_changes. Это связано с тем, что данные методы выполняют sql-запрос, результаты которого собственно и суммируются. Можно также выполнить запрос и другими способами (прямым вызовом или же в других модулях).

Для создания диалоговых окон с вопросами, вариантами которых будут ответы "да"/"нет", применяется модуль service.YesNo, который предоставляет класс YesNo:

__init__(caption,text) создает экземпляр класса, окна с заголовком caption и текстом окна text.
show(serv) отсылает на клиентскую сторону окно и ждет нажатия пользователем кнопок ответа. Пакет отсылается через экземпляр объекта класса child с именем serv. Результат: 1 - ответ "Да", 0 - ответ "Нет"

Примером может послужить код

		...
		a=service.YesNo.YesNo("?","Вы уверены ?").show(serv)

		# да, уверен
		if a:
			...
		# не уверен
		else:
			...
		...



2004-12-28