def __call__(self): title = safe_unicode(self.context.title_or_id()) mtool = getToolByName(self.context, 'portal_membership') self.request.response.setHeader("Content-type", "application/json") if not mtool.checkPermission('Copy or Move', self.context): message = PLMF(u'Permission denied to copy ${title}.', mapping={u'title': title}) status = 'error' raise json.dumps({ 'status': status, 'message': self.context.translate(message) }) parent = aq_parent(aq_inner(self.context)) try: cp = parent.manage_copyObjects(self.context.getId()) status = 'copied' except CopyError: status = 'error' message = PLMF(u'${title} is not copyable.', mapping={u'title': title}) return json.dumps({ 'status': status, 'message': parent.translate(message) }) message = PLMF(u'${title} copied.', mapping={u'title': title}) transaction_note('Copied object %s' % self.context.absolute_url()) contextId = 'UID_' + get_uid(self.context) return json.dumps({ 'status': status, 'message': self.context.translate(message), 'cp': cp, 'id': contextId })
def __call__(self): eventid = 'UID_' + get_uid(self.context) parent = self.context.aq_inner.aq_parent title = safe_unicode(self.context.title_or_id()) try: lock_info = self.context.restrictedTraverse('@@plone_lock_info') except AttributeError: lock_info = None if lock_info is not None and lock_info.is_locked(): status = 'locked' message = PLMF(u'${title} is locked and cannot be deleted.', mapping={u'title': title}) else: parent.manage_delObjects(self.context.getId()) status = 'ok' message = PLMF(u'${title} has been deleted.', mapping={u'title': title}) transaction_note('Deleted %s' % self.context.absolute_url()) self.request.response.setHeader("Content-type", "application/json") return json.dumps({ 'status': status, 'message': parent.translate(message), 'id': eventid })
def __call__(self): msg = PLMF(u'Copy or cut one or more items to paste.') self.request.response.setHeader("Content-type", "application/json") if self.context.cb_dataValid(): try: baseObject = self.portal.restrictedTraverse( self.copyDict['url']) baseId = 'UID_' + get_uid(baseObject) intervalle = ends(baseObject) - starts(baseObject) cb_copy_data = self.request['__cp'] pasteList = self.context.manage_pasteObjects( cb_copy_data=cb_copy_data) newObject = getattr(self.context, pasteList[0]['new_id']) startDate = self.startDate if self.EventAllDay: startDate = DateTime(self.startDate).strftime( '%Y-%m-%d ') + starts(baseObject).strftime('%H:%M') if HAS_PAE and not hasattr(newObject, 'setStartDate'): # non-Archetypes duck type: use properties for start/end, # along with UTC-normalized datetime.datetime values from plone.event.utils import pydt import pytz local_start = DateTime(startDate) _utc = lambda dt: pytz.UTC.normalize(dt) newObject.start = _utc(pydt(local_start)) newObject.end = _utc(pydt(local_start + intervalle)) newObject.whole_day = self.EventAllDay else: newObject.setStartDate(DateTime(startDate)) newObject.setEndDate( newObject.getField('startDate').get(newObject) + intervalle) newObject.reindexObject() transaction_note('Pasted content to %s' % (self.context.absolute_url())) return json.dumps({ 'status': 'pasted', 'event': self.createJsonEvent(newObject), 'url': newObject.absolute_url(), 'op': self.copyDict['op'], 'id': baseId }) except ConflictError: raise except ValueError: msg = PLMF(u'Disallowed to paste item(s).') except (Unauthorized, 'Unauthorized'): msg = PLMF(u'Unauthorized to paste item(s).') except CopyError: # fallback msg = PLMF(u'Paste could not find clipboard content.') return json.dumps({ 'status': 'failure', 'message': self.context.translate(msg) })
def __call__(self): portal = getToolByName(self.context, 'portal_url').getPortalObject() context = aq_inner(self.context) target_folder = interfaces.ISolgemaFullcalendarProperties( context, None).target_folder target_folder = target_folder \ and portal.unrestrictedTraverse('/'+ portal.id + target_folder) \ or aq_parent(context) if not getSecurityManager().checkPermission('Add portal content', target_folder): raise Unauthorized, "You can't add an event on %s" % str( target_folder) query = self.context.buildQuery() copyDict = getCopyObjectsUID(self.request) #Check whether our context actually has a query and if so, whether #it has a Type criterion specified. if query and query.has_key('Type'): if isinstance(query['Type'], (list, tuple)) and len(query['Type']) > 1: return json.dumps({'display': True}) else: portal_type = isinstance( query['Type'], (tuple, list)) and query['Type'][0] or query['Type'] if copyDict and portal.restrictedTraverse( copyDict['url']).portal_type == portal_type: return json.dumps({'display': True}) else: portal_type = 'Event' pTypes = [ a for a in getToolByName(context, 'portal_types').listTypeInfo() if a.id == portal_type ] pTypeTitle = pTypes and pTypes[0].Title() or portal_type typeTitle = translate(pTypeTitle, context=self.request) if HAS_PLONE40: title = PLMF(u'heading_add_item', default='Add ${itemtype}', mapping={'itemtype': typeTitle}) else: title = PLMF(u'label_add_type', default='Add ${type}', mapping={'type': typeTitle}) return json.dumps({ 'display': False, 'type': portal_type, 'title': translate(title, context=self.request) })
def getWeekdaysNamesAbbr(self): if self.portal_language in ['de']: return [ PLMF(self._ts.day_msgid(d) + '_short', default=self._ts.weekday_english(d) + '_short') for d in range(7) ] else: return [ PLMF(self._ts.day_msgid(d, format='a'), default=self._ts.weekday_english(d, format='a')) for d in range(7) ]
def __call__(self): title = safe_unicode(self.context.title_or_id()) mtool = getToolByName(self.context, 'portal_membership') if not mtool.checkPermission('Copy or Move', self.context): message = PLMF(u'Permission denied to copy ${title}.', mapping={u'title': title}) status = 'error' raise json.dumps({ 'status': status, 'message': self.context.translate(message) }) try: lock_info = self.context.restrictedTraverse('@@plone_lock_info') except AttributeError: lock_info = None parent = aq_parent(aq_inner(self.context)) if lock_info is not None and lock_info.is_locked(): status = 'error' message = PLMF(u'${title} is locked and cannot be cut.', mapping={u'title': title}) return json.dumps({ 'status': status, 'message': parent.translate(message) }) try: cp = parent.manage_cutObjects(self.context.getId()) status = 'copied' except CopyError: status = 'error' message = PLMF(u'${title} is not copyable.', mapping={u'title': title}) return json.dumps({ 'status': status, 'message': parent.translate(message) }) message = PLMF(u'${title} copied.', mapping={u'title': title}) transaction_note('Copied object %s' % self.context.absolute_url()) contextId = 'UID_' + self.context.UID() return json.dumps({ 'status': status, 'message': self.context.translate(message), 'cp': cp, 'id': contextId })
def getMenuFactory(self): idnormalizer = queryUtility(IIDNormalizer) baseUrl = self.addContext.absolute_url() portal_types = getToolByName(self.context, 'portal_types').listTypeInfo() aTypes = [a for a in portal_types if a.id in self.addableTypes] addingview = queryMultiAdapter((self.addContext, self.request), name='+') results = [] for t in aTypes: typeId = t.id cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId factory = t.factory if addingview is not None and \ queryMultiAdapter((addingview, self.request), name=factory) is not None: url = '%s/+/%s' % ( baseUrl, factory, ) else: url = '%s/createSFEvent?type_name=%s&startDate=%s&endDate=%s' % ( baseUrl, quote_plus(typeId), quote_plus(str( self.startDate)), quote_plus(str(self.endDate))) icon = t.getIcon() if icon: icon = '%s/%s' % (self.portal_url, icon) title = translate(t.Title(), context=self.request) results.append({ 'id': typeId, 'title': PLMF(u'label_add_type', default='Add ${type}', mapping={'type': title}), 'description': t.Description(), 'action': url, 'selected': False, 'icon': icon, 'extra': { 'id': cssId, 'separator': None, 'class': cssClass }, 'submenu': None, }) # Sort the addable content types based on their translated title results = [(translate(ctype['title'], context=self.request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results
def getWeekdaysNamesAbbr(self): format = getattr(self.calendar, 'shortDayNameFormat', 'a') return [ PLMF(self._ts.day_msgid(d, format=format), default=self._ts.weekday_english(d, format='a')) for d in range(7) ]
def month(self, number, format=None, default=None): """ Returns a Message with the month name, that can be translated by the TAL engine. Format is either None or 'a' (long or abbreviation). """ if default is None: default = monthname_english(number, format=format) value = 'a' == format and monthname_msgid_abbr( number) or monthname_msgid(number) return PLMF(value, default=default)
def __call__(self): msg = PLMF(u'Copy or cut one or more items to paste.') if self.context.cb_dataValid: try: baseObject = self.portal.restrictedTraverse( self.copyDict['url']) baseId = 'UID_' + baseObject.UID() intervalle = baseObject.endDate - baseObject.startDate cb_copy_data = self.request['__cp'] pasteList = self.context.manage_pasteObjects( cb_copy_data=cb_copy_data) newObject = getattr(self.context, pasteList[0]['new_id']) startDate = self.startDate if self.EventAllDay: startDate = DateTime(self.start()).strftime( '%Y-%m-%d ') + baseObject.startDate.strftime('%H:%M') newObject.setStartDate(DateTime(startDate)) newObject.setEndDate(newObject.start() + intervalle) newObject.reindexObject() transaction_note('Pasted content to %s' % (self.context.absolute_url())) return json.dumps({ 'status': 'pasted', 'event': self.createJsonEvent(newObject), 'url': newObject.absolute_url(), 'op': self.copyDict['op'], 'id': baseId }) except ConflictError: raise except ValueError: msg = PLMF(u'Disallowed to paste item(s).') except (Unauthorized, 'Unauthorized'): msg = PLMF(u'Unauthorized to paste item(s).') except: # fallback msg = PLMF(u'Paste could not find clipboard content.') return json.dumps({ 'status': 'failure', 'message': self.context.translate(msg) })
class IEnhancedUserDataSchema(IRegisterSchema): """ Use all the fields from the default user data schema, and add various extra fields. """ # portrait = FileUpload(title=PLMF(u'label_portrait', default=u'Portrait'), # description=_(u'help_portrait', # default=u'To add or change the portrait: click the ' # '"Browse" button; select a picture of yourself.'), # required=False) pdelete = schema.Bool(title=PLMF(u'label_delete_portrait', default=u'Delete Portrait'), description=u'', required=False) twitter_username = schema.TextLine( title=_(u'label_twitter', default=u'Twitter username'), description=_(u'help_twitter', default=u"Fill in your Twitter username."), required=False, )
def getMenuFactory(self): idnormalizer = queryUtility(IIDNormalizer) baseUrl = self.addContext.absolute_url() portal_types = getToolByName(self.context, 'portal_types').listTypeInfo() aTypes = [a for a in portal_types if a.id in self.addableTypes] addingview = queryMultiAdapter((self.addContext, self.request), name='+') results = [] for t in aTypes: typeId = t.id cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId factory = t.factory if addingview is not None and \ queryMultiAdapter((addingview, self.request), name=factory) is not None: url = '%s/+/%s' % ( baseUrl, factory, ) elif typeId == 'plone.app.event.dx.event': qs = {} start, end = self.startDate, self.endDate qs['form.widgets.IEventBasic.start-day'] = start.day() qs['form.widgets.IEventBasic.start-month'] = start.month() qs['form.widgets.IEventBasic.start-year'] = start.year() qs['form.widgets.IEventBasic.end-day'] = end.day() qs['form.widgets.IEventBasic.end-month'] = end.month() qs['form.widgets.IEventBasic.end-year'] = end.year() if self.EventAllDay == 'true' or self.EventAllDay != 'false': qs['form.widgets.IEventBasic.whole_day:list'] = 'selected' else: qs['form.widgets.IEventBasic.start-hour'] = start.hour() qs['form.widgets.IEventBasic.start-minute'] = start.minute( ) qs['form.widgets.IEventBasic.end-hour'] = end.hour() qs['form.widgets.IEventBasic.end-minute'] = end.minute() url = '%s/SFAjax_add_dx_event?%s' % (baseUrl, urlencode(qs)) else: url = '%s/createSFEvent?type_name=%s&startDate=%s&endDate=%s' % ( baseUrl, quote_plus(typeId), quote_plus(str( self.startDate)), quote_plus(str(self.endDate))) icon = t.getIcon() if icon: icon = '%s/%s' % (self.portal_url, icon) title = translate(t.Title(), context=self.request) results.append({ 'id': typeId, 'title': PLMF(u'label_add_type', default='Add ${type}', mapping={'type': title}), 'description': t.Description(), 'action': url, 'selected': False, 'icon': icon, 'extra': { 'id': cssId, 'separator': None, 'class': cssClass }, 'submenu': None, }) # Sort the addable content types based on their translated title results = [(translate(ctype['title'], context=self.request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results
def getWeekdaysNames(self): return [ PLMF(self._ts.day_msgid(d), default=self._ts.weekday_english(d)) for d in range(7) ]
def getMonthsNamesAbbr(self): return [ PLMF(self._ts.month_msgid(m, format='a'), default=self._ts.month_english(m, format='a')) for m in [a + 1 for a in range(12)] ]
def getWeekdaysNamesAbbr(self): return [ PLMF(self._ts.day_msgid(d, format='a'), default=self._ts.weekday_english(d, format='a')) for d in range(7) ]
def __call__(self): portal = getToolByName(self.context, 'portal_url').getPortalObject() portal_types = getToolByName(portal, 'portal_types') context = aq_inner(self.context) target_folder = getattr( interfaces.ISolgemaFullcalendarProperties(context, None), 'target_folder', None) target_folder = target_folder \ and portal.unrestrictedTraverse('/'+ portal.id + target_folder) \ or aq_parent(context) if not getSecurityManager().checkPermission('Add portal content', target_folder): raise Unauthorized, "You can't add an event on %s" % str( target_folder) query = hasattr(self.context, 'buildQuery') and self.context.buildQuery() or {} query = normalize_type_query(query, portal) copyDict = getCopyObjectsUID(self.request) # The 'Item Type' criteria uses the 'Type' index while the 'Item Type # (internal)' criteria uses the 'portal_type' index. # # We need to check for both, portal_type first, because it's more # specific than 'Type', which just indexes the content type's Title # property (which can be non-unique). index = query.get('portal_type', query.get('Type')) self.request.response.setHeader("Content-type", "application/json") if index: if isinstance(index, (list, tuple)) and len(index) > 1: return json.dumps({'display': True}) portal_type = isinstance(index, (tuple, list)) and index[0] or index if copyDict and portal.restrictedTraverse( copyDict['url']).portal_type == portal_type: return json.dumps({'display': True}) elif query.get('Type'): portal_type = isinstance( query['Type'], (tuple, list)) and query['Type'][0] or query['Type'] if copyDict and portal.restrictedTraverse( copyDict['url']).portal_type == portal_type: return json.dumps({'display': True}) else: portal_type = getattr( interfaces.ISolgemaFullcalendarProperties(context, None), 'eventType', 'Event') pTypes = [ a for a in portal_types.listTypeInfo() if a.id == portal_type ] pTypeTitle = pTypes and pTypes[0].Title() or portal_type typeTitle = translate(pTypeTitle, context=self.request) if HAS_PLONE40: title = PLMF(u'heading_add_item', default='Add ${itemtype}', mapping={'itemtype': typeTitle}) else: title = PLMF(u'label_add_type', default='Add ${type}', mapping={'type': typeTitle}) return json.dumps({ 'display': False, 'type': portal_type, 'title': translate(title, context=self.request) })
def daysOfWeek(context): ts = getToolByName(context, 'translation_service') return TitledVocabulary.fromTitles([(d, PLMF(ts.day_msgid(d), default=ts.weekday_english(d))) for d in range(7)])