воскресенье, 20 апреля 2008 г.

Шрифты в линукс.

В линухе не покидало чувство что то здесь в плане дизайна не так, менюшки какие то большие и прочее. Уменьшаю и как то мелко все, не читается. Поставил по совету нормальный шрифт (liberation-fonts), который отлично маштабируется и все вроде как встало на свои места.

пятница, 11 апреля 2008 г.

Функциональный виджет.


Функциональный виджет.

Допустим, есть необходимость при редактировании атрибута объекта выбирать,
сохранять его значение или нет.
Например может появится такая необходимость при использовании объекта с атрибутом Bytes.



Интерфейс:

1.from zope.interface import Interface
2.from zope.schema import TextLine, Bytes
3.
4.class IMark(Interface):
5.
6. datax = Bytes(
7. title=u"Check Data",
8. description=u"Des",
9. required=True)
10.
11. dataxx = TextLine(
12. title=u"Data",
13. description=u"Des",
14.required=False)

6-9 устанавливаем тип атрибута Bytes и в строке 9 указываем что он обязательный для заполнения.

Реализация:

1.from zope.interface import implements
2.from zope.app.container.contained import Contained
3.
4.from boom.interfaces import IMark
5.from persistent import Persistent
6.
7.class Mark(Persistent):
8. implements(IMark)
9.
10. def __init__(self, datax='', dataxx=''):
11. self.datax = datax
12. self.dataxx = dataxx
13.
14.from zope.component.factory import Factory
15.
16.markFactory = Factory(
17. Mark,
18. title=u"Create a new mark",
19. description = u"This factory instantiates new mark."
20. )

1012 При инициализации объекта устанавливаем атрибуты

Формы добавления и редактирования:

1.from zope.component import createObject
2.from zope.formlib.form import AddForm, Fields, applyChanges, EditForm
3.from boom.interfaces import IMark
4.from boom.widget import BoolWidget
5.from zope.formlib.namedtemplate import NamedTemplate
6.from zope.formlib.namedtemplate import NamedTemplateImplementation
7.from zope.app.pagetemplate import ViewPageTemplateFile
8.
9.class MarkAddForm(AddForm):
10.
11. form_fields = Fields(IMark)
12.
13. label = u"Add BookMarker"
14.
15. template = NamedTemplate('mark.form')
16.
17. def create(self, data):
18. mark = createObject(u'boom.mark')
19. applyChanges(mark, self.form_fields, data)
20. return mark
21.
22.class MarkEditForm(EditForm):
23.
24. form_fields = Fields(IMark)
25. form_fields['datax'].custom_widget = BoolWidget
26.
27. label = u"Edit BookMarker"
28.
29. template = NamedTemplate('mark.form')
30.
31.form_template = NamedTemplateImplementation(
32. ViewPageTemplateFile('form.pt'))

9-20 Класс добавления объекта, все поля оставляем по умолчанию
2229 Класс редактирования, для байтового поля используем собственный виджет

Виджет:

1.from zope.app.form.browser.textwidgets import FileWidget
2.from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
3.from boom.bookmarker import Mark
4.
5.from zope.app.form.interfaces import ConversionError
6.from zope.app.i18n import ZopeMessageFactory as _
7.
8.from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
9.import zope.event
10.
11.class BoolWidget(FileWidget):
12. __call__ = ViewPageTemplateFile('widget.pt')
13.
14. def _toFieldValue(self, input):
15.
16. delete = self.request.get(self.name+'.delete')
17.
18. if delete=='False' or input == None or input == '':
19. return self.context.context.datax
20. try:
21. seek = input.seek
22. read = input.read
23. except AttributeError, e:
24. raise ConversionError(_('Form input is not a file object'), e)
25. else:
26. seek(0)
27. data = read()
28. if data or getattr(input, 'filename', ''):
29. return data
30. else:
31. return self.context.missing_value

11 - Наследуемся от FileWidget и перекрываем 2 метода call и _toFieldValue
В строке 16 получаем значение флага.
1819 проверяем нужно ли изменять объект, если не нужно или поля не заполнены
возвращается неизмеренный атрибут.


Шаблон формы:

1.<html xmlns="http://www.w3.org/1999/xhtml"
2. xmlns:tal="http://xml.zope.org/namespaces/tal"
3. xmlns:metal="http://xml.zope.org/namespaces/metal"
4. metal:use-macro="context/@@standard_macros/view">
5.<body>
6.<div metal:fill-slot="body">
7.<form class="edit-form" enctype="multipart/form-data" method="post"
8. action="." tal:attributes="action request/URL">
9. <h1 tal:content="view/label">Edit something</h1>
10. <div class="summary" tal:condition="view/status"
11. tal:content="view/status">Status</div>
12. <div class="row" tal:repeat="widget view/widgets">
13. <div class="label">
14. <label for="field.name" title="The widget's hint"
15. tal:attributes="for widget/name; title widget/hint"
16. tal:content="widget/label">Label</label>
17. </div>
18. <div tal:condition="widget/error"
19. tal:content="structure widget/error">Error</div>
20. <div class="field">
21. <input tal:replace="structure widget" />
22. </div>
23. </div>
24. <span class="actionButtons" tal:condition="view/availableActions">
25. <input tal:repeat="action view/actions"
26. tal:replace="structure action/render"
27. />
28. </span>
29.</form>
30.</div>
31.</body>
32.</html>

Шаблон виджета:

1.<div xmlns:tal="http://xml.zope.org/namespaces/tal">
2.
3. <input type="file" id="checkbox.flag" value=''
4. tal:attributes="id string:${view/name};
5. name string:${view/name};
6. "
7. />
8.<p>
9. <input type="radio" id="checkbox.flag"
10. tal:attributes="id string:${view/name}.delete;
11. name string:${view/name}.delete"
12. value="True" /> Изменить
13.</p>
14.<p>
15. <input type="radio" id="checkbox.flag"
16. tal:attributes="id string:${view/name}.delete;
17. name string:${view/name}.delete"
18. value="False" checked /> Не изменять
19.
20.</p>
21.</div>

четверг, 10 апреля 2008 г.

Sony VGN-NR110

Появилась необходимость установки драйверов на ноутбук VGN-NR110, вроде ничего сложного, но, родная операционка на борту Vista® Home Premium (англ), а я поставил на него Vista Ultimate (рус). Проблема заключалась в том что драйвера подходят только к Home Premium и только англоязычной версии. При запуске происходит проверка что за операционка стоит и как только установщик понимает что ось не родная, шлет в лес. Такую практику начали использовать многие компании и не только Sony. Но проблема решилась очень даже просто: при запуске инсталятора драйвера распаковываются в папку Temp, откуда устанавливаются без проблем, ко всему прочему: большенство с поддержкой русского языка.

понедельник, 7 апреля 2008 г.

Собственный виджет для поля.

Добавим в интерфейс еще одно поле Bool.

1.# -*- coding: koi8-r -*-
2.from zope.interface import Interface
3.from zope.schema import TextLine, Bool
4.
5.class IMark(Interface):
6.
7. datax = TextLine(
8. title=u"Data",
9. description=u"Des",
10. required=False)
11.
12. flag = Bool(
13. title=u"Bool",
14. description=u"Des",
15. required=False)

Добавленны стороки 12 - 15

Теперь если оставить остальной код без изменений (Собственная форма добавления
), при добавлении Mark мы получим следующюу форму:



Но хотелось бы что бы она имела немного другой вид:



Для этого нужно использовать собственный виджет:

1.from zope.app.form.browser.boolwidgets import CheckBoxWidget
2.from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
3.
4.class BoolWidget(CheckBoxWidget):
5. __call__ = ViewPageTemplateFile('widget.pt')

Класс BoolWidget наследуется от базового CheckBoxWidget, и реализует метод вызова шаблона.

1.<div xmlns:tal="http://xml.zope.org/namespaces/tal">
2.<p>
3. <input type="radio" id="checkbox.flag"
4. tal:attributes="id string:${view/name};
5. name string:${view/name}"
6. value="on" checked /> True
7.</p>
8.<p>
9. <input type="radio" id="checkbox.flag"
10. tal:attributes="id string:${view/name};
11. name string:${view/name}"
12. value="" /> False
13.
14.</p>
15.</div>

Здесь мы используем форму ввода radio вместо checkbox.

В классе добавления формы укажем что поле flag использует наш собственный виджет (строка 15):

1.from zope.component import createObject
2.
3.from zope.formlib.form import AddForm, Fields, applyChanges
4.from boom.interfaces import IMark
5.from boom.widget import BoolWidget
6.from zope.formlib.namedtemplate import NamedTemplate
7.from zope.formlib.namedtemplate import NamedTemplateImplementation
8.from zope.app.pagetemplate import ViewPageTemplateFile
9.
10.
11.
12.class MarkAddForm(AddForm):
13.
14. form_fields = Fields(IMark)
15. form_fields['flag'].custom_widget = BoolWidget
16.
17. label = u"Add BookMarker"
18.
19. template = NamedTemplate('mark.form')
20.
21.
22. def create(self, data):
23. mark = createObject(u'boom.mark')
24. applyChanges(mark, self.form_fields, data)
25. return mark
26.
27.form_template = NamedTemplateImplementation(
28. ViewPageTemplateFile('form.pt'))

В реализации нужно так же указать значение поля flag по умолчанию (строка 14)

1.# -*- coding: koi8-r -*-
2.__docformat__ = 'restructuredtext'
3.
4.from zope.interface import implements
5.from zope.app.container.contained import Contained
6.
7.from boom.interfaces import IMark
8.from persistent import Persistent
9.
10.class Mark(Persistent):
11. implements(IMark)
12.
13. datax = u''
14. flag = False
15.
16.from zope.component.factory import Factory
17.
18.markFactory = Factory(
19. Mark,
20. title=u"Create a new mark",
21. description = u"This factory instantiates new mark."
22. )

Остальной код оставляем без изменений.

Katapult





Поставил забавную штуку, для быстрого запуска приложений. Если немного разобраться то весч давольно удобная, позволяет запускать приложения, песни в амароке, искать в гугле, выполнять арифметические действия и проверку слов.

пятница, 4 апреля 2008 г.

Собственная форма добавления

Собственная форма добавления:

У нас есть интерфейс:

1.# -*- coding: koi8-r -*-
2.from zope.interface import Interface
3.from zope.schema import TextLine
4.
5.class IMark(Interface):
6.
7. datax = TextLine(
8. title=u"Data",
9. description=u"Des",
10. required=False)

И есть его реализация:

1.# -*- coding: koi8-r -*-
2.__docformat__ = 'restructuredtext'
3.
4.from zope.interface import implements
5.from zope.app.container.contained import Contained
6.
7.from boom.interfaces import IMark
8.from persistent import Persistent
9.
10.class Mark(Persistent):
11. implements(IMark)
12.
13. datax = u''
14.
15.from zope.component.factory import Factory
16.
17.markFactory = Factory(
18. Mark,
19. title=u"Create a new mark",
20. description = u"This factory instantiates new mark."
21. )

Здесь мы добавляем в строке 17 фабрику, которая служит для создания нашего объекта.
Теперь нужно написать собственный класс добавления
:

1.from zope.component import createObject
2.
3.from zope.formlib.form import AddForm, Fields, applyChanges
4.from boom.interfaces import IMark
5.
6.from zope.formlib.namedtemplate import NamedTemplate
7.from zope.formlib.namedtemplate import NamedTemplateImplementation
8.from zope.app.pagetemplate import ViewPageTemplateFile
9.
10.class MarkAddForm(AddForm):
11.
12. form_fields = Fields(IMark)
13. label = u"Add BookMarker"
14.
15. template = NamedTemplate('mark.form')
16.
17.
18. def create(self, data):
19. mark = createObject(u'boom.mark')
20. applyChanges(mark, self.form_fields, data)
21. return mark
22.
23.form_template = NamedTemplateImplementation(
24. ViewPageTemplateFile('form.pt'))

Класс добавления наследуется от базового AddForm, в строке 12 мы указываем
что поля для формы нужно брать из нашего интерфейса.
В
15 строке мы указываем шаблон который будет использоваться для формы.
В строке
18 определяем метод который перекрывает создание объекта.
В строке
23 создаем объект который нужен для связки шаблона.

Конфигурация:

1.<configure
2. xmlns="http://namespaces.zope.org/zope"
3. xmlns:browser="http://namespaces.zope.org/browser">
4.
5. <interface
6. interface=".interfaces.IMark"
7. type="zope.app.content.interfaces.IContentType"
8. />
9.
10. <content class=".bookmarker.Mark">
11. <require
12. permission="zope.ManageContent"
13. interface=".interfaces.IMark"/>
14. <require
15. permission="zope.ManageContent"
16. set_schema=".interfaces.IMark"
17. />
18. </content>
19.
20.<browser:addMenuItem
21. factory="boom.mark"
22. title="Mark"
23. permission="zope.ManageContent"
24. view="boom.mark"
25. />
26.
27. <browser:page
28. for="zope.app.container.interfaces.IAdding"
29. name="boom.mark"
30. class=".form.MarkAddForm"
31. permission="zope.ManageContent"
32. />
33.
34. <adapter
35. factory=".form.form_template"
36. for=".form.MarkAddForm"
37. name="mark.form"
38. />
39.
40. <utility
41. component=".bookmarker.markFactory"
42. name="boom.mark"
43. permission="zope.Public"
44. />
45.</configure>

1-3: Объявление директив
5-8: Указываем что наш объект контентный
10-18: Указываем права для нашего объекта
20-25: Директива добавления
21 – указываем фабрику для создания объекта
24 – вид для добавления
27-32: Директива для класса добавления
29 — имя совпадающее с видом в директиве addMenuItem
34-37: Адаптер для класса добавления, определяет шаблон
40-43: Утилита определения фабрики

Шаблон form.pt

1.<html xmlns="http://www.w3.org/1999/xhtml"
2. xmlns:tal="http://xml.zope.org/namespaces/tal"
3. xmlns:metal="http://xml.zope.org/namespaces/metal"
4. metal:use-macro="context/@@standard_macros/view">
5.<body>
6.<div metal:fill-slot="body">
7.<form class="edit-form" enctype="multipart/form-data" method="post"
8. action="." tal:attributes="action request/URL">
9.
10. <h1 tal:content="view/label">Edit something</h1>
11.
12. <div class="summary" tal:condition="view/status"
13. tal:content="view/status">Status</div>
14.
15. <div class="row" tal:repeat="widget view/widgets">
16. <div class="label">
17. <label for="field.name" title="The widget's hint"
18. tal:attributes="for widget/name; title widget/hint"
19. tal:content="widget/label">Label</label>
20. </div>
21.
22. <div tal:condition="widget/error"
23. tal:content="structure widget/error">Error</div>
24.
25. <div class="field">
26. <input tal:replace="structure widget" />
27. </div>
28. </div>
29.
30. <span class="actionButtons" tal:condition="view/availableActions">
31. <input tal:repeat="action view/actions"
32. tal:replace="structure action/render"
33. />
34. </span>
35.
36.</form>
37.</div>
38.</body>
39.</html>

Выводит стандартные виджеты ввода, определение виджетов происходит
по полям указанным в классе добавления формы.