def ajaxgateway(self, req, form):
        """
        """
        argd = wash_urlargd(
            form, {"projectid": (str, ""), "publicationid": (str, ""), "action": (str, ""), "current_field": (str, "")}
        )

        # Get parameters
        action = argd["action"]
        publicationid = argd["publicationid"]
        projectid = argd["projectid"]

        # Check if action is supported
        assert action in ("save", "verify_field", "submit", "unlinkproject", "linkproject")

        # JSON return dictionary
        out = {
            "errors": {},
            "warnings": {},
            "addclasses": {},
            "delclasses": {},
            "substitutions": {},
            "appends": {},
            "hiddens": [],
            "showns": [],
            "action": action,
        }

        if action == "verify_field":
            current_field = argd["current_field"]
            assert current_field
            metadata = wash_form(form, publicationid)
            out["errors"], out["warnings"] = OpenAIREPublication.static_check_metadata(
                metadata, publicationid, check_only_field=current_field, ln=argd["ln"]
            )
        else:
            user_info = collect_user_info(req)
            auth_code, auth_message = acc_authorize_action(user_info, "submit", doctype="OpenAIRE")
            assert auth_code == 0
            uid = user_info["uid"]
            publication = OpenAIREPublication(uid, publicationid, ln=argd["ln"])
            if action == "unlinkproject":
                publication.unlink_project(projectid)
                out["substitutions"]["#projectsbox_%s" % publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out["warnings"] = (
                    simple_metadata2namespaced_metadata(publication.errors, publicationid),
                    simple_metadata2namespaced_metadata(publication.warnings, publicationid),
                )
            elif action == "linkproject":
                publication.link_project(projectid)
                out["substitutions"]["#projectsbox_%s" % publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out["warnings"] = (
                    simple_metadata2namespaced_metadata(publication.errors, publicationid),
                    simple_metadata2namespaced_metadata(publication.warnings, publicationid),
                )
            else:
                publication.merge_form(form)
                publication.check_metadata()
                publication.check_projects()
                out["errors"], out["warnings"] = (
                    simple_metadata2namespaced_metadata(publication.errors, publicationid),
                    simple_metadata2namespaced_metadata(publication.warnings, publicationid),
                )
                if "".join(
                    out["errors"].values()
                ).strip():  # FIXME bad hack, we need a cleaner way to discover if there are errors
                    out["addclasses"]["#status_%s" % publicationid] = "error"
                    out["delclasses"]["#status_%s" % publicationid] = "warning ok empty"
                elif "".join(out["warnings"].values()).strip():
                    out["addclasses"]["#status_%s" % publicationid] = "warning"
                    out["delclasses"]["#status_%s" % publicationid] = "error ok empty"
                else:
                    out["addclasses"]["#status_%s" % publicationid] = "ok"
                    out["delclasses"]["#status_%s" % publicationid] = "warning error empty"

                if action == "save":
                    out["substitutions"][
                        "#publication_information_%s" % publicationid
                    ] = publication.get_publication_information()
                elif action == "submit":
                    if not "".join(out["errors"].values()).strip():
                        publication.upload_record()
                        out["appends"]["#submitted_publications"] = publication.get_publication_preview()
                        out["showns"].append("#submitted_publications")
                        out["hiddens"].append("#header_row_%s" % publicationid)
                        out["hiddens"].append("#body_row_%s" % publicationid)
        req.content_type = "application/json"
        return json.dumps(out)
    def ajaxgateway(self, req, form):
        """
        """
        argd = wash_urlargd(form, {'projectid': (str, ''), 'publicationid': (
            str, ''), 'action': (str, ''), 'current_field': (str, '')})

        # Get parameters
        action = argd['action']
        publicationid = argd['publicationid']
        projectid = argd['projectid']

        # Check if action is supported
        assert(action in (
            'save', 'verify_field', 'submit', 'unlinkproject', 'linkproject'))

        # JSON return dictionary
        out = {
            'errors': {},
            'warnings': {},
            'addclasses': {},
            'delclasses': {},
            'substitutions': {},
            'appends': {},
            'hiddens': [],
            'showns': [],
            'action': action,
        }

        if action == 'verify_field':
            current_field = argd['current_field']
            assert(current_field)
            metadata = wash_form(form, publicationid)
            out["errors"], out["warnings"] = OpenAIREPublication.static_check_metadata(metadata, publicationid, check_only_field=current_field, ln=argd['ln'])
        else:
            user_info = collect_user_info(req)
            auth_code, auth_message = acc_authorize_action(
                user_info, 'submit', doctype='OpenAIRE')
            assert(auth_code == 0)
            uid = user_info['uid']
            publication = OpenAIREPublication(
                uid, publicationid, ln=argd['ln'])
            if action == 'unlinkproject':
                publication.unlink_project(projectid)
                out["substitutions"]["#projectsbox_%s" %
                                     publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out["warnings"] = simple_metadata2namespaced_metadata(publication.errors, publicationid), simple_metadata2namespaced_metadata(publication.warnings, publicationid)
            elif action == 'linkproject':
                publication.link_project(projectid)
                out["substitutions"]["#projectsbox_%s" %
                                     publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out["warnings"] = simple_metadata2namespaced_metadata(publication.errors, publicationid), simple_metadata2namespaced_metadata(publication.warnings, publicationid)
            else:
                publication.merge_form(form)
                publication.check_metadata()
                publication.check_projects()
                out["errors"], out["warnings"] = simple_metadata2namespaced_metadata(publication.errors, publicationid), simple_metadata2namespaced_metadata(publication.warnings, publicationid)
                if "".join(out["errors"].values()).strip():  # FIXME bad hack, we need a cleaner way to discover if there are errors
                    out['addclasses']['#status_%s' % publicationid] = 'error'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'warning ok empty'
                elif "".join(out["warnings"].values()).strip():
                    out['addclasses']['#status_%s' % publicationid] = 'warning'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'error ok empty'
                else:
                    out['addclasses']['#status_%s' % publicationid] = 'ok'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'warning error empty'

                if action == 'save':
                    out["substitutions"]['#publication_information_%s' % publicationid] = publication.get_publication_information()
                elif action == 'submit':
                    if not "".join(out["errors"].values()).strip():
                        publication.upload_record()
                        out["appends"]['#submitted_publications'] = publication.get_publication_preview()
                        out["showns"].append('#submitted_publications')
                        out["hiddens"].append('#header_row_%s' % publicationid)
                        out["hiddens"].append('#body_row_%s' % publicationid)
        req.content_type = 'application/json'
        return json.dumps(out)
예제 #3
0
def edit(pub_id=u'', action=u'edit'):
    """
    Edit an upload
    """
    uid = current_user.get_id()

    if action not in ['edit', 'save', 'delete', 'reserve-doi']:
        abort(404)

    try:
        pub = OpenAIREPublication(uid, publicationid=pub_id)
        title = pub.metadata.get('title', 'Untitled') or 'Untitled'
        editable = is_editable(pub)
    except ValueError:
        abort(404)

    # All POST requests change the publication, and are not allowed if the
    # publication is not editable anymore.
    if request.method == 'POST':
        if not editable:
            flash("You cannot edit an already submitted upload. Please contact %s if you would like to make changes!" % CFG_SITE_SUPPORT_EMAIL)
            return redirect(url_for('.edit', pub_id=pub.publicationid))

    #
    # Action handling
    #
    ctx = {}
    if action == 'reserve-doi':
        #
        # Reserve DOI action (AjAX)
        #
        if request.method == 'POST':
            doi = pub.create_doi()
            return json.dumps({'doi': doi})
        else:
            abort(405)
    elif action == 'delete':
        #
        # Delete action
        #
        if not editable:
            flash("You cannot delete an already submitted upload. Please contact %s if you would like to have it removed!" % CFG_SITE_SUPPORT_EMAIL)
            return redirect(url_for('.edit', pub_id=pub.publicationid))
        pub.delete()
        flash("Upload '%s' was deleted." % title, 'success')
        return redirect(url_for('.index'))
    elif action == 'edit':
        #
        # Edit action
        #
        upload_url = url_for('deposit.upload', pub_id=pub.publicationid)
        dropbox_upload_url = url_for('deposit.dropbox_upload', pub_id=pub.publicationid)

        ctx = {
            'pub': pub,
            'recid': pub.metadata.get('__recid__', None),
            'title': title,
            'is_editable': editable,
            'upload_url': upload_url,
            'dropbox_upload_url': dropbox_upload_url,
        }

        if request.method == 'POST':
            form = DepositionForm(request.values, crsf_enabled=False)
            mapper = DepositionFormMapper(pub)
            pub = mapper.map(form)
            form._pub = pub

            if form.validate():
                pub.save()
                pub.upload_record()
                flash("Upload was successfully submitted - it may take up 5 minutes before it has been fully integrated into %s." % CFG_SITE_NAME, category='success')
                return redirect(url_for('.index'))
            else:
                pub.save()
                ctx['form'] = form
                ctx['form_message'] = "The form was saved, but there were errors. Please see below."
        elif editable:
            mapper = PublicationMapper()
            form = DepositionForm(mapper.map(pub), crsf_enabled=False)
            ctx['form'] = form
        else:
            ctx['record_hd'] = format_record(recID=pub.recid, xml_record=pub.marcxml, ln=g.ln, of='hd')
            ctx['record_hdinfo'] = format_record(recID=pub.recid, xml_record=pub.marcxml, ln=g.ln, of='HDINFO')

    elif action == 'save':
        #
        # Save action (AjAX)
        #
        if request.method == 'POST':
            form = DepositionForm(request.values, crsf_enabled=False)
            mapper = DepositionFormMapper(pub)
            pub = mapper.map(form)
            form._pub = pub
            if form.validate():
                pub.save()
                return json.dumps({'status': 'success', 'form': 'Successfully saved.'})
            else:
                pub.save()
                errors = dict([(x, '') for x in form._fields.keys()])
                errors.update(form.errors)
                return json.dumps({
                    'status': 'warning',
                    'form': 'The form was saved, but there were errors. Please see below.',
                    'fields': errors,
                })
        else:
            abort(405)

    return render_template(
        "openaire_edit.html",
        myresearch=get_exisiting_publications_for_uid(current_user.get_id()),
        **ctx
    )
    def ajaxgateway(self, req, form):
        """
        """
        argd = wash_urlargd(
            form, {
                'projectid': (str, ''),
                'publicationid': (str, ''),
                'action': (str, ''),
                'current_field': (str, '')
            })

        # Get parameters
        action = argd['action']
        publicationid = argd['publicationid']
        projectid = argd['projectid']

        # Check if action is supported
        assert (action in ('save', 'verify_field', 'submit', 'unlinkproject',
                           'linkproject'))

        # JSON return dictionary
        out = {
            'errors': {},
            'warnings': {},
            'addclasses': {},
            'delclasses': {},
            'substitutions': {},
            'appends': {},
            'hiddens': [],
            'showns': [],
            'action': action,
        }

        if action == 'verify_field':
            current_field = argd['current_field']
            assert (current_field)
            metadata = wash_form(form, publicationid)
            out["errors"], out[
                "warnings"] = OpenAIREPublication.static_check_metadata(
                    metadata,
                    publicationid,
                    check_only_field=current_field,
                    ln=argd['ln'])
        else:
            user_info = collect_user_info(req)
            auth_code, auth_message = acc_authorize_action(user_info,
                                                           'submit',
                                                           doctype='OpenAIRE')
            assert (auth_code == 0)
            uid = user_info['uid']
            publication = OpenAIREPublication(uid,
                                              publicationid,
                                              ln=argd['ln'])
            if action == 'unlinkproject':
                publication.unlink_project(projectid)
                out["substitutions"][
                    "#projectsbox_%s" %
                    publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out[
                    "warnings"] = simple_metadata2namespaced_metadata(
                        publication.errors,
                        publicationid), simple_metadata2namespaced_metadata(
                            publication.warnings, publicationid)
            elif action == 'linkproject':
                publication.link_project(projectid)
                out["substitutions"][
                    "#projectsbox_%s" %
                    publicationid] = publication.get_projects_information()
                publication.check_projects()
                out["errors"], out[
                    "warnings"] = simple_metadata2namespaced_metadata(
                        publication.errors,
                        publicationid), simple_metadata2namespaced_metadata(
                            publication.warnings, publicationid)
            else:
                publication.merge_form(form)
                publication.check_metadata()
                publication.check_projects()
                out["errors"], out[
                    "warnings"] = simple_metadata2namespaced_metadata(
                        publication.errors,
                        publicationid), simple_metadata2namespaced_metadata(
                            publication.warnings, publicationid)
                if "".join(out["errors"].values()).strip(
                ):  # FIXME bad hack, we need a cleaner way to discover if there are errors
                    out['addclasses']['#status_%s' % publicationid] = 'error'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'warning ok empty'
                elif "".join(out["warnings"].values()).strip():
                    out['addclasses']['#status_%s' % publicationid] = 'warning'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'error ok empty'
                else:
                    out['addclasses']['#status_%s' % publicationid] = 'ok'
                    out['delclasses']['#status_%s' %
                                      publicationid] = 'warning error empty'

                if action == 'save':
                    out["substitutions"][
                        '#publication_information_%s' %
                        publicationid] = publication.get_publication_information(
                        )
                elif action == 'submit':
                    if not "".join(out["errors"].values()).strip():
                        publication.upload_record()
                        out["appends"][
                            '#submitted_publications'] = publication.get_publication_preview(
                            )
                        out["showns"].append('#submitted_publications')
                        out["hiddens"].append('#header_row_%s' % publicationid)
                        out["hiddens"].append('#body_row_%s' % publicationid)
        req.content_type = 'application/json'
        return json.dumps(out)
예제 #5
0
def edit(pub_id=u'', action=u'edit'):
    """
    Edit an upload
    """
    uid = current_user.get_id()

    if action not in ['edit', 'save', 'delete', 'reserve-doi']:
        abort(404)

    try:
        pub = OpenAIREPublication(uid, publicationid=pub_id)
        title = pub.metadata.get('title', 'Untitled') or 'Untitled'
        editable = is_editable(pub)
    except ValueError:
        abort(404)

    # All POST requests change the publication, and are not allowed if the
    # publication is not editable anymore.
    if request.method == 'POST':
        if not editable:
            flash(
                "You cannot edit an already submitted upload. Please contact %s if you would like to make changes!"
                % CFG_SITE_SUPPORT_EMAIL)
            return redirect(url_for('.edit', pub_id=pub.publicationid))

    #
    # Action handling
    #
    ctx = {}
    if action == 'reserve-doi':
        #
        # Reserve DOI action (AjAX)
        #
        if request.method == 'POST':
            doi = pub.create_doi()
            return json.dumps({'doi': doi})
        else:
            abort(405)
    elif action == 'delete':
        #
        # Delete action
        #
        if not editable:
            flash(
                "You cannot delete an already submitted upload. Please contact %s if you would like to have it removed!"
                % CFG_SITE_SUPPORT_EMAIL)
            return redirect(url_for('.edit', pub_id=pub.publicationid))
        pub.delete()
        flash("Upload '%s' was deleted." % title, 'success')
        return redirect(url_for('.index'))
    elif action == 'edit':
        #
        # Edit action
        #
        upload_url = url_for('deposit.upload', pub_id=pub.publicationid)
        dropbox_upload_url = url_for('deposit.dropbox_upload',
                                     pub_id=pub.publicationid)

        ctx = {
            'pub': pub,
            'recid': pub.metadata.get('__recid__', None),
            'title': title,
            'is_editable': editable,
            'upload_url': upload_url,
            'dropbox_upload_url': dropbox_upload_url,
        }

        if request.method == 'POST':
            form = DepositionForm(request.values, crsf_enabled=False)
            mapper = DepositionFormMapper(pub)
            pub = mapper.map(form)
            form._pub = pub

            if form.validate():
                pub.save()
                pub.upload_record()
                flash(
                    "Upload was successfully submitted - it may take up 5 minutes before it has been fully integrated into %s."
                    % CFG_SITE_NAME,
                    category='success')
                return redirect(url_for('.index'))
            else:
                pub.save()
                ctx['form'] = form
                ctx['form_message'] = "The form was saved, but there were errors. Please see below."
        elif editable:
            mapper = PublicationMapper()
            form = DepositionForm(mapper.map(pub), crsf_enabled=False)
            ctx['form'] = form
        else:
            ctx['record_hd'] = format_record(recID=pub.recid,
                                             xml_record=pub.marcxml,
                                             ln=g.ln,
                                             of='hd')
            ctx['record_hdinfo'] = format_record(recID=pub.recid,
                                                 xml_record=pub.marcxml,
                                                 ln=g.ln,
                                                 of='HDINFO')

    elif action == 'save':
        #
        # Save action (AjAX)
        #
        if request.method == 'POST':
            form = DepositionForm(request.values, crsf_enabled=False)
            mapper = DepositionFormMapper(pub)
            pub = mapper.map(form)
            form._pub = pub
            if form.validate():
                pub.save()
                return json.dumps({
                    'status': 'success',
                    'form': 'Successfully saved.'
                })
            else:
                pub.save()
                errors = dict([(x, '') for x in form._fields.keys()])
                errors.update(form.errors)
                return json.dumps({
                    'status': 'warning',
                    'form':
                    'The form was saved, but there were errors. Please see below.',
                    'fields': errors,
                })
        else:
            abort(405)

    return render_template("openaire_edit.html",
                           myresearch=get_exisiting_publications_for_uid(
                               current_user.get_id()),
                           **ctx)