Различия между версиями 10 и 11
Версия 10 от 2010-06-13 18:05:11
Размер: 13226
Редактор: RostislavDzinko
Комментарий:
Версия 11 от 2010-06-13 18:06:41
Размер: 13412
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 211: Строка 211:
We do not yet have a default browser page for tickets. If you try to access the ticket from the URL: http://localhost:8080/mycollector/1 , you will get NotFound error like this: У нас еще нет страницы по умолчанию для заявки. Если вы попытаетесь получить доступ к заявке по ссылке http://localhost:8080/mycollector/1, то получите ошибку '''!NotFound''':
Строка 219: Строка 219:
This error is raised because there is no view named index registered for ITicket. This section will show how to create a default view for ITicket interface. Эта ошибка возникает, потому что для интерфейса This error is raised because there is no view named index registered for ITicket. This section will show how to create a default view for ITicket interface.

Учебник - часть 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:

Переключить отображение номеров строк
   1 from zope.container.constraints import ItemTypePrecondition
   2 
   3 def _ _setitem_ _(name, object):
   4     """Add an ICollector object."""
   5 
   6 _ _setitem_ _.precondition = ItemTypePrecondition(ITicket)

Класс 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""

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

Теперь необоходимо зарегистрировать интерфейс и класс. Откройте src/tc/collector/configure.zcml и добавьте следующее:

Переключить отображение номеров строк
   1 <interface
   2    interface="tc.collector.interfaces.ITicket"
   3    type="zope.app.content.interfaces.IContentType"
   4    />
   5 
   6 <class class="tc.collector.ticket.Ticket">
   7   <implements
   8      interface="zope.annotation.interfaces.IAttributeAnnotatable"
   9      />
  10   <implements
  11      interface="zope.container.interfaces.IContentContainer"
  12      />
  13   <require
  14      permission="zope.Public"
  15      interface="tc.collector.interfaces.ITicket"
  16      />
  17   <require
  18      permission="zope.Public"
  19      set_schema="tc.collector.interfaces.ITicket"
  20      />
  21 </class>

Теперь вы можете добавить ссылку на @@add_ticket в src/tc/collector/collectormain.pt. Теперь шаблон будет выглядеть вот так:

Переключить отображение номеров строк
   1 <html>
   2 <head>
   3 <title>Welcome to ticket collector</title>
   4 </head>
   5 <body>
   6 
   7 Welcome to ticket collector! <br/> <br/>
   8 
   9 <a href="@@add_ticket">Add Ticket</a>
  10 
  11 </body>
  12 </html>

Когда вы перейдете по ссылке, ожидается получение вида. Вы можете создать AddForm в src/tc/collector/views.py:

Переключить отображение номеров строк
   1 from tc.collector.interfaces import ITicket
   2 
   3 from tc.collector.ticket import Ticket
   4 
   5 class AddTicket(form.AddForm):
   6 
   7     form_fields = form.Fields(ITicket)
   8 
   9     def createAndAdd(self, data):
  10         number = data['number']
  11         summary = data['summary']
  12         ticket = Ticket()
  13         ticket.number = number
  14         ticket.summary = summary
  15         self.context[number] = ticket
  16         self.request.response.redirect('.')

Вы можете зарегистрировать вид src/tc/collector/configure.zcml:

Переключить отображение номеров строк
   1 <browser:page
   2    for="tc.collector.interfaces.ICollector"
   3    name="add_ticket"
   4    permission="zope.Public"
   5    class="tc.collector.views.AddTicket"
   6    />

Вы можете добавить заявку перейдя по ссылке: http://localhost:8080/mycollector/@@add_ticket, вы можете передать номер заявки, например, '1' и добавить 'Test Summary' в качестве summary.

Вы можете проверить объект через отладочную оболочку:

Переключить отображение номеров строк
   1 jack@computer:/projects/ticketcollector$ ./bin/paster shell debug.ini
   2 ...
   3 Welcome to the interactive debug prompt.
   4 The 'root' variable contains the ZODB root folder.
   5 The 'app' variable contains the Debugger, 'app.publish(path)' simulates a request.
   6 >>> root['mycollector']
   7 <tc.collector.ticketcollector.Collector object at 0xa5fc96c>
   8 >>> root['mycollector']['1']
   9 <tc.collector.ticket.Ticket object at 0xa5ffecc>

Страница по умолчанию для заявки

У нас еще нет страницы по умолчанию для заявки. Если вы попытаетесь получить доступ к заявке по ссылке http://localhost:8080/mycollector/1, то получите ошибку NotFound:

URL: http://localhost:8080/mycollector/1
...
NotFound: Object: <tc.collector.ticketcollector.Ticket object at 0x8fe74ac>, name: u'@@index'

Эта ошибка возникает, потому что для интерфейса This error is raised because there is no view named index registered for ITicket. This section will show how to create a default view for ITicket interface.

As you have already seen in the Getting Started chapter, you can create a simple view and register it from ZCML.

In src/tc/collector/views.py add a new view like this:

Переключить отображение номеров строк
   1 class TicketMainView(form.DisplayForm):
   2 
   3     form_fields = form.Fields(ITicket)
   4 
   5     template = ViewPageTemplateFile("ticketmain.pt")

You can create the template file src/tc/collector/ticketmain.pt with this content:

Переключить отображение номеров строк
   1 <html>
   2 <head>
   3 <title>Welcome to ticket collector!</title>
   4 </head>
   5 <body>
   6 
   7 You are looking at ticket number:
   8 <b tal:content="context/number">number</b>
   9 
  10 <h3>Summary</h3>
  11 
  12 <p tal:content="context/summary">Summary goes here</p>
  13 
  14 </body>
  15 </html>

Then, in src/tc/collector/configure.zcml:

Переключить отображение номеров строк
   1 <browser:page
   2    for="tc.collector.interfaces.ITicket"
   3    name="index"
   4    permission="zope.Public"
   5    class="tc.collector.views.TicketMainView"
   6    />

Now you can visit: http://localhost:8080/mycollector/1/@@index It should display the ticket number and summary. If you view the HTML source with your browser, it will look like this:

Переключить отображение номеров строк
   1 <html>
   2 <head>
   3 <title>Welcome to ticket collector!</title>
   4 </head>
   5 <body>
   6 
   7 You are looking at ticket number: <b>1</b>
   8 
   9 <h3>Summary</h3>
  10 
  11 <p>Test Summary</p>
  12 
  13 </body>
  14 </html>

Перевод: Ростислав Дзинько

Документ находится в стадии перевода...

Документации/Bluebream/BluebreamУчебник2 (последним исправлял пользователь RostislavDzinko 2010-06-13 19:31:48)