def details(request): """ ID Details page for a given ID """ d = {'menu_item': 'ui_manage.null'} d["testPrefixes"] = uic.testPrefixes identifier = request.path_info[len("/id/"):] r = _getLatestMetadata(identifier, request, prefixMatch=(request.GET.get( "prefix_match", "no").lower() == "yes")) if type(r) is str: django.contrib.messages.error( request, uic.formatError(r + ": " + identifier)) # ToDo: Pass details in from previous screen so we know where to send redirect back to if userauth.getUser(request) == None: return redirect("ui_search.index") else: return redirect("ui_home.index") s, id_metadata = r assert s.startswith("success:") if " in_lieu_of " in s: newid = s.split()[1] django.contrib.messages.info( request, "Identifier %s returned in lieu of %s." % (newid, identifier)) return redirect("/id/" + urllib.quote(newid, ":/")) d['allow_update'] = policy.authorizeUpdateLegacy( userauth.getUser(request, returnAnonymous=True), id_metadata["_owner"], id_metadata["_ownergroup"]) d['identifier'] = id_metadata d['id_text'] = s.split()[1] d['id_as_url'] = util2.urlForm(d['id_text']) d['is_test_id'] = _isTestId(d['id_text'], d['testPrefixes']) d['internal_profile'] = metadata.getProfile('internal') d['target'] = id_metadata['_target'] d['current_profile'] = metadata.getProfile(id_metadata['_profile']) or\ metadata.getProfile('erc') d['recent_creation'] = identifier.startswith('doi') and \ (time.time() - float(id_metadata['_created']) < 60 * 30) d['recent_update'] = identifier.startswith('doi') and \ (time.time() - float(id_metadata['_updated']) < 60 * 30) if d['current_profile'].name == 'datacite' and 'datacite' in id_metadata: r = datacite.dcmsRecordToHtml(id_metadata["datacite"]) if r: d['datacite_html'] = r if d['current_profile'].name == 'crossref' and 'crossref' in id_metadata and \ id_metadata['crossref'].strip() != "": d['has_crossref_metadata'] = True t_stat = [x.strip() for x in id_metadata['_status'].split("|", 1)] d['pub_status'] = t_stat[0] if t_stat[0] == 'unavailable' and len(t_stat) > 1: d['stat_reason'] = t_stat[1] if t_stat[0] == 'public' and identifier.startswith("ark:/"): d['schemaDotOrgMetadata'] = _schemaDotOrgMetadata( mapping.map(id_metadata), d['id_as_url']) d['has_block_data'] = uic.identifier_has_block_data(id_metadata) d['has_resource_type'] = True if (d['current_profile'].name == 'datacite' \ and 'datacite.resourcetype' in id_metadata \ and id_metadata['datacite.resourcetype'] != '') else False return uic.render(request, "manage/details", d)
def edit(request, identifier): """ Edit page for a given ID """ d = {'menu_item': 'ui_manage.null'} d["testPrefixes"] = uic.testPrefixes r = _getLatestMetadata(identifier, request) if type(r) is str: django.contrib.messages.error(request, uic.formatError(r)) return redirect("ui_manage.index") s, id_metadata = r if not policy.authorizeUpdateLegacy( userauth.getUser(request, returnAnonymous=True), id_metadata["_owner"], id_metadata["_ownergroup"], ): django.contrib.messages.error( request, _( "You are not allowed to edit this identifier. " + "If this ID belongs to you and you'd like to edit, please log in." ), ) return redirect("/id/" + urllib.quote(identifier, ":/")) d['identifier'] = id_metadata t_stat = [x.strip() for x in id_metadata['_status'].split("|", 1)] d['pub_status'] = t_stat[0] d['orig_status'] = t_stat[0] d['stat_reason'] = None if t_stat[0] == 'unavailable' and len(t_stat) > 1: d['stat_reason'] = t_stat[1] d['export'] = id_metadata['_export'] if '_export' in id_metadata else 'yes' d['id_text'] = s.split()[1] d['id_as_url'] = util2.urlForm(d['id_text']) d['internal_profile'] = metadata.getProfile('internal') d['profiles'] = metadata.getProfiles()[1:] if request.method == "GET": d['is_test_id'] = _isTestId(d['id_text'], d['testPrefixes']) if '_profile' in id_metadata: d['current_profile'] = metadata.getProfile(id_metadata['_profile']) else: d['current_profile'] = metadata.getProfile('dc') if d['current_profile'].name == 'datacite' and 'datacite' in id_metadata: d = _assignManualTemplate(d) # Testing # xml = datacite_xml.temp_mockxml() # form_coll = datacite_xml.dataciteXmlToFormElements(xml) form_coll = datacite_xml.dataciteXmlToFormElements( d['identifier']['datacite'] ) # This is the only item from internal profile that needs inclusion in django form framework form_coll.nonRepeating['target'] = id_metadata['_target'] d['form'] = form_objects.getIdForm_datacite_xml(form_coll, request) if not form_objects.isValidDataciteXmlForm(d['form']): django.contrib.messages.error(request, FORM_VALIDATION_ERROR_ON_LOAD) else: if "form_placeholder" not in d: d['form_placeholder'] = None d['form'] = form_objects.getIdForm( d['current_profile'], d['form_placeholder'], id_metadata ) if not d['form'].is_valid(): django.contrib.messages.error(request, FORM_VALIDATION_ERROR_ON_LOAD) elif request.method == "POST": P = request.POST d['pub_status'] = P['_status'] if '_status' in P else d['pub_status'] d['stat_reason'] = P['stat_reason'] if 'stat_reason' in P else d['stat_reason'] d['export'] = P['_export'] if '_export' in P else d['export'] ''' Profiles could previously be switched in edit template, thus generating posibly two differing profiles (current vs original). So we previously did a check here to confirm current_profile equals original profile before saving.''' d['current_profile'] = metadata.getProfile( P.get('original_profile', d['identifier']['_profile']) ) if P['_status'] == 'unavailable': stts = P['_status'] + " | " + P['stat_reason'] else: stts = P['_status'] if d['current_profile'].name == 'datacite' and 'datacite' in id_metadata: d = _assignManualTemplate(d) d = ui_create.validate_adv_form_datacite_xml(request, d) if 'id_gen_result' in d: return uic.render(request, 'manage/edit', d) # ID Creation page else: assert 'generated_xml' in d to_write = { "_profile": 'datacite', '_target': P['target'], "_status": stts, "_export": d['export'], "datacite": d['generated_xml'], } s = ezid.setMetadata( P['identifier'], userauth.getUser(request, returnAnonymous=True), to_write, ) if s.startswith("success:"): _alertMessageUpdateSuccess(request) return redirect("/id/" + urllib.quote(identifier, ":/")) else: _alertMessageUpdateError(request, s) else: """ Even if converting from simple to advanced, let's make sure forms validate and update identifier first, else don't upgrade. """ d['form'] = form_objects.getIdForm(d['current_profile'], None, P) if d['form'].is_valid(): result = _updateEzid(request, d, stts) if not result.startswith("success:"): d['current_profile'] = metadata.getProfile(id_metadata['_profile']) _alertMessageUpdateError(request, result) return uic.render(request, "manage/edit", d) else: if 'simpleToAdvanced' in P and P['simpleToAdvanced'] == 'True': # Convert simple ID to advanced (datacite with XML) result = _updateEzid(request, d, stts, id_metadata) r = _getLatestMetadata(identifier, request) if type(r) is str: django.contrib.messages.error(request, uic.formatError(r)) return redirect("ui_manage.index") s, id_metadata = r if not result.startswith("success:"): # if things fail, just display same simple edit page with error _alertMessageUpdateError(request, result) else: _alertMessageUpdateSuccess(request) return redirect("/id/" + urllib.quote(identifier, ":/")) else: _alertMessageUpdateSuccess(request) return redirect("/id/" + urllib.quote(identifier, ":/")) else: return uic.methodNotAllowed(request) return uic.render(request, "manage/edit", d)
def active_id_display(id_text, testPrefixes): return '<a href="' + util2.urlForm(id_text) + '">' + util2.urlForm( id_text) + '</a>'
def full_url_to_id_details_urlencoded(context, id_text): """return URL form of identifier, URL-encoded""" return urllib.quote(util2.urlForm(id_text))
def full_url_to_id_details(context, id_text): """return URL form of identifier""" return util2.urlForm(id_text)