Различия между версиями 1 и 8 (по 7 версиям)
Версия 1 от 2010-06-12 21:51:23
Размер: 2076
Редактор: RostislavDzinko
Комментарий:
Версия 8 от 2010-06-12 23:29:29
Размер: 11316
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 7: Строка 7:
This is the second part of the tutorial. In the first part, you learned about project directory structure, Buildout configuration, content components and using the form library. Content components are objects with a user visible view. A view could be a browser view (HTML/JS/CSS) or JSON or XMLRPC or any other view. To explain the idea of content components, the ticket collector project started in the first part of tutorial will be expanded with additional functionality. In fact, the collector object created in the last chapter is a content component. In this chapter, you will create new content objects like tickets and comments. Another thing that should be noted is that every content component, including container components, has well defined interfaces.

This chapter explores content components in more detail. After completing this chapter, you should be able to:

Define schema for content components
Create container objects
Use ZCML to configure various components
Before proceeding further, here is an overview of what we will cover:

Adding tickets – In this section you will create a ticket object. We provide a detailed overview of creating content objects and demonstrate with a simple example.
Listing tickets – Next you will see how to display tickets from the main collector page.
Adding comments – Here you will learn how to add content objects inside other container objects. Ticket objects will be transformed to container objects.
Listing comments – In this section you will develop a comment object and write the code needed to display comments on the ticket page.
Note The examples in this documentation can be downloaded from here: http://download.zope.org/bluebream/examples/ticketcollector-1.0.0.tar.bz2
The source code is available in different stages corresponding to sections.
Stage 1 : Section 5.2 to 5.7
Stage 2 : Section 5.8
Stage 3 : Section 5.9
Stage 4 : Section 6.2
Stage 5 : Section 6.3
Stage 6 : Section 6.4 & 6.5
Это вторая часть учебника. В первой части вы узначли о структуре папок проекта, настройке Buildout, компонентах содержимого, и использовании библиотеки форм. Компоненты содержимого - объекты с видимым для пользователя видом. Вид может быть браузерным (HTML/JS/CSS), JSON, XMLRPC или любым другим. Чтобы обяснить идею контент компонентов, проект, который был начат в первой части учебника, будет расширен путем добавления новых функций. По сути объект коллектор, который был создан в последнем разделе - контент компонент. В этом разделе, вы создадите и другие контент объекты, такие как заявки и комментарии. Также следует упомянуть, что каждый контент компонент, включая контейнеры, имеет хорошо определенные интерфейсы.

Этот раздел исследует контент компоненты более детально. После окончания раздела, вы будете уметь:

 * Определять схему контент компонентов
 * Создавать контейнеры
 * Использовать ZCML для настройки компонентов

Перед продолжением, вот обзор того, что рассматривается:

 * '''Добавление заявок''' – В этой части вы создадите объект заявки. Мы обеспечим подробный обзор создания контент объектов и покажем их использование на простом примере.
 * '''Списки заявок''' – Дальше вы увидите, как отобразить список заявок на главной странице коллектора.
 * '''Добавление комментариев''' – В этой части вы научитесь добавлять контент объекты внутрь контейнеров. Объекти заявки будут превращены в контейнеры.
 * '''Списки комментариев''' – В этой части вы создадите объект комментарий и напишете код для отображения комментариев на странице заявки.

{{{#!wiki note
Примеры для этой документации могут быть загружены отсюда: 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'', добавив туда интерфейс заявки:

{{{#!highlight python
from zope.container.interfaces import IContainer

class ITicket(IContainer):
    """Ticket - the ticket content component"""

    number = TextLine(
        title=u"Number",
        description=u"Ticket number",
        default=u"",
        required=True)

    summary = Text(
        title=u"Summary",
        description=u"Ticket summary",
        default=u"",
        required=True)
}}}

'''!TextLine''' и '''Text''' должны быть проимпортированы, если нет - проимпортируйте их:

{{{#!highlight python
from zope.schema import TextLine
from zope.schema import Text
}}}

Будет очень хорошо, если вы установите предусловие для ограничения на типы объектов, добавляемых в коллектор. Если вы знаеие, что в объект коллектор можно добавлять только объекты заявки, добавьте предусловие для того, чтобы удостоверится, что в коллектор будут добавлять только заявки. Для того, чтобы сделать это, вам нужно добавить метод '''_ _setitem_ _''' интерфейса ICollector в определение интерфейса ( '''_ _setitem_ _''' - часть API интерфейсв IContainer). Ниже нужно добавить атрибут предусловия, который является экземпляром класса '''!ItemTypePrecondition'''. Вы можете передать в класс temTypePrecondition интерфейсы в качестве аргументов. В примере ниже передается тольео один интерфейс - '''ITicket'''. Таким образом, только объекты заявки можно добавлять в коллектор. Вам нужно переместить определение интерфейса '''ITicket''' выше определения '''IContainer''', поскольку '''ITicket''' используется им. Добавьте следующее определение метода в класс '''ICollector''':

{{{#!highlight python
from zope.container.constraints import ItemTypePrecondition

def _ _setitem_ _(name, object):
    """Add an ICollector object."""

_ _setitem_ _.precondition = ItemTypePrecondition(ITicket)
}}}

Класс !ItemTypePrecondition предоставляет ограничения на типы объектов, которые могут быть добавлены внутрь контейнера. Вы также определяете объекты заявки, которые могут быть добавлены в коллектор. Для того, чтобы сделать это, вы должны создать другой интерфейс, который наследуется от '''zope.container.interfaces.IContained'''.

{{{#!highlight python
from zope.schema import Field
from zope.container.interfaces import IContained
from zope.container.constraints import ContainerTypesConstraint

class ITicketContained(IContained):
    """Interface that specifies the type of objects that can contain
    tickets. So a ticket can only contain in a collector."""

    _ _parent_ _ = Field(
        constraint = ContainerTypesConstraint(ICollector))
}}}

Тут вы добавили ограничение на поле '''_ _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""
}}}

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

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

{{{#!highlight xml
<interface
   interface="tc.collector.interfaces.ITicket"
   type="zope.app.content.interfaces.IContentType"
   />

<class class="tc.collector.ticket.Ticket">
  <implements
     interface="zope.annotation.interfaces.IAttributeAnnotatable"
     />
  <implements
     interface="zope.container.interfaces.IContentContainer"
     />
  <require
     permission="zope.Public"
     interface="tc.collector.interfaces.ITicket"
     />
  <require
     permission="zope.Public"
     set_schema="tc.collector.interfaces.ITicket"
     />
</class>
}}}

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

{{{#!highlight html
<html>
<head>
<title>Welcome to ticket collector</title>
</head>
<body>

Welcome to ticket collector! <br/> <br/>

<a href="@@add_ticket">Add Ticket</a>

</body>
</html>
}}}

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

{{{!#highlight python
from tc.collector.interfaces import ITicket

from tc.collector.ticket import Ticket

class AddTicket(form.AddForm):

    form_fields = form.Fields(ITicket)

    def createAndAdd(self, data):
        number = data['number']
        summary = data['summary']
        ticket = Ticket()
        ticket.number = number
        ticket.summary = summary
        self.context[number] = ticket
        self.request.response.redirect('.')
}}}

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

{{{#!highlight xml
<browser:page
   for="tc.collector.interfaces.ICollector"
   name="add_ticket"
   permission="zope.Public"
   class="tc.collector.views.AddTicket"
   />
}}}

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

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

{{{#!highlight bash
jack@computer:/projects/ticketcollector$ ./bin/paster shell debug.ini
...
Welcome to the interactive debug prompt.
The 'root' variable contains the ZODB root folder.
The 'app' variable contains the Debugger, 'app.publish(path)' simulates a request.
>>> root['mycollector']
<tc.collector.ticketcollector.Collector object at 0xa5fc96c>
>>> root['mycollector']['1']
<tc.collector.ticket.Ticket object at 0xa5ffecc>
}}}


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

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

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

{{{!#highlight python from tc.collector.interfaces import ITicket

from tc.collector.ticket import Ticket

class AddTicket(form.AddForm):

  • form_fields = form.Fields(ITicket) def createAndAdd(self, data):
    • number = data['number'] summary = data['summary'] ticket = Ticket() ticket.number = number ticket.summary = summary self.context[number] = ticket 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>

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

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

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