воскресенье, 19 декабря 2010 г.

paster и buildout

Инстанс Plone 3.3.5, установленный через buildout включает в себя команду "bin/paster" для создания расширений Plone.
Например, создание новой темы:
bin/zopeskel plone3_theme plonetheme.mythemeid

Создание пакета на основе Archetypes:
bin/zopeskel archetype mycompanyid.content
Более подробно:
http://collective-docs.plone.org/tutorials/paste.html

пятница, 17 декабря 2010 г.

Проверка полей формы

Для каждого поля схемы Archetypes может быть установлен набор валидаторов - обработчиков, отслеживающих  соответствие вводимых данных определенным критериям. Валидатор указывается  атрибутом validators в поле схемы
StringField('email',
                 required = 1,
                 validators = ('isEmail'),
              ),
Валидаторов   может быть несколько:
validators = ('isMaxSize', 'isTidyHtmlWithCleanup',)
 
Если значение, вводимое в поле не удовлетворяет условию валидации, в форму будет выведено сообщение об ошибке. О  существующих валидаторах и самостоятельном их создании смотри:
http://plone.org/documentation/manual/developer-manual/archetypes/fields/validator-reference 
http://www.pererikstrandberg.se/blog/index.cgi?page=PloneArchetypesFieldValidator 
 


 
 

Plone и Java Scripts

В Plone имеется набор Java Scripts, которые можно эффективно использовать в шаблонах.  Об их возможностях читать http://www.sixfeetup.com/blog/2009/7/31/utilize-available-javascript-in-plone-without-knowing-javascript

четверг, 16 декабря 2010 г.

Вкладки на форме контент-типа

Для добавления вкладки в базовый вид контент-типа достаточно в модели класса добавить метод и определить у него стереотпы, как на рисунке. При генерации Archgenxml  выдает сообщение "WARNING Deprecated usage of stereotype view or form!", но вкладку регистрирует.
Добавление вкладки можно сделать  вручную, добавив запись в файл имя_типа.xml в папке profiles/defaults/types.

Для модели на рисунке в файле Discipline.xml добавлена запись:

<action title="addTemsFromList" i18n:attributes="title" action_id="addTems" category="object" condition_expr="python:1" url_expr="string:${object_url}/addTems" visible="True">
  <permission value="View" />
  action>

виды и classic portlet

Вопрос: как подключить вид из нашего продукта в classic portlet?
Ответ: никак, classic  portlet предназначен для отображения кода HTML и использования Java Scripts.
Частично задачу представления вида в портлете можно решить установкой collective.portlet.tal, который позволяет вставлять код с инструкциями tal:
http://www.packtpub.com/article/creating-new-types-of-plone-portlets). 
Лучше создавать  специализированный портлет:
http://www.martinaspeli.net/articles/an-introduction-to-plone-portlets
https://www.packtpub.com/article/creating-customizing-assigning-portlets-automatically-for-plone-3.3 

Список групп пользователя

 Скрипт для получения списка групп, в которых зарегистрирован текущий пользователь.
request = container.REQUEST
RESPONSE =  request.RESPONSE
from Products.CMFCore.utils import getToolByName
membership_tool = getToolByName(context, 'portal_membership')
user=membership_tool.getAuthenticatedMember()
groups=user.getGroups()
for group in groups:
     print groups
return printed
Соответствующим образом меняя значение user можно получить подобный результат для всех пользователей.
Обращаю внимание, что проверять скрипт нужно под учетной записью, зарегистированной в Plone.

пятница, 10 декабря 2010 г.

Перенос скрипта Python в вид

В классе вида создайте метод и перенесите  туда код скрипта.
Создайте в классе вида  конструктор:
    def __init__(self, context, request):
        self.context=context
        self.request=request
  Во всех методах  для доступа к context и request  используйте self.context и   self.request соответственно.
Если нужно перенести скрипт, обрбатывающий форму, то создайте в классе метод __call__ и разместите код обработки там.
Вызов всех методов из шаблона производится как python:view.имя_метода(список параметров) или view/имя_метода.
В шаблоне формы  имя обработчика может быть установлено универсальным способомЖ
<form method="get"
tal:attributes="action string:${context/absolute_url}/${view/__name__}">
Пример разработки формы реализован в продукте CustomContent. размещенном на учебном сервере.

Получение списка пользователей

http://plone.org/documentation/manual/plone-community-developer-documentation/members/member-basics

вторник, 7 декабря 2010 г.

Отображение полей типа ImageField

Для того, чтобы поле типа ImageField отображалось в формах редактирования и просмотра объекта, нужно установить следующие  именованные значения для этого поля в UML-модели:
storage        AttributeStorage()
original_size  python:(600,600)
sizes            python:{'small':(100,100),'medium':(200,200),'large':(600,600)},

Атрибут original_size определяет  размер, в который будет преобразовано  исходное  изображение, если его размер превышает 'large'. 


Замечание к использованию Archgenxml

При разработке модели и генерации продукта Plone с помощью Archgenxml следите за одинаковым  именованием  модели в ArgoUML, файла хранении модели и папки генерируемого продукта. Эти имена  чуствительны к регистру и  нарушениие правила сквозного именования  может  привести к трудно определяемой ошибке.

Использование buildout

После установки Plone все задачи по изменению конфигурации и установка новых продуктов выполняются  через изменение  соответствующих записей в buildout.cfg и последующем выполнении команды bin\buildout -v.  Указание ключа -v позволяет просматривать лог выполнения в консоле.
Для возможности отладки установите в соответствующей строчке buildout.cfg значение debug-mode = off на debug-mode = on.
Запуск сервера:
 в отладочном режиме bin\instance fg
 в обычном режиме bin\instance start
Остановка сервера: bin\instance stop
Перезапуск сервера: bin\instance restart
Все команды набираются в консоле из корневой папки инстанса . Так, если Plone установлен в C:\Plone 3.3.5, то запуск производится именно из этой папки.
Для любителей мышки: не запускайте buildout.exe  и  instance.exe мышкой из окна "проводника" или каким-либо другим способом - консоль ваш друг, в крайнем случае - опция "Выполнить" из меню "Пуск".

среда, 1 декабря 2010 г.

Наследование от архетипов

Создать наследуемый от архетипов класс можно двумя способами.

1. Классический
 Создаем класс ATNewsItem со стереотипами archetype и stub и наследуем от него.
Устанавливаем величину именованнго значения import_from, присвоив значение Products.ATContentTypes.content.newsitem, что указывает на модуль с классом -архетипом. На этм все. Способ устаревший, но иногда (когда не срабатывает способ 2) используется.
2. Для Plone 3
Создаем свой класс и  устанавливаем ему стереотип соответствующий нужному архетипу, в данном примере atnewsitem.    

четверг, 18 ноября 2010 г.

Система обеспечения учебного процесса

Сегодня докладывал на Ученом совете института о разработанной мною системе поддержки учебного процесса на основе CMS Plone для кафедры информационных технологий. Только докладывая осознал, как много уже сделано. Курьез заключался в том, что предыдущий докладчик рассказывал о такой же системе, разрабатываемой  нашим ВЦ для всего института. Оказалось, что ситемы сравнимы.

четверг, 28 октября 2010 г.

Установка Faculty/Staff Directory

В результате стандартной установки Faculty/Staff Directory (buildout ->
Дополнительные продукты) возникала ошибка при связывании пользователя
 с группами. Решение, найденное в Интернете http://www.uwosh.edu/ploneprojects/documentation/how-tos/how-to-fix-the-ploneformgen-install-problem-on-plone-3.0.1-3.0.2:
1.  Деинсталируем Faculty/Staff Directory и Relation в "Дополнительные продукты"
2.  В "Правилах контента" снимаем флажок "Установить глобально"
3. Возвращаем продукты на место
4. Снова устанавливаем флажок.
Все работает. Правда уже надоели эти танцы с бубном. Простого человеческого счастья хочется

пятница, 4 июня 2010 г.

Рекомендации по локализации продукта Plone.

Рекомендации по локализации. Объяснение несколько усложнено.
1. Локализация продукта
Для локализации необходимо установить пакет i18ndude. При полной установке Archgenxml он устанавливается автоматически. Проверить наличие i18ndude.exe в Python24\Scripts.
При генерации продукта Archgenxml собирает все ссылки на записи, которые нужно локализовать в файл generated.pot в каталоге i18n продукта. Все преобразования производятся в папке locales продукта, поэтому, если ее нет - ее нада ее создать.
Дополнительно в папке locales создаем папку ru, а в ней папку LC_MESSAGES.
Сoздать в директории locales пустой текстовый файл c именем имя_продукта.pot в кодировке "UTF-8 без BOM" (я для этого использую Notepad++) и скопировать в него содержимое файла generated.pot. Можно просто скопировать и переименовать этот файл, а потом изменить у него кодировку в Notepad++.
Аналогичным образом создать в папке locales\ru\LC_MESSAGES файл с именем имя_продукта-ru.po.
Важно: если имя продукта с заглавной буквы, то и имена файлов - тоже.
В файле имя_продукта-ru.po строки :
"Language-Code: en\n"
"Language-Name: English\n"
"Preferred-Encodings: utf-8 latin1\n"
"Domain: DOMAIN\n"

заменить на:

"Language-Code: ru\n"
"Language-Name: Русский\n"
"Preferred-Encodings: utf-8\n"
"Domain: plone\n"

В строках вида
msgid "########"
msgstr ""
Вставить нуждый перевод в поле: msgstr "здесь перевод"
После преобразования скопировать файл имя_продукта-ru.po в папку i18n.
Перезапустить Plone, иногда нужно переустановить продукт.
Файл имя_продукта.pot на данном этапе не исползуется. Он будет необходим при подключении для перевода дополнительных шаблонов, которые созданы вручную, а не указаны в модели.

2. Локализация интерфейса Plone - например метку продукта в меню "Добавить новый элемент"
Выполнить внутри каталога продукта команду c:\Python24\Scripts\i18ndude sync --pot locales/plone.pot.
Выполнить внутри каталога продукта команду c:\Python24\Scripts\i18ndude rebuild-pot --pot locales/plone.pot --create plone profiles.
В результате в каталоге locales будет создан файл plone.pot, где будут собраны все ссылки на поля локализации, связанные с главным интерфейсом Plone.
Сoздать в директории i18n пустой текстовый файл имя_продукта-plone-ru.po в кодировке "UTF-8 без BOM".
Выполнить внутри каталога продукта команду c:\Python24\Scripts\i18ndude sync --pot locales/plone.pot i18n/имя_продукта-plone-ru.po
В результате в каталоге i18n будет создан файл имя_продукта-plone-ru.po с соответствующими полями.
В файле имя_продукта-plone-ru.po строки :
"Language-Code: en\n"
"Language-Name: English\n"
"Preferred-Encodings: utf-8 latin1\n"
"Domain: DOMAIN\n"

заменить на:

"Language-Code: ru\n"
"Language-Name: Русский\n"
"Preferred-Encodings: utf-8\n"
"Domain: plone\n"

В строках вида
msgid "########"
msgstr ""
Вставить нуждый перевод в поле: msgstr "здесь перевод"

Пока все. Есть еще возможности для перевода строковых величин, объявляемых в репеменных, списках и т.п.

вторник, 25 мая 2010 г.

Установка Archgenxml в Windows

1. Скачиваем http://www.python.org/ftp/python/2.4.4/python-2.4.4.msi и устанавливаем Python2.4.4.
2. Скачиваем файл ez_setup.py
3. Помещаем этот файл в C:\Python24 и запускаем python ez_setup.py. Этот скрипт установит пакет setuptools.После этого в Python24\Scripts должен появиться файл easy_instal.exe. Во все время выполнения должен быть обеспечен доступ в интернет.
4. Из папки С:\Python24\Scripts запускаем easy_install.exe archgenxml
и ждем, пока через Интернет будет устанавливаться Archgenxml и все дополнительные пакеты. После установки в C:\Python24\Scripts должен появиться файл archgenxml.exe, его и надо будет использовать для генерации продуктов из модели.
5. В Python24 найдите файл ArchGenXMLprofile.xmi - это профиль для генерации продукта.
6. Создаем папку для хранения профиля profiles (например C:\profiles) и помещаем ArchGenXMLprofile.xmi туда.
7. Создаем файл с именем .agx_zope_path и содержимым:
C:\Plone3\Zope\lib\python
8. Этот файл помещаем в свою личную папку - C:\Documents and Settings\имя пользователя\ При необходимости в этом файле скорректируйте путь в соответствии с Вашей инсталяции Plone.
9. Для удобства в папке C:\Plone3\Data\Products создаем файл generate.bat c содержимым:
C:\Pythin24\Scripts\archgenxml.exe --profile-dir=C:\profiles %1.zargo -o 1%
В файле generate.bat должны быть указаны пути, указывающие на реальное положение archgenxml.exe и папки с ArchGenXMLprofile.xmi
10. Помещаем файл модели тоже в C:\Plone3\Data\Products.
Генерация продукта производится вызовом generate.bat модель.zargo, где модель - имя файла модели. При удачной генерации в папке Products появится папка с именем Вашей модели.

воскресенье, 16 мая 2010 г.

Получение значения поля объекта

Вопрос:Во всех шаблонах, встроенных в Plone используется работа с полями. Как получить значение по полю, зная имя поля? Нужно ли для этого обращаться к самому созданному объекту?

Ответ:
К полю можно обратиться и отобразить его в шаблоне можно несколькими способами, это зависит от задачи.
Если нужно отобразить поле с его виджетом, определенным в схеме, то
<metal:field use-macro="python:here.widget('title', mode='view')"> Title </metal:field> отображает виджет со значением поля как в форм просмотра,
<metal:field use-macro="python:here.widget('title', mode='edit')"> Title </metal:field> отображает виджет со значением поля как в форме редактирования
Получение значения поля в шаблоне:
<tal:entry tal:repeat="item folderContents">
 <tal:block tal:define="item_url item/getURL|item/absolute_url;
      item_id item/getId|item/id;
      item_title_or_id item/pretty_title_or_id;
      item_description item/Description;
      item_type item/portal_type;
      item_type_title item/Type;
      item_modified item/ModificationDate;
      item_created item/CreationDate;
      item_icon python:plone_view.getIcon(item);
      item_type_class python:'contenttype-' + normalizeString(item_type);
      item_wf_state item/review_state|python: wtool.getInfoFor(item, review_state', '');
      item_wf_state_class python:'state-' + normalizeString(item_wf_state);
      item_creator item/Creator;
      item_start item/start/ISO|item/StartDate|nothing;
      item_end item/end/ISO|item/EndDate|nothing;
      obj python:item.getObject();
      ">
..............
</tal:block>
</tal:entry>
В этом примере различные формы получения значений.
obj python:item.getObject(); - получение самого объекта.
К объекту обращаться нужно всегда, просто часто это делается неявно. В шаблоне и классе шаблона мы обращаемся к объекту как context. Если используется предварительная обработка в классе шаблона, то обращение к классу шаблона происходит через view:
tal:content="view/myprop",
tal:content="python:view.myMethod()"
В классе (и в шаблоне тоже) можно получить значение поля объекта:
context.getTitle(), в общем случае context/getИмя_поля_с_заглавной буквы(): context.getMyprop() - это получение значения через accessor. Accessor - автоматически создаваемый метод доступа к полю (аналог get метода в С++)
context используем в шаблоне и в классе шаблона. В классе конитент-типа используем self.
Общий способ получения значения поля:
password= self.getField('password').get(self).
Используется при переопределении accessor. Так при создании класса генерируется метод getPassword(), но его можно переопределить:
class myClass():
......
security.declarePublic('getPassword') # объявление режима доступа к методу
def getPassword(self):
mypass=self.getField('password').get(self)
..... # что-то делаем
return mypassword

вторник, 23 февраля 2010 г.

Вебинар об использовании Plone для электронного обучения

22 февраля провел вебинар для участников сообщества e-Learning PRO (http://elearningrus.ning.com). На мой взгляд слушатели проявили большой интерес. Добавил тему форума для обсуждения:
http://elearningrus.ning.com/forum/topics/ispolzovanie-cms-plone-dlya. Неожиданно для себя становлюсь популяризатором Plone.

вторник, 9 февраля 2010 г.

Получение списка тегированных значений

Для получения полного списка тегированных значений достаточно запустить на выполнение программу bin/agx_taggedvalues из папки Archgenxml и перенаправить вывод в файл, например так:
agx_taggedvalues>val.txt

Лабиринт и разработка игр

 Лабиринт Алгоритм поиска пути в лабиринте и его реализация на Python 3.4 Задача на создание программы для виртуального робота, способно...