示例#1
0
    def __call__(self, context, field, options):
        value = getattr(context, field, False)

        if value is True:
            return _(u'Yes')
        else:
            return _(u'No')
示例#2
0
    def handle_import(self):
        if not self.parameters:
            return

        try:
            portal_type = self.parameters['portal_type']
            import_file = self.parameters['import_file']

            format = self.get_format_from_filename(import_file.filename)

            if not format in supported_formats:
                raise ContentImportError(_(
                    u'${format} is not supported, supported are ${formats}',
                    mapping={
                        'format': format,
                        'formats': ', '.join(supported_formats)
                    }
                ))

            count = import_people(
                self.request,
                self.context,
                portal_type,
                format,
                import_file.data
            )

            self.status = _(
                u'Successfully imported ${count} records', mapping=dict(
                    count=count
                )
            )
        except ContentImportError, e:
            transaction.abort()
            self.raise_action_error(e.translate(self.request))
示例#3
0
def get_field(request, person, field):

    if not hasattr(person, field):
        raise ContentExportError(_(u"Field '${name}' does not exist", mapping={
            'name': field
        }))

    value = get_value(request, person, field)

    if value is None:
        return u''

    if isinstance(value, bool):
        return _(u'Yes') if value is True else _(u'No')

    if isinstance(value, basestring):
        return unicode(value)

    if field in person.membership_fields.keys():
        organizations = (api.content.get(UID=i).title for i in value.keys())
        return u', '.join(organizations)

    if isinstance(value, (list, tuple, set)):
        return u', '.join(value)

    if isinstance(value, dict):
        parts = []
        for key in sorted(value):
            parts.append(u'{}: {}'.format(key, value[key]))
        return u', '.join(parts)

    if isinstance(value, date):
        return unicode(isodate.date_isoformat(value))

    if isinstance(value, datetime):
        return unicode(isodate.datetime_isoformat(value))

    if isinstance(value, time):
        return unicode(isodate.time_isoformat(value))

    if isinstance(value, RichTextValue):
        return unicode(value.output)

    if isinstance(value, (NamedImage, NamedBlobImage)):
        base = person.absolute_url()

        if value.filename:
            return u'{}/@@download/{}/{}'.format(base, field, value.filename)
        else:
            return u'{}/@@download/{}'.format(base, field)

    return value
示例#4
0
def get_attribute_map(request, headers, portal_type):

    if not headers:
        raise ContentImportError(_(u'No column headers were found'))

    schema = tools.get_schema_from_portal_type(portal_type)
    attribute_map = {}

    fields = getFields(schema)

    known_titles = dict((field.title, field) for field in fields.values())
    known_fields = dict((key, field) for key, field in fields.items())

    translate = tools.translator(request)
    known_translated_titles = dict(
        (translate(field.title), field) for field in fields.values()
    )

    for header in headers:

        if header in known_translated_titles:
            field = known_translated_titles[header]
        elif header in known_fields:
            field = known_fields[header]
        elif header in known_titles:
            field = known_titles[header]
        else:
            log.warn(u"The header '{}' was ignored.".format(header))
            continue

        if field in attribute_map.values():
            raise ContentImportError(
                _(
                    u'The ${name} column is specified more than once',
                    mapping=dict(name=header)
                )
            )

        if field in ('title', 'id'):
            raise ContentImportError(
                _(
                    u'The ${name} column is invalid. "title" and "id" are '
                    u'reserved fieldnames which may not be used.',
                    mapping=dict(name=header)
                )
            )

        attribute_map[header] = field

    return attribute_map
示例#5
0
    def test_error_translation(self):
        err = errors.TranslatableException(_(u'Test'))
        self.assertEqual(err.translate(self.request), u'Test')

        err = errors.ContentImportError(_(u'Test'))
        self.assertEqual(err.translate(self.request), u'Test')

        err.colname = 'test'
        self.assertEqual(err.translate(self.request), u'Test (Column test)')

        err.rownumber = 1
        self.assertEqual(
            err.translate(self.request), u'Test (Row 1, Column test)'
        )
示例#6
0
    def translate_position(self, request):
        particles = []

        if self.rownumber:
            particles.append(_(u'Row ${row}', mapping=dict(
                row=self.rownumber
            )))

        if self.colname:
            particles.append(_(u'Column ${column}', mapping=dict(
                column=self.colname
            )))

        translate = tools.translator(request)
        return u', '.join(map(translate, particles))
示例#7
0
    def available_variants(self):
        exports = [
            ('__none__', _(u'Standard'))
        ]

        for name, export in getAdapters((self.context, ), IExportVariant):
            if export.can_handle_type(self.portal_type):
                exports.append((name, export.title))

        return exports
示例#8
0
def validate_attribute_values(schema, values):
    obj = namedtuple('ImportObject', values.keys())(**values)

    for error in getValidationErrors(schema, obj):
        column = schema[error[0]].title

        if isinstance(error[1], (SchemaNotFullyImplemented, RequiredMissing)):
            raise ContentImportError(
                _(u'Required column is missing'), colname=column
            )
        else:
            raise ContentImportError(error, colname=column)
示例#9
0
    def handle_export(self):
        try:
            export_fields = self.parameters.get('export_fields')
            export_fields = [
                (id, title) for id, title
                in self.portal_type_fields
                if id in export_fields
            ]

            review_state = self.parameters.get('review_state')
            review_state = None if review_state == '__all__' else review_state

            include_inactive = self.parameters.get('include_inactive')

            dataset = export_people(
                self.request,
                self.context,
                self.portal_type.id,
                export_fields,
                review_state,
                include_inactive
            )

            variant = self.get_variant_by_name(self.parameters.get('variant'))
            if variant:
                dataset = variant.adjust_dataset(dataset, self.parameters)

                if dataset is None:
                    raise ContentExportError(
                        _(u"The selected variant could not be applied")
                    )

            format = self.parameters.get('export_format').lower()
            filename = '%s.%s' % (self.context.title, format)
            filename = codecs.utf_8_encode('filename="%s"' % filename)[0]

            output = getattr(dataset, format)

            RESPONSE = self.request.RESPONSE
            RESPONSE.setHeader("Content-disposition", filename)
            RESPONSE.setHeader(
                "Content-Type", "application/%s;charset=utf-8" % format
            )
            RESPONSE.setHeader("Content-Length", len(output))

            self.output = output

        except ContentExportError as e:
            self.raise_action_error(e.translate(self.request))
示例#10
0
def export_people(request, container, portal_type, fields,
                  review_state=None, include_inactive=True):

    people = get_people(container, portal_type, review_state, include_inactive)

    if not people:
        raise ContentExportError(_(u"No people to export"))

    records = (get_record(request, person, fields) for person in people)

    translate = tools.translator(request, 'seantis.people')
    dataset = tablib.Dataset(headers=[translate(f[1]) for f in fields])
    map(dataset.append, records)

    return dataset
示例#11
0
    def filter(self):
        if self.letter:
            return LetterFilter(self.letter, _(u"Letter"))

        for key in self.request.keys():
            if key.startswith(self.filter_prefix):
                val = self.request[key].decode("utf-8")
                key = key.replace(self.filter_prefix, "")

                field = self.has_people and self.schema.get(key, None) or None
                title = field and field.title or u""

                return ListFilter(key, val, title)

        return None
示例#12
0
    def available_review_states(self):
        all_states = [
            ('__all__', _(u'All'))
        ]

        used_type = self.context.used_type()
        if not used_type:
            return all_states

        actual_states = set(b.review_state for b in self.context.people())
        wftool = api.portal.get_tool('portal_workflow')

        _plone = MessageFactory('plone')

        for state in actual_states:
            all_states.append((
                state, _plone(
                    wftool.getTitleForStateOnType(state, used_type.id)
                )
            ))

        return all_states
示例#13
0
def get_attribute_values(request, record, attribute_map):
    values = {}
    vocabularies = get_vocabularies(request, attribute_map)

    for header, field in attribute_map.items():

        downloaded = download_field_from_url(field, record[header])
        if downloaded is not False:
            values[field.__name__] = downloaded
            continue

        if IDate.providedBy(field):
            if not record[header]:
                values[field.__name__] = None
            else:
                values[field.__name__] = parse_date(record[header])
            continue

        if IDatetime.providedBy(field):
            if not record[header]:
                values[field.__name__] = None
            else:
                values[field.__name__] = parse_datetime(record[header])
            continue

        if IURI.providedBy(field):
            if not record[header].strip():
                values[field.__name__] = None
                continue

        if IList.providedBy(field):
            if ITextLine.providedBy(field.value_type):
                values[field.__name__] = convert_to_list(record[header])
                continue

        if ISet.providedBy(field):
            if IChoice.providedBy(field.value_type):
                values[field.__name__] = set(convert_to_list(record[header]))
                continue

        if IChoice.providedBy(field):
            if not record[header].strip():
                values[field.__name__] = None
            else:
                vocabulary = vocabularies[header]
                if record[header].lower() not in vocabulary:
                    raise ContentImportError(
                        _(
                            u'The ${name} column contains the '
                            u'unknown value ${value}',
                            mapping=dict(name=header, value=record[header])
                        )
                    )

                values[field.__name__] = vocabulary[record[header].lower()]

            continue

        assert IFromUnicode.providedBy(field), """
            {} does not support fromUnicode
        """.format(field)

        try:
            values[field.__name__] = field.fromUnicode(record[header])

            if isinstance(values[field.__name__], basestring):
                values[field.__name__] = values[field.__name__].strip()
            if isinstance(field, Text):
                values[field.__name__] = values[field.__name__].replace(
                    '<br />', '\n'
                )

        except ValidationError, e:
            raise ContentImportError(e.doc(), colname=header)
        except ValueError, e:
            raise ContentImportError(e.message, colname=header)
示例#14
0
 def available_actions(self):
     yield dict(name='import', title=_(u'Import'), css_class='context')
     yield dict(name='cancel', title=_(u'Cancel'))
示例#15
0
 def label(self):
     return _(u"Import ${name}", mapping={
         'name': self.context.title
     })
示例#16
0
 def membership_fields(self):
     return {
         'memberships': _(u'Memberships')
     }
示例#17
0
 def available_actions(self):
     yield dict(name='export', title=_(u"Export"),
                css_class='context allowMultiSubmit')
     yield dict(name='cancel', title=_(u"Cancel"))