本文整理汇总了Python中plone.event.interfaces.IEventAccessor.subjects方法的典型用法代码示例。如果您正苦于以下问题:Python IEventAccessor.subjects方法的具体用法?Python IEventAccessor.subjects怎么用?Python IEventAccessor.subjects使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类plone.event.interfaces.IEventAccessor
的用法示例。
在下文中一共展示了IEventAccessor.subjects方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: ical_import
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
#.........这里部分代码省略.........
duration = _get_prop('DURATION', item)
if duration:
end = start + duration
# else: whole day or open end
timezone = getattr(getattr(start, 'tzinfo', None), 'zone', None) or\
base.default_timezone(container)
whole_day = False
open_end = False
if is_date(start) and (is_date(end) or end is None):
# All day / whole day events
# End must be same type as start (RFC5545, 3.8.2.2)
whole_day = True
if end is None:
end = start
if start < end:
# RFC5545 doesn't define clearly, if all day events should have
# a end date one day after the start day at 0:00.
# Internally, we handle all day events with start=0:00,
# end=:23:59:59, so we substract one day here.
end = end - datetime.timedelta(days=1)
start = base.dt_start_of_day(date_to_datetime(start))
end = base.dt_end_of_day(date_to_datetime(end))
elif is_datetime(start) and end is None:
# Open end event, see RFC 5545, 3.6.1
open_end = True
end = base.dt_end_of_day(date_to_datetime(start))
assert(is_datetime(start))
assert(is_datetime(end))
title = _get_prop('SUMMARY', item)
description = _get_prop('DESCRIPTION', item)
location = _get_prop('LOCATION', item)
url = _get_prop('URL', item)
rrule = _get_prop('RRULE', item)
rrule = rrule and 'RRULE:%s' % rrule.to_ical() or ''
rdates = _from_list(item, 'RDATE')
exdates = _from_list(item, 'EXDATE')
rrule = '\n'.join([it for it in [rrule, rdates, exdates] if it])
# TODO: attendee-lists are not decoded properly and contain only
# vCalAddress values
attendees = _get_prop('ATTENDEE', item)
contact = _get_prop('CONTACT', item)
categories = _get_prop('CATEGORIES', item)
if hasattr(categories, '__iter__'):
categories = [safe_unicode(it) for it in categories]
## for sync
#created = _get_prop('CREATED', item)
#modified = _get_prop('LAST-MODIFIED', item)
# TODO: better use plone.api, from which some of the code here is
# copied
content_id = str(random.randint(0, 99999999))
# TODO: if AT had the same attrs like IDXEventBase, we could set
# everything within this invokeFactory call.
container.invokeFactory(event_type,
id=content_id,
title=title,
description=description)
content = container[content_id]
event = IEventAccessor(content)
event.start = start
event.end = end
event.timezone = timezone
event.whole_day = whole_day
event.open_end = open_end
event.location = location
event.event_url = url
event.recurrence = rrule
event.attendees = attendees
event.contact_name = contact
event.subjects = categories
notify(ObjectModifiedEvent(content))
# Archetypes specific code
if getattr(content, 'processForm', False):
# Will finish Archetypes content item creation process,
# rename-after-creation and such
content.processForm()
if content_id in container:
# Rename with new id from title, if processForm didn't do it.
chooser = INameChooser(container)
new_id = chooser.chooseName(title, content)
transaction.savepoint(optimistic=True) # Commit before renaming
content.aq_parent.manage_renameObject(content_id, new_id)
else:
transaction.savepoint(optimistic=True)
count += 1
return {'count': count}
示例2: ical_import
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
#.........这里部分代码省略.........
location = _get_prop('LOCATION', item)
url = _get_prop('URL', item)
rrule = _get_prop('RRULE', item)
rrule = rrule and 'RRULE:%s' % rrule.to_ical() or ''
rdates = _from_list(item, 'RDATE')
exdates = _from_list(item, 'EXDATE')
rrule = '\n'.join([it for it in [rrule, rdates, exdates] if it])
# TODO: attendee-lists are not decoded properly and contain only
# vCalAddress values
attendees = item.get('ATTENDEE', ())
contact = _get_prop('CONTACT', item)
categories = item.get('CATEGORIES', ())
if hasattr(categories, '__iter__'):
categories = [safe_unicode(it) for it in categories]
ext_modified = utc(_get_prop('LAST-MODIFIED', item))
# TODO: better use plone.api for content creation, from which some of
# the code here is copied
content = None
new_content_id = None
existing_event = None
sync_uid = _get_prop('UID', item)
if sync_strategy != base.SYNC_NONE and sync_uid:
existing_event = _get_by_sync_uid(sync_uid)
if existing_event:
if sync_strategy == base.SYNC_KEEP_MINE:
# On conflict, keep mine
continue
exist_event = existing_event[0].getObject()
acc = IEventAccessor(exist_event)
if sync_strategy == base.SYNC_KEEP_NEWER and\
(not ext_modified or acc.last_modified >= ext_modified):
# Update only, if newer, if ext_modified exists
continue
# Else: update
content = exist_event
else:
# TODO: if AT had the same attrs like IDXEventBase, we could set
# everything within this invokeFactory call.
new_content_id = str(random.randint(0, 99999999))
container.invokeFactory(event_type,
id=new_content_id,
title=title,
description=description)
content = container[new_content_id]
assert(content) # At this point, a content must be available.
event = IEventAccessor(content)
event.title = title
event.description = description
event.start = start
event.end = end
event.timezone = timezone
event.whole_day = whole_day
event.open_end = open_end
event.location = location
event.event_url = url
event.recurrence = rrule
event.attendees = attendees
event.contact_name = contact
event.subjects = categories
if sync_strategy != base.SYNC_NONE:
# Don't import the sync_uid, if no sync strategy is chosen. Let the
# sync_uid be autogenerated then.
event.sync_uid = sync_uid
notify(ObjectModifiedEvent(content))
# Archetypes specific code
if getattr(content, 'processForm', False):
# Will finish Archetypes content item creation process,
# rename-after-creation and such
content.processForm()
# Use commits instead of savepoints to avoid "FileStorageError:
# description too long" on large imports.
transaction.get().commit() # Commit before rename
if new_content_id and new_content_id in container:
# Rename with new id from title, if processForm didn't do it.
chooser = INameChooser(container)
new_id = chooser.chooseName(title, content)
content.aq_parent.manage_renameObject(new_content_id, new_id)
# Do this at the end, otherwise it's overwritten
if ext_modified:
event.last_modified = ext_modified
count += 1
return {'count': count}
示例3: ical_import
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
def ical_import(container, ics_resource, event_type):
cal = icalendar.Calendar.from_ical(ics_resource)
events = cal.walk('VEVENT')
def _get_prop(prop, item):
ret = None
if prop in item:
ret = safe_unicode(item.decoded(prop))
return ret
count = 0
for item in events:
start = _get_prop('DTSTART', item)
end = _get_prop('DTEND', item)
if not end:
duration = _get_prop('DURATION', item)
if duration:
end = start + duration
# else: whole day or open end
timezone = getattr(getattr(start, 'tzinfo', None), 'zone', None) or\
base.default_timezone(container)
whole_day = False
open_end = False
if is_date(start) and (is_date(end) or end is None):
# All day / whole day events
# End must be same type as start (RFC5545, 3.8.2.2)
whole_day = True
if end is None: end = start
if start < end:
# RFC5545 doesn't define clearly, if all day events should have
# a end date one day after the start day at 0:00.
# Internally, we handle all day events with start=0:00,
# end=:23:59:59, so we substract one day here.
end = end - datetime.timedelta(days=1)
start = base.dt_start_of_day(date_to_datetime(start))
end = base.dt_end_of_day(date_to_datetime(end))
elif is_datetime(start) and end is None:
# Open end event, see RFC 5545, 3.6.1
open_end = True
end = base.dt_end_of_day(date_to_datetime(start))
assert(is_datetime(start))
assert(is_datetime(end))
title = _get_prop('SUMMARY', item)
description = _get_prop('DESCRIPTION', item)
location = _get_prop('LOCATION', item)
url = _get_prop('URL', item)
rrule = _get_prop('RRULE', item)
rrule = rrule and 'RRULE:%s' % rrule.to_ical() or ''
rdate = _get_prop('RDATE', item)
rrule = rdate and '%s\nRDATE:%s' % (rrule, rdate.to_ical()) or ''
exdate = _get_prop('EXDATE', item)
rrule = exdate and '%s\nEXDATE:%s' % (rrule, exdate.to_ical()) or ''
attendees = _get_prop('ATTENDEE', item)
contact = _get_prop('CONTACT', item)
categories = _get_prop('CATEGORIES', item)
if hasattr(categories, '__iter__'):
categories = [safe_unicode(it) for it in categories]
# for sync
created = _get_prop('CREATED', item)
modified = _get_prop('LAST-MODIFIED', item)
# TODO: better use plone.api, from which some of the code here is
# copied
content_id = str(random.randint(0, 99999999))
# TODO: if AT had the same attrs like IDXEventBase, we could set
# everything within this invokeFactory call.
container.invokeFactory(event_type,
id=content_id,
title=title,
description=description)
content = container[content_id]
event = IEventAccessor(content)
event.start = start
event.end = end
event.timezone = timezone
event.whole_day = whole_day
event.open_end = open_end
event.location = location
event.event_url = url
event.recurrence = rrule
event.attendees = attendees
event.contact_name = contact
event.subjects = categories
notify(ObjectModifiedEvent(content))
# Archetypes specific code
if getattr(content, 'processForm', False):
# Will finish Archetypes content item creation process,
# rename-after-creation and such
content.processForm()
#.........这里部分代码省略.........
示例4: test_event_accessor
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
def test_event_accessor(self):
utc = pytz.utc
vienna = pytz.timezone('Europe/Vienna')
self.portal.invokeFactory('Event', 'event1',
description='a description',
startDate=datetime(2011, 11, 11, 11, 0, tzinfo=utc),
endDate=datetime(2011, 11, 11, 12, 0, tzinfo=utc),
timezone='UTC',
wholeDay=False)
e1 = self.portal['event1']
acc = IEventAccessor(e1)
# TEST DATES
self.assertEqual(acc.start, datetime(2011, 11, 11, 11, 0, tzinfo=utc))
self.assertEqual(acc.end, datetime(2011, 11, 11, 12, 0, tzinfo=utc))
acc.start = datetime(2011, 11, 13, 9, 0) # tzinfo does not matter,
acc.end = datetime(2011, 11, 13, 10, 0) # it's set by subscription
# adapter
# If using EventAccessor's edit method, calling notify isn't needed
acc.edit(timezone=u'Europe/Vienna')
# accessor should return start/end datetimes in the event's timezone
self.assertEqual(
acc.start,
datetime(2011, 11, 13, 9, 0, tzinfo=vienna))
self.assertEqual(
acc.end,
datetime(2011, 11, 13, 10, 0, tzinfo=vienna))
# start/end dates are stored in UTC zone on the context, but converted
# to event's timezone via the attribute getter.
self.assertEqual(
e1.end(),
DateTime('2011/11/13 10:00:00 Europe/Vienna')
)
# timezone should be the same on the event object and accessor
self.assertEqual(e1.getTimezone(), acc.timezone)
# Open End Test
acc.edit(open_end=True)
self.assertEqual(
acc.start,
datetime(2011, 11, 13, 9, 0, tzinfo=vienna))
self.assertEqual(
acc.end,
datetime(2011, 11, 13, 23, 59, 59, tzinfo=vienna))
# Whole Day Test
acc.edit(whole_day=True, open_end=False)
self.assertEqual(
acc.start,
datetime(2011, 11, 13, 0, 0, tzinfo=vienna))
self.assertEqual(
acc.end,
datetime(2011, 11, 13, 23, 59, 59, tzinfo=vienna))
# TEST DESCRIPTION
self.assertTrue(acc.description == 'a description')
acc.description = 'another desc'
self.assertTrue(acc.description == 'another desc')
# TEST OTHER PROPERTIES
acc.title = u"An Event"
acc.recurrence = u'RRULE:FREQ=DAILY;COUNT=5'
acc.location = u"Home"
acc.attendees = [u'me', u'you']
acc.contact_name = u"Max Mustermann"
acc.contact_email = u"[email protected]"
acc.contact_phone = u"+1234567890"
acc.event_url = u"http://plone.org/"
acc.subjects = [u"tag1", u"tag2"]
acc.text = u"body text with <b>html</b> formating."
# If not using EventAccessor's edit method, call notify manually
notify(ObjectModifiedEvent(acc.context))
self.assertEqual(acc.recurrence, u'RRULE:FREQ=DAILY;COUNT=5')
self.assertEqual(acc.location, u'Home')
self.assertEqual(acc.attendees, (u'me', u'you'))
self.assertEqual(acc.contact_name, u"Max Mustermann")
self.assertEqual(acc.contact_email, u'[email protected]')
self.assertEqual(acc.contact_phone, u"+1234567890")
self.assertEqual(acc.event_url, u"http://plone.org/")
self.assertEqual(acc.subjects, (u"tag1", u"tag2"))
self.assertEqual(acc.text, u"body text with <b>html</b> formating.")
# CLEANUP
self.portal.manage_delObjects(['event1'])
示例5: setUp
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
def setUp(self):
self.request = self.layer['request']
portal = self.layer['portal']
setRoles(portal, TEST_USER_ID, ['Manager'])
set_browserlayer(self.request)
portal.invokeFactory('Folder',
id='events', title=u"Events",
Description=u"The portal's Events")
portal.events.invokeFactory('Event',
id='ploneconf2007', title='Plone Conf 2007',
startDate='2007/10/10', endDate='2007/10/12',
location='Naples',
eventUrl='http://plone.org/events/conferences/2007-naples',
attendees=['anne','bob','cesar'])
portal.events.invokeFactory('Event',
id='ploneconf2008', title='Plone Conf 2008',
startDate='2008/10/08', endDate='2008/10/10', location='DC',
recurrence=u'RRULE:FREQ=DAILY;COUNT=5\r\nEXDATE:20081011T000000,20081012T000000\r\nRDATE:20081007T000000',
eventUrl='http://plone.org/events/conferences/2008-washington-dc')
portal.events.invokeFactory('plone.app.event.dx.event',
id='ploneconf2012', title='Plone Conf 2012',
recurrence=u'RRULE:FREQ=DAILY;COUNT=5\r\nEXDATE:20121013T000000,20121014T000000\r\nRDATE:20121009T000000',
start=datetime(2012,10,10,8,0),
end=datetime(2012,10,10,18,0),
timezone='Europe/Amsterdam')
pc12 = IEventAccessor(portal.events.ploneconf2012)
pc12.location = 'Arnhem'
pc12.contact_name = 'Four Digits'
pc12.contact_email = '[email protected]'
pc12.contact_phone = '+123456789'
pc12.event_url = 'http://ploneconf.org'
pc12.subjects = ['plone', 'conference',]
notify(ObjectModifiedEvent(portal.events.ploneconf2012))
portal.events.invokeFactory('plone.app.event.dx.event',
id='artsprint2013', title='Artsprint 2013',
start=datetime(2013,2,18),
end=datetime(2013,2,22),
whole_day=True,
timezone='Europe/Vienna')
# Standard Time
portal.events.invokeFactory('plone.app.event.dx.event',
id='standardtime', title='Standard Time',
start=datetime(2013,12,24,12,0),
end=datetime(2013,12,29,12,0),
open_end=True,
timezone='Europe/Vienna'
)
portal.invokeFactory("Collection",
"collection",
title="New Collection",
sort_on='start')
portal['collection'].setQuery([{
'i': 'Type',
'o': 'plone.app.querystring.operation.string.is',
'v': 'Event',
}, ])
self.portal = portal
示例6: ical_import
# 需要导入模块: from plone.event.interfaces import IEventAccessor [as 别名]
# 或者: from plone.event.interfaces.IEventAccessor import subjects [as 别名]
#.........这里部分代码省略.........
title = _get_prop('SUMMARY', item)
description = _get_prop('DESCRIPTION', item)
location = _get_prop('LOCATION', item)
url = _get_prop('URL', item)
rrule = _get_prop('RRULE', item)
rrule = rrule.to_ical() if rrule else ''
if rrule:
if six.PY3 and isinstance(rrule, six.binary_type):
rrule = rrule.decode('utf8')
rrule = 'RRULE:%s' % rrule
rdates = _from_list(item, 'RDATE')
exdates = _from_list(item, 'EXDATE')
rrule = '\n'.join([it for it in [rrule, rdates, exdates] if it])
# TODO: attendee-lists are not decoded properly and contain only
# vCalAddress values
attendees = item.get('ATTENDEE', ())
contact = _get_prop('CONTACT', item)
categories = item.get('CATEGORIES', ())
if getattr(categories, '__iter__', False):
categories = tuple([safe_unicode(it) for it in categories])
ext_modified = utc(_get_prop('LAST-MODIFIED', item))
content = None
new_content_id = None
existing_event = None
sync_uid = _get_prop('UID', item)
if sync_uid and sync_strategy is not base.SYNC_NONE:
existing_event = _get_by_sync_uid(sync_uid)
if existing_event:
if sync_strategy == base.SYNC_KEEP_MINE:
# On conflict, keep mine
continue
exist_event = existing_event[0].getObject()
acc = IEventAccessor(exist_event)
if sync_strategy == base.SYNC_KEEP_NEWER and\
(not ext_modified or acc.last_modified > ext_modified):
# Update only if modified date was passed in and it is not
# older than the current modified date. The client is not
# expected to update the "last-modified" property, it is the
# job of the server (calendar store) to keep it up to date.
# This makes sure the client did the change on an up-to-date
# version of the object. See
# http://tools.ietf.org/search/rfc5545#section-3.8.7.3
continue
# Else: update
content = exist_event
else:
new_content_id = str(random.randint(0, 99999999))
container.invokeFactory(event_type,
id=new_content_id,
title=title,
description=description)
content = container[new_content_id]
assert(content) # At this point, a content must be available.
event = IEventAccessor(content)
event.title = title
event.description = description
event.start = start
event.end = end
event.whole_day = whole_day
event.open_end = open_end
event.location = location
event.event_url = url
event.recurrence = rrule
event.attendees = attendees
event.contact_name = contact
event.subjects = categories
if sync_uid and sync_strategy is not base.SYNC_NONE:
# Set the external sync_uid for sync strategies other than
# SYNC_NONE.
event.sync_uid = sync_uid
notify(ObjectModifiedEvent(content))
# Use commits instead of savepoints to avoid "FileStorageError:
# description too long" on large imports.
transaction.get().commit() # Commit before rename
if new_content_id and new_content_id in container:
# Rename with new id from title, if processForm didn't do it.
chooser = INameChooser(container)
new_id = chooser.chooseName(title, content)
content.aq_parent.manage_renameObject(new_content_id, new_id)
# Do this at the end, otherwise it's overwritten
if ext_modified:
event.last_modified = ext_modified
count += 1
return {'count': count}