コード例 #1
0
    def new(self, ds_id, ds_type):
        new_payload = None

        if 'save' not in request.params:
            lc = ckanapi.LocalCKAN()
            pkg = lc.action.package_show(id=ds_id)
            pkg_id = pkg[PRODUCT_ID]

            parent_schema = scheming_get_dataset_schema(pkg['type'])

            new_payload = {
                'type': ds_type,
                'top_parent_id': pkg.get('top_parent_id', pkg_id) or pkg_id
            }

            id_payload = {
                'parentProductId': pkg['product_id_new'],
                'parentProduct': pkg['product_id_new'],
                'productType': str(
                    parent_schema['dataset_type_code']
                ),
                'productTypeCode': str(
                    parent_schema['dataset_type_code']
                )
            }

            if ds_type == 'format':
                new_payload['parent_id'] = pkg_id
            elif ds_type == 'issue':
                issue_number = next_issue_number(pkg_id)
                issue_id = u'{pid}{issue_number}'.format(
                    pid=pkg_id,
                    issue_number=issue_number
                )
                new_payload['product_type_code'] = pkg.get('product_type_code')
                new_payload['issue_number'] = issue_number
                new_payload['product_id_new'] = issue_id
                new_payload['name'] = u'issue-{issue_id}'.format(
                    issue_id=issue_id
                )
                pass
            elif ds_type == 'article':
                article_id = next_article_id(
                    pkg.get('top_parent_id', pkg_id) or pkg_id,
                    pkg.get('issue_number')
                )
                new_payload['product_type_code'] = pkg.get('product_type_code')
                new_payload['issue_number'] = pkg.get('issue_number')
                new_payload['product_id_new'] = article_id
                new_payload['name'] = u'article-{article_id}'.format(
                    article_id=article_id
                )
                pass
            elif ('non_data_product' in parent_schema and
                    parent_schema['non_data_product'] == True):
                if is_legacy_product(pkg[PRODUCT_ID]):
                    new_payload[PRODUCT_ID] = lc.action.GetNextLegacyProductId(
                        **id_payload
                    )
                else:
                    id_payload['subjectCode'] = pkg['subject_codes'][0]
                    new_payload[PRODUCT_ID] = lc.action.GetNextNonDataProductId(
                        **id_payload
                    )
            else:
                new_payload[PRODUCT_ID] = lc.action.GetNextProductId(
                    **id_payload
                )

        return PackageController().new(new_payload)
コード例 #2
0
ファイル: validators.py プロジェクト: marcfor/ckanext-stcndm
def create_product_id(key, data, errors, context):
    general_non_data_types = (u'publication', u'video', u'conference',
                              u'service', u'pumf', u'generic')
    general_data_types = (u'view', u'indicator', u'chart')
    # if there was an error before calling our validator
    # don't bother with our validation
    if errors[key] or errors[('subject_codes', )] or errors[(
            'top_parent_id', )]:
        return

    product_id_new = _data_lookup(('product_id_new', ), data)
    if product_id_new and is_legacy_id(product_id_new):
        return

    data_set_type = _data_lookup(('type', ), data)
    # make sure subject_codes processed
    shortcode_validate(('subject_codes', ), data, errors, context)
    subject_codes = shortcode_output(_data_lookup(('subject_codes', ), data))
    top_parent_id = _data_lookup(('top_parent_id', ), data)

    if data_set_type in general_non_data_types:
        try:
            product_id_new = h.next_non_data_product_id(
                subject_code=subject_codes[0][:2],
                product_type_code=_data_lookup(('product_type_code', ), data))
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[('subject_codes', )].append(_(ve.error_summary[u'Message']))
            errors[key].append(_('PID could not be generated'))
            return
        except IndexError:
            errors[('subject_codes', )].append(_('Missing value'))
            errors[key].append(_('PID could not be generated'))
            return
    elif data_set_type == u'issue':
        if not top_parent_id:
            errors[('top_parent_id', )].append(_('Missing value'))
            errors[key].append(_('PID could not be generated'))
            return
        issue_number = _data_lookup('issue_number', data)
        if not issue_number:
            issue_number = h.next_issue_number(top_parent_id)
            _data_update(issue_number, ('issue_number', ), data)
        product_id_new = u'{pid}{issue_number}'.format(
            pid=top_parent_id, issue_number=issue_number)
        data[key] = product_id_new
        return product_id_new
    elif data_set_type == u'article':
        if not top_parent_id:
            errors[('top_parent_id', )].append(_('Missing value'))
            errors[key].append(_('PID could not be generated'))
            return
        issue_number = _data_lookup('issue_number', data)
        if not issue_number:
            issue_number = h.next_issue_number(top_parent_id)
            _data_update(issue_number, ('issue_number', ), data)
        try:
            if is_legacy_id(top_parent_id):
                product_id_new = get_next_legacy_article_id(
                    context=context,
                    data_dict={
                        'parentProduct':
                        u'{top_parent_id}{issue_number}'.format(
                            top_parent_id=top_parent_id,
                            issue_number=issue_number)
                    })
            else:
                product_id_new = h.next_article_id(top_parent_id=top_parent_id,
                                                   issue_number=issue_number)
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[key].append(_(ve))
            return
    elif data_set_type == u'cube':
        try:
            product_id_new = get_next_cube_id(
                context=context,
                data_dict={'subjectCode': subject_codes[0][:2]})
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[('subject_codes', )].append(_(ve.error_dict['message']))
            errors[key].append(_('PID could not be generated'))
            return
        except IndexError:
            errors[('subject_codes', )].append(_('Missing value'))
            errors[key].append(_('PID could not be generated'))
            return
    elif data_set_type in general_data_types:
        if not top_parent_id or top_parent_id is missing:
            errors[('top_parent_id', )].append(_('Missing value'))
            errors[key].append(_('PID could not be generated'))
            return
        try:
            product_id_new = get_next_product_id(
                context, {
                    'parentProductId': top_parent_id,
                    'productType': data.get((u'product_type_code', ))
                })
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[('top_parent_id', )].append(ve.error_dict['message'])
            errors[key].append(_('PID could not be generated'))
            return
        except NotFound as e:
            errors[('top_parent_id', )].append(e[0])
            errors[key].append(_('PID could not be generated'))
            return
    else:
        errors[key].append(
            _('create_product_id not yet implemented for {data_set_type}'.
              format(data_set_type=data_set_type)))

    return
コード例 #3
0
def create_product_id(key, data, errors, context):
    general_non_data_types = (u"publication", u"video", u"conference", u"service", u"pumf", u"generic")
    general_data_types = (u"view", u"indicator", u"chart")
    # if there was an error before calling our validator
    # don't bother with our validation
    if errors[key] or errors[("subject_codes",)] or errors[("top_parent_id",)]:
        return

    product_id_new = _data_lookup(("product_id_new",), data)
    if product_id_new and is_legacy_id(product_id_new):
        return

    data_set_type = _data_lookup(("type",), data)
    # make sure subject_codes processed
    shortcode_validate(("subject_codes",), data, errors, context)
    subject_codes = shortcode_output(_data_lookup(("subject_codes",), data))
    top_parent_id = _data_lookup(("top_parent_id",), data)

    if data_set_type in general_non_data_types:
        try:
            product_id_new = h.next_non_data_product_id(
                subject_code=subject_codes[0][:2], product_type_code=_data_lookup(("product_type_code",), data)
            )
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[("subject_codes",)].append(_(ve.error_summary[u"Message"]))
            errors[key].append(_("PID could not be generated"))
            return
        except IndexError:
            errors[("subject_codes",)].append(_("Missing value"))
            errors[key].append(_("PID could not be generated"))
            return
    elif data_set_type == u"issue":
        if not top_parent_id:
            errors[("top_parent_id",)].append(_("Missing value"))
            errors[key].append(_("PID could not be generated"))
            return
        issue_number = _data_lookup("issue_number", data)
        if not issue_number:
            issue_number = h.next_issue_number(top_parent_id)
            _data_update(issue_number, ("issue_number",), data)
        product_id_new = u"{pid}{issue_number}".format(pid=top_parent_id, issue_number=issue_number)
        data[key] = product_id_new
        return product_id_new
    elif data_set_type == u"article":
        if not top_parent_id:
            errors[("top_parent_id",)].append(_("Missing value"))
            errors[key].append(_("PID could not be generated"))
            return
        issue_number = _data_lookup("issue_number", data)
        if not issue_number:
            issue_number = h.next_issue_number(top_parent_id)
            _data_update(issue_number, ("issue_number",), data)
        try:
            if is_legacy_id(top_parent_id):
                product_id_new = get_next_legacy_article_id(
                    context=context,
                    data_dict={
                        "parentProduct": u"{top_parent_id}{issue_number}".format(
                            top_parent_id=top_parent_id, issue_number=issue_number
                        )
                    },
                )
            else:
                product_id_new = h.next_article_id(top_parent_id=top_parent_id, issue_number=issue_number)
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[key].append(_(ve))
            return
    elif data_set_type == u"cube":
        try:
            product_id_new = get_next_cube_id(context=context, data_dict={"subjectCode": subject_codes[0][:2]})
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[("subject_codes",)].append(_(ve.error_dict["message"]))
            errors[key].append(_("PID could not be generated"))
            return
        except IndexError:
            errors[("subject_codes",)].append(_("Missing value"))
            errors[key].append(_("PID could not be generated"))
            return
    elif data_set_type in general_data_types:
        if not top_parent_id or top_parent_id is missing:
            errors[("top_parent_id",)].append(_("Missing value"))
            errors[key].append(_("PID could not be generated"))
            return
        try:
            product_id_new = get_next_product_id(
                context, {"parentProductId": top_parent_id, "productType": data.get((u"product_type_code",))}
            )
            data[key] = product_id_new
            return product_id_new
        except ValidationError as ve:
            errors[("top_parent_id",)].append(ve.error_dict["message"])
            errors[key].append(_("PID could not be generated"))
            return
        except NotFound as e:
            errors[("top_parent_id",)].append(e[0])
            errors[key].append(_("PID could not be generated"))
            return
    else:
        errors[key].append(
            _("create_product_id not yet implemented for {data_set_type}".format(data_set_type=data_set_type))
        )

    return