示例#1
0
    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
        })
示例#2
0
    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
        })
示例#3
0
    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)
        })
示例#4
0
    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)
        })
示例#5
0
 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)
         ]
示例#6
0
    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
        })
示例#7
0
    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
示例#8
0
 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)
示例#10
0
    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)
        })
示例#11
0
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,
    )
示例#12
0
    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
示例#13
0
 def getWeekdaysNames(self):
     return [
         PLMF(self._ts.day_msgid(d), default=self._ts.weekday_english(d))
         for d in range(7)
     ]
示例#14
0
 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)]
     ]
示例#15
0
 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)
     ]
示例#16
0
    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)])