Показаны сообщения с ярлыком Plone. Показать все сообщения
Показаны сообщения с ярлыком Plone. Показать все сообщения

среда, 27 марта 2013 г.

Создание файловой библиотеки

Файловая библиотека создается загрузкой файлов в выбранный фолдер Plone. Для этого находясь внутри фолдера нужно создать  новый объект типа "Файл", дать ему имя и указать файл для загрузки. Для обслуживания библиотеки нужно создать пользовательский интерфейс, частной задачей для которого будет операция поиска файла с указанным идентификатором. ля этого в ZMI в папке custom создайте объект типа Script(Python) c содержимым:
request=container.REQUEST
id_file=request['file_item']
files = context.portal_catalog.searchResults(portal_type = 'File', id=id_file)
file = files[0].getObject()
data = file.get_data()

Строка 2 скрипта: производится получение значения переменной с ключем file_item из объекта request.Предполагается, что эта переменная уже есть в REQUEST после вызова сответствующей формы или передачи параметра  через GET-запрос.
Строка 3 скрипта: производится получение выборки из portal_catalog по запросу поиска
Строка 4 скрипта: предполагаем что  файл с нужным идентификатором существует. В этом случае выборка, представляющая собой список ссылок на найденные объекты, будет содержать только один элемент. С помощью метода getObject() преобразуем ссылку в реальный объект, представляющий нужный файл в Plone.
Строка 5 скрипта: получаем содержимое файла.
Получение значений, записанных в файл, зависит от структуры записей. Как минимум, нужно разбить содержимое файла на строки, а затем получать данные из каждой строки. Способы решения этой задачи неоднократно обсуждались на занятиях.

вторник, 5 марта 2013 г.

Выполнение запросов к каталогам Plone

В связи с трудностями использования ключевого слова portal в последних версиях Plone рекомендуется использовать следующий вариант выполнения запросов к portal_catalog и другим каталогам:
from Products.CMFCore.utils import getToolByName
from zope.site.hooks import getSite

#получаем сайт как объект       
site = getSite()   


#получаем объект каталога
catalog = getToolByName(site, 'portal_catalog')

#выполняем запрос и  #преобразуем его результата в список объектов
result = [i.getObject() for i in catalog.searchResults({'portal_type': 'Folder'})]

воскресенье, 5 июня 2011 г.

Генерация темы и NameMapper

При генерации темы Plone  с использованием встроенного paster  появляется сообщение;
"You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames option as it is painfully slow with the Python version of NameMapper. You should get a copy of Cheetah with the compiled C version of NameMapper."
Для получить скомпилированную версию NameMapper можно с http://www.cheetahtemplate.org/download.html . Для Plone 3 нужен файл _namemapper.pyd2.4 . Переименоваваем его в _namemapper.pyd  и помещаем в папку Plone/Python.
Для Plone 4 нужно установить Cheetah в установленный в систему Python 2.6 (дистрибутив по указанному выше адресу) и скопировать соответствующий файл из папаки C:\Python26\Lib\site-packages\Cheetah.

пятница, 3 июня 2011 г.

Plone 4 и debug-mode

Иногда в  Windows при запуске Plone 4  в режиме отладки с помощью команды  bin\plonectl fg  появляется  сообщение "To run the program in the foreground, please stop it first. ", но посмотр служб показывает  что Zope Instance не запущен. Для решения  этой проблемы в папке Plone\var  нужно удалить файлы instance.pid и  instance.lock, которые появляются там в результате не корректной остановки сервера.

суббота, 28 мая 2011 г.

анонимный пользователь с ролью Manager

Иногда нужно чтобы анонимный пользователь мог выполнять 
действия с ролью Manager.
 В случае использования Python Scripts такая возможность 
реализуется  использованием proxy- роли. Для метода класса
вида это может быть выполнено следующим образом:
  
from AccessControl.SecurityManagement  
import newSecurityManager, noSecurityManager
...

user = self.context.getWrappedOwner()
newSecurityManager(self.request, user)

self.doProtectedMethod()

noSecurityManager()
 
В результате выполнения кода создается временный 
пользователь с правами администратора. Созание такого
пользователя внутри метода класса позволяет анонимному
пользователю (при наличии соответствующих 
методов и интерфейса доступа) действовать как
 администратор.

Использование MinGW для компиляции в Plone

Для использования MinGW в Plone необходимо в каталоге \python\Lib\distutils каталога Plone создать текстовый файл distutils.cfg со следующим содержимым:
 [build]
compiler=mingw32

пятница, 4 февраля 2011 г.

О использовании reference_catalog

 # Общая часть
from Products.PythonScripts.standard import html_quote
from Products.CMFCore.utils import getToolByName
request = container.REQUEST
RESPONSE =  request.RESPONSE
urltool = getToolByName(context, "portal_url")
portal = urltool.getPortalObject()
catalogtool = getToolByName(context, "portal_catalog")
lcurses = [i.getObject() for i in catalogtool.searchResults(portal_type = 'Tema')]
refCatalog = getToolByName(portal, 'reference_catalog')
uid_catalog=getToolByName(portal, 'uid_catalog')
#Пример 1
for item in lcurses:
    refs = refCatalog.getReferences(item, 'content_source')
    print item.title_or_id()+'********************'
    for i in refs:
        print i.targetUID, i.sourceUID, i.relationship
        print uid_catalog(UID=i.targetUID), uid_catalog(UID=i.sourceUID)
        a=[k.getObject().getId() for k in uid_catalog(UID=i.targetUID)][0]
        b=[k.getObject().getId() for k in uid_catalog(UID=i.sourceUID)][0]
        print a, b
    print "##############################"
#Пример 2
    for i in refs:
        print i.targetUID, i.sourceUID, i.relationship
        print refCatalog.lookupObject(i.targetUID), refCatalog.lookupObject(i.sourceUID)
        a=refCatalog.lookupObject(i.targetUID)
        b=refCatalog.lookupObject(i.sourceUID)
        print a.getId(), b.getId()

return printed

каталог 'reference_catalog' возвращает объекты со свойствами:
 sourceUID -UID объекта -источника  связи
 targetUID  -UID связанного объекта,
 relation - имя связи
метод getReferences(sourceUID, relation, targetUID) позволяет получать поднаборы связей,  настраивая параметры метода.
Поскольку возвращаться  будут UID объектов, то для получения Id нужно использовать или каталог 'uid_catalog' (1 пример), или сам каталог 'reference_catalog'(2 пример). В примере приведен код для объектов типа Thema и LearnObject, связанных между собой связью 'content_source'.
Если у объекта есть поле типа
    ReferenceField(
        name='source',
        widget=ReferenceBrowserWidget(
            label='Source',
            label_msgid='LearnCurse_label_source',
            i18n_domain='LearnCurse',
        ),
        allowed_types=('LearnObject','Document','File'),
        multiValued=1,
        relationship='content_source',
    ),
то список  связанных этим отношением объектов можно получить как self.getИмя_поля. В данном примере self.getSource() - если в классе, или context.getSource() в классе вида и в виде.

Еще ссылки

 О разработке видов к продуктам Plone
http://plone.org/documentation/manual/theme-reference/buildingblocks/skin/templates/how-to-customise-view-or-edit-on-archetypes-content-items/
http://plone.org/documentation/manual/theme-reference/buildingblocks/skin/templates/customizing-at-templates/referencemanual-all-pages
http://plone.org/documentation/manual/theme-reference/buildingblocks/skin/templates/getting-started
https://weblion.psu.edu/trac/weblion/wiki/ViewTemplates
http://plone.org/documentation/manual/developer-manual/archetypes/appendix-practicals/b-org-creating-content-types-the-plone-2.5-way/zope-3-views
http://plone.org/documentation/kb/customization-for-developers/tutorial-all-pages
http://www.pererikstrandberg.se/blog/index.cgi?page=PloneArchetypesViewTemplateModifications
http://plone.org/documentation/kb/where-is-what/tutorial-all-pages

Ссылки изучающим Plone

Некоторые полезные ссылки
Про TAL
http://plone.org.ru/docs/howto/ZPT
http://plone.org.ru/docs/howto/AdvancedZPT
http://wiki.zope.org/ZPT/TALSpecification14
http://wiki.zope.org/zope2/PageTemplates

Русскоязычные
http://plone.org.ru/books/pb/ru/
http://wiki.python.su/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8/TheDefinitiveGuideToPlone
http://62.152.35.6:15006/Plone
http://62.152.35.6:15006/Plone/docs/manual
http://python.su/
http://www.komtet.ru/info/plone

Общие руководства
http://learnplone.org/
http://plone.org/documentation/manual/plone-community-developer-documentation/
http://docs.zope.org/zope2/zope2book/index.html
http://docs.zope.org/zope2/zdgbook/index.html
http://plone.org/documentation/kb/manipulating-plone-objects-programmatically/tutorial-all-pages
https://weblion.psu.edu/trac/weblion/wiki

среда, 12 января 2011 г.

импорт из папки buildout-cache\eggs

Как из своего продукта подключить файлы из папки Plone\buildput-cache\eggs ?
 Все пакеты egg установленные через buildout или через setup  доступны по своим  именам.
from archetypes.schemaextender.field import ExtensionField - импорт класса из ядра archetypes.schemaextender в buildout-cache\eggs.
from Products.FacultyStaffDirectory.interfaces.person import IPerson  - импорт либо из ядра products.facultystaffdirectory.egg, либо из одноименного продукта расположенного в папке products. 
Вне зависимости от способа установки все пакеты и классы находятся в одном пространстве имен

Вопросы к экзамену по Web

Вопросы к экзамену по Web

воскресенье, 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

Всероссийский конкурс  научно-технологических проектов страница конкурса https://dm-centre.ru/sirius-konkurs-projectov Цель конкурс...