Размер: 6929
Комментарий:
|
Размер: 8304
Комментарий:
|
Удаления помечены так. | Добавления помечены так. |
Строка 67: | Строка 67: |
Будет очень хорошо, если вы установите предусловие для ограничения на типы объектов, добавляемых в коллектор. Если вы знаеие, что в объект коллектор можно добавлять только объекты заявки, добавьте предусловие для того, чтобы удостоверится, что в коллектор будут добавлять только заявки. Для того, чтобы сделать это, вам нужно добавить метод '''_ _setitem_ _''' интерфейса ICollector в определение интерфейса ( '''_ _setitem_ _''' - часть API интерфейсв IContainer). Ниже нужно добавить атрибут предусловия, который является экземпляром класса '''!ItemTypePrecondition'''. Вы можете передать в класс temTypePrecondition интерфейсы в качестве аргументов. Below, only one class (ITicket) is passed. So, only ticket objects are allowed inside a collector. You need to move the definition of ITicket above the IContainer as the ITicket is used by it. Add the following method definition to the ICollector class: | Будет очень хорошо, если вы установите предусловие для ограничения на типы объектов, добавляемых в коллектор. Если вы знаеие, что в объект коллектор можно добавлять только объекты заявки, добавьте предусловие для того, чтобы удостоверится, что в коллектор будут добавлять только заявки. Для того, чтобы сделать это, вам нужно добавить метод '''_ _setitem_ _''' интерфейса ICollector в определение интерфейса ( '''_ _setitem_ _''' - часть API интерфейсв IContainer). Ниже нужно добавить атрибут предусловия, который является экземпляром класса '''!ItemTypePrecondition'''. Вы можете передать в класс temTypePrecondition интерфейсы в качестве аргументов. В примере ниже передается тольео один интерфейс - '''ITicket'''. Таким образом, только объекты заявки можно добавлять в коллектор. Вам нужно переместить определение интерфейса '''ITicket''' выше определения '''IContainer''', поскольку '''ITicket''' используется им. Добавьте следующее определение метода в класс '''ICollector''': |
Строка 69: | Строка 69: |
{{{#!highlight python | |
Строка 71: | Строка 72: |
def __setitem__(name, object): | def _ _setitem_ _(name, object): |
Строка 74: | Строка 75: |
__setitem__.precondition = ItemTypePrecondition(ITicket) The ItemTypePrecondition provides a way to restrict the type of object which can be added inside a container. You can also specify that ticket objects can be only added inside a collector. To do this, you need to create another interface inheriting from zope.container.interfaces.IContained. |
_ _setitem_ _.precondition = ItemTypePrecondition(ITicket) }}} |
Строка 77: | Строка 78: |
Класс !ItemTypePrecondition предоставляет ограничения на типы объектов, которые могут быть добавлены внутрь контейнера. Вы также определяете объекты заявки, которые могут быть добавлены в коллектор. Для того, чтобы сделать это, вы должны создать другой интерфейс, который наследуется от '''zope.container.interfaces.IContained'''. {{{#!highlight python |
|
Строка 85: | Строка 89: |
__parent__ = Field( | _ _parent_ _ = Field( |
Строка 87: | Строка 91: |
Here you added a constraint for __parent__ field using the ContainerTypesConstraint class. | }}} Тут вы добавили ограничение на поле '''_ _parent_ _''', используя класс '''!ContainerTypesConstraint'''. === Реализация === Дальше вам необходимо реализовать интефейс внутри ''src/tc/collector/ticket.py'': {{{#!highlight python from zope.interface import implements from zope.container.contained import Contained from zope.container.btree import BTreeContainer from tc.collector.interfaces import ITicket from tc.collector.interfaces import ITicketContained class Ticket(BTreeContainer, Contained): implements(ITicket, ITicketContained) number = u"" summary = u"" }}} '''Перевод: Ростислав Дзинько''' '''Документ находится в стадии перевода...''' |
Учебник - часть 2
Введение
Это вторая часть учебника. В первой части вы узначли о структуре папок проекта, настройке Buildout, компонентах содержимого, и использовании библиотеки форм. Компоненты содержимого - объекты с видимым для пользователя видом. Вид может быть браузерным (HTML/JS/CSS), JSON, XMLRPC или любым другим. Чтобы обяснить идею контент компонентов, проект, который был начат в первой части учебника, будет расширен путем добавления новых функций. По сути объект коллектор, который был создан в последнем разделе - контент компонент. В этом разделе, вы создадите и другие контент объекты, такие как заявки и комментарии. Также следует упомянуть, что каждый контент компонент, включая контейнеры, имеет хорошо определенные интерфейсы.
Этот раздел исследует контент компоненты более детально. После окончания раздела, вы будете уметь:
- Определять схему контент компонентов
- Создавать контейнеры
- Использовать ZCML для настройки компонентов
Перед продолжением, вот обзор того, что рассматривается:
Добавление заявок – В этой части вы создадите объект заявки. Мы обеспечим подробный обзор создания контент объектов и покажем их использование на простом примере.
Списки заявок – Дальше вы увидите, как отобразить список заявок на главной странице коллектора.
Добавление комментариев – В этой части вы научитесь добавлять контент объекты внутрь контейнеров. Объекти заявки будут превращены в контейнеры.
Списки комментариев – В этой части вы создадите объект комментарий и напишете код для отображения комментариев на странице заявки.
Примеры для этой документации могут быть загружены отсюда: http://download.zope.org/bluebream/examples/ticketcollector- 1.0.0.tar.bz2.
Исходники доступны на разных этапах соответственно разделам:
- Этап 1 : От раздела 5.2 до 5.7
- Этап 2 : Раздел 5.8
- Этап 3 : Раздел 5.9
- Этап 4 : Раздел 6.2
- Этап 5 : Раздел 6.3
- Этап 6 : Раздел 6.4 и 6.5
Добавление заявок
Определение схемы
В этом разделе вы научитесь добавлять заявки в коллектор. Для того, чтобы использовать объекты заявки, вам нужно создать интерфейс заявки. Обновите src/tc/collector/interfaces.py, добавив туда интерфейс заявки:
1 from zope.container.interfaces import IContainer
2
3 class ITicket(IContainer):
4 """Ticket - the ticket content component"""
5
6 number = TextLine(
7 title=u"Number",
8 description=u"Ticket number",
9 default=u"",
10 required=True)
11
12 summary = Text(
13 title=u"Summary",
14 description=u"Ticket summary",
15 default=u"",
16 required=True)
TextLine и Text должны быть проимпортированы, если нет - проимпортируйте их:
1 from zope.schema import TextLine
2 from zope.schema import Text
Будет очень хорошо, если вы установите предусловие для ограничения на типы объектов, добавляемых в коллектор. Если вы знаеие, что в объект коллектор можно добавлять только объекты заявки, добавьте предусловие для того, чтобы удостоверится, что в коллектор будут добавлять только заявки. Для того, чтобы сделать это, вам нужно добавить метод _ _setitem_ _ интерфейса ICollector в определение интерфейса ( _ _setitem_ _ - часть API интерфейсв IContainer). Ниже нужно добавить атрибут предусловия, который является экземпляром класса ItemTypePrecondition. Вы можете передать в класс temTypePrecondition интерфейсы в качестве аргументов. В примере ниже передается тольео один интерфейс - ITicket. Таким образом, только объекты заявки можно добавлять в коллектор. Вам нужно переместить определение интерфейса ITicket выше определения IContainer, поскольку ITicket используется им. Добавьте следующее определение метода в класс ICollector:
Класс ItemTypePrecondition предоставляет ограничения на типы объектов, которые могут быть добавлены внутрь контейнера. Вы также определяете объекты заявки, которые могут быть добавлены в коллектор. Для того, чтобы сделать это, вы должны создать другой интерфейс, который наследуется от zope.container.interfaces.IContained.
1 from zope.schema import Field
2 from zope.container.interfaces import IContained
3 from zope.container.constraints import ContainerTypesConstraint
4
5 class ITicketContained(IContained):
6 """Interface that specifies the type of objects that can contain
7 tickets. So a ticket can only contain in a collector."""
8
9 _ _parent_ _ = Field(
10 constraint = ContainerTypesConstraint(ICollector))
Тут вы добавили ограничение на поле _ _parent_ _, используя класс ContainerTypesConstraint.
Реализация
Дальше вам необходимо реализовать интефейс внутри src/tc/collector/ticket.py:
1 from zope.interface import implements
2 from zope.container.contained import Contained
3 from zope.container.btree import BTreeContainer
4
5 from tc.collector.interfaces import ITicket
6 from tc.collector.interfaces import ITicketContained
7
8
9 class Ticket(BTreeContainer, Contained):
10
11 implements(ITicket, ITicketContained)
12
13 number = u""
14 summary = u""
Перевод: Ростислав Дзинько
Документ находится в стадии перевода...