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