示例#1
0
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)
示例#2
0
def _createAdvancedId(d, request, P):
    """ Like _createSimpleId, but also checks for elements on advanced create page:
      _status and _export variables; Adds datacite_xml if present. If no remainder
      is supplied, simply mints an ID                                         """
    # ToDo: Clean this up
    if d['current_profile'].name == 'datacite' and 'generated_xml' in d:
        to_write = {
            "_profile": 'datacite',
            '_target': P['target'],
            "_status": ("public" if P["publish"] == "True" else "reserved"),
            "_export": ("yes" if P["export"] == "yes" else "no"),
            "datacite": d['generated_xml'],
        }
    else:
        to_write = uic.assembleUpdateDictionary(
            request,
            d['current_profile'],
            {
                '_target': P['target'],
                "_status":
                ("public" if P["publish"] == "True" else "reserved"),
                "_export": ("yes" if P["export"] == "yes" else "no"),
            },
        )
    if P['remainder'] == '' or P[
            'remainder'] == form_objects.REMAINDER_BOX_DEFAULT:
        s = ezid.mintIdentifier(
            P['shoulder'], userauth.getUser(request, returnAnonymous=True),
            to_write)
    else:
        s = ezid.createIdentifier(
            P['shoulder'] + P['remainder'],
            userauth.getUser(request, returnAnonymous=True),
            to_write,
        )
    if s.startswith("success:"):
        new_id = s.split()[1]
        django.contrib.messages.success(request, _("Identifier Created."))
        d['id_gen_result'] = 'created_identifier: ' + new_id
    else:
        if "-" in s:
            err_msg = re.search(r'^error: .+?- (.+)$', s).group(1)
        else:
            err_msg = re.search(r'^error: (.+)$', s).group(1)
        django.contrib.messages.error(
            request,
            _("There was an error creating your identifier") + ": " + err_msg)
        d['accordions_open'] = 'open'
        d['id_gen_result'] = 'edit_page'
    return d
示例#3
0
def index(request):
    """ Manage Page, listing all Ids owned by user, or if groupadmin, all group users """
    d = {'menu_item': 'ui_manage.index'}
    d['collapse_advanced_search'] = "collapsed"
    if request.method != "GET":
        return uic.methodNotAllowed(request)
    noConstraintsReqd = True  # Empty 'manage' form means search everything
    d['q'] = ui_search.queryDict(request)
    user = userauth.getUser(request)
    d['owner_selected'] = (
        _defaultUser(user)
        if not ('owner_selected' in request.GET) or request.GET['owner_selected'] == ''
        else request.GET['owner_selected']
    )
    d['form'] = form_objects.ManageSearchIdForm(d['q'])
    # order_by and sort are initial sorting defaults. The request trumps these.
    d['order_by'] = 'c_update_time'
    d['sort'] = 'asc'
    d['owner_names'] = uic.owner_names(user, "manage")
    # Check if anything has actually been entered into search fields
    searchfields = {
        k: v
        for k, v in d['q'].items()
        if k not in [u'sort', u'ps', u'order_by', u'owner_selected']
    }
    searchfields = filter(None, searchfields.values())
    if searchfields:
        noConstraintsReqd = False
        d[
            'filtered'
        ] = True  # Flag for template to provide option of searching on all IDs
    d = ui_search.search(d, request, noConstraintsReqd, "manage")
    return uic.render(request, 'manage/index', d)
示例#4
0
def render(request, template, context={}):
    global alertMessage, google_analytics_id, reload_templates
    ctx = {
        "session": request.session,
        "authenticatedUser": userauth.getUser(request),
        "alertMessage": alertMessage,
        "feed_cache": newsfeed.getLatestItems(),
        "google_analytics_id": google_analytics_id,
        "debug": django.conf.settings.DEBUG,
    }
    ctx.update(context)
    try:
        templ = templates[template][0]
    except (TypeError, LookupError):
        templ = django.template.loader.get_template(templates[template][1])
    # TODO: Remove this temporary workaround and modify dynamically generated HTML
    # instead.
    templ.backend.engine.autoescape = False

    content = templ.render(ctx, request)
    # By setting the content type ourselves, we gain control over the
    # character encoding and can properly set the content length.
    ec = content.encode("UTF-8")
    r = django.http.HttpResponse(ec, content_type="text/html; charset=UTF-8")
    r["Content-Length"] = len(ec)
    return r
示例#5
0
def download(request):
    """
  Enqueue a batch download request and display link to user
  """
    d = {'menu_item': 'ui_manage.null'}
    q = django.http.QueryDict(
        "format=csv&convertTimestamps=yes&compression=zip", mutable=True)
    q.setlist('column', [
        "_mappedTitle", "_mappedCreator", "_id", "_owner", "_created",
        "_updated", "_status"
    ])

    # In case you only want to download IDs based on owner selection:
    # username = uic.getOwnerOrGroup(request.GET['owner_selected'])
    # q['owner'] = ezidapp.models.StoreUser.objects.get(name=username)
    user = userauth.getUser(request)
    q['notify'] = d['mail'] = user.accountEmail
    # ToDo make changes to download.enqueueRequest() to accept multiple groups
    # if user.isRealmAdministrator: q['ownergroup'] = [g.groupname for g in user.realm.groups.all()]
    if user.isGroupAdministrator: q['ownergroup'] = user.group.groupname
    else: q['owner'] = user.username
    s = ezid_download.enqueueRequest(user, q)
    if not s.startswith("success:"):
        django.contrib.messages.error(request, s)
        return redirect("ui_manage.index")
    else:
        d['link'] = s.split()[1]
    return uic.render(request, "manage/download", d)
示例#6
0
 def wrap(request, *args, **kwargs):
     if userauth.getUser(request) == None:
         django.contrib.messages.error(
             request, _('You must be logged in to view this page.'))
         return django.http.HttpResponseRedirect("/login?next=" +\
           django.utils.http.urlquote(request.get_full_path()))
     return f(request, *args, **kwargs)
示例#7
0
 def wrap(request, *args, **kwargs):
     if not userauth.getUser(request, returnAnonymous=True).isSuperuser:
         django.contrib.messages.error(
             request,
             _('You must be logged in as an administrator to view this page.'
               ))
         return django.http.HttpResponseRedirect("/login?next=" +\
           django.utils.http.urlquote(request.get_full_path()))
     return f(request, *args, **kwargs)
示例#8
0
def _getLatestMetadata(identifier, request, prefixMatch=False):
    """
  The successful return is a pair (status, dictionary) where 'status' is a
  string that includes the canonical, qualified form of the identifier, as in:
    success: doi:10.5060/FOO
  and 'dictionary' contains element (name, value) pairs.
  """
    return ezid.getMetadata(
        identifier, userauth.getUser(request, returnAnonymous=True), prefixMatch
    )
示例#9
0
def hasBrokenLinks(d, request):
    """
  Flag if any IDs are found satisfying hasIssues=true and linkIsBroken=true
  """
    user_id, group_id = uic.getOwnerOrGroup(d['owner_selected'] if 'owner_selected'\
      in d else None)
    c = _buildAuthorityConstraints(request, "issues", user_id, group_id)
    c['hasIssues'] = True
    c['linkIsBroken'] = True
    return search_util.executeSearch(
        userauth.getUser(request, returnAnonymous=True), c, 0, 1)
示例#10
0
def dashboard(request):
    """ 
  ID Issues and Crossref tables load for the first time w/o ajax
  All subsequent searches are done via ajax (ajax_dashboard_table method below)
  """
    d = {'menu_item': 'ui_admin.dashboard'}
    user = userauth.getUser(request)
    d['heading_user_display'] = user.displayName + "'s EZID " + _("Dashboard")
    d['display_adminlink'] = user.isSuperuser
    if request.method == "GET":
        REQUEST = request.GET
    elif request.method == "POST":
        REQUEST = request.POST
    else:
        return uic.methodNotAllowed(request)
    if not ('owner_selected' in REQUEST) or REQUEST['owner_selected'] == '':
        d['owner_selected'] = (
            None
            if user.isSuperuser
            else "realm_" + user.realm.name
            if user.isRealmAdministrator
            else "group_" + user.group.groupname
            if user.isGroupAdministrator
            else "user_" + user.username
        )
    else:
        d['owner_selected'] = REQUEST['owner_selected']
    d['owner_names'] = uic.owner_names(user, "dashboard")
    d = _getUsage(REQUEST, user, d)
    d['ajax'] = False

    # Search:    ID Issues
    d = ui_search.search(d, request, NO_CONSTRAINTS, "issues")
    # UI Tables need data named uniquely to distinguish them apart
    d['results_issues'] = d['results']
    d['total_pages_issues'] = d['total_pages']
    d['field_display_types_issues'] = d['field_display_types']
    d['fields_selected_issues'] = d['fields_selected']

    d['has_broken_links'] = ui_search.hasBrokenLinks(d, request)
    if d['has_broken_links']:
        d['accountEmail'] = user.accountEmail

    # Search:    Crossref Submission Status
    d = ui_search.search(d, request, NO_CONSTRAINTS, "crossref")
    d['order_by'] = 'c_crossref_date'
    d['sort'] = 'asc'
    d['results_crossref'] = d['results']
    d['total_pages_crossref'] = d['total_pages']
    d['field_display_types_crossref'] = d['field_display_types']
    d['fields_selected_crossref'] = d['fields_selected']
    return uic.render(request, 'dashboard/index', d)
示例#11
0
def ajax_dashboard_table(request):
    if request.is_ajax():
        user = userauth.getUser(request)
        G = request.GET
        d = {}
        d['owner_selected'] = G[
            'owner_selected'] if 'owner_selected' in G else user.username
        d['p'] = G.get('p')
        if 'name' in G and d['p'] is not None and d['p'].isdigit():
            d['ajax'] = True
            d['s_type'] = G['name']
            d = ui_search.search(d, request, NO_CONSTRAINTS, G['name'])
            return uic.render(request, "dashboard/_" + G['name'], d)
示例#12
0
def advanced(request):
    d = {'menu_item': 'ui_create.advanced'}
    d["testPrefixes"] = uic.testPrefixes
    user = userauth.getUser(request)
    if user.isSuperuser:
        shoulders = [
            s for s in ezidapp.models.getAllShoulders() if not s.isTest
        ]
    else:
        shoulders = user.shoulders.all()
    d["prefixes"] = sorted([{ "namespace": s.name, "prefix": s.prefix } for\
      s in shoulders],
      key=lambda p: ("%s %s" % (p["namespace"], p["prefix"])).lower())
    if len(d['prefixes']) < 1:
        return uic.render(request, 'create/no_shoulders', d)
    d = adv_form(request, d)
    return uic.renderIdPage(request, 'create/advanced', d)
示例#13
0
def _createSimpleId(d, request, P):
    s = ezid.mintIdentifier(
        request.POST['shoulder'],
        userauth.getUser(request, returnAnonymous=True),
        uic.assembleUpdateDictionary(request, d['current_profile'], {
            '_target': P['target'],
            '_export': 'yes'
        }))
    if s.startswith("success:"):
        new_id = s.split()[1]
        django.contrib.messages.success(request, _("Identifier Created."))
        d['id_gen_result'] = "created_identifier: " + new_id
    else:
        err = _("Identifier could not be created as submitted") + ": " + s
        django.contrib.messages.error(request, err)
        d['id_gen_result'] = 'edit_page'
    return d
示例#14
0
def _createSimpleId(d, request, P):
    s = ezid.mintIdentifier(
        request.POST["shoulder"],
        userauth.getUser(request, returnAnonymous=True),
        uic.assembleUpdateDictionary(request, d["current_profile"], {
            "_target": P["target"],
            "_export": "yes"
        }),
    )
    if s.startswith("success:"):
        new_id = s.split()[1]
        django.contrib.messages.success(request, _("Identifier Created."))
        d["id_gen_result"] = "created_identifier: " + new_id
    else:
        err = _("Identifier could not be created as submitted") + ": " + s
        django.contrib.messages.error(request, err)
        d["id_gen_result"] = "edit_page"
    return d
示例#15
0
def _buildAuthorityConstraints(request,
                               s_type="public",
                               owner=None,
                               ownergroup=None):
    """ 
  A logged in user can use (public) Search page, but this would not limit the
  results to just their IDs. It would also include all public IDs.
  owner = username of owner; ownergroup = group name 
  """
    if s_type == "public" or userauth.getUser(request) == None:
        c = {'publicSearchVisible': True}
    else:
        assert owner or ownergroup, "Owner information missing"
        c = {
            'owner': owner
        } if (ownergroup == None) else {
            'ownergroup': ownergroup
        }
    return c
示例#16
0
def _updateEzid(request, d, stts, m_to_upgrade=None):
    """
  Takes data from form fields in /manage/edit and applies them to IDs metadata
  If m_to_upgrade is specified, converts record to advanced datacite 
  Returns ezid.setMetadata (successful return is the identifier string)
  Also removes tags related to old profile if converting to advanced datacite
  """
    m_dict = {
        '_target': request.POST['target'],
        '_status': stts,
        '_export': ('yes' if
                    (not 'export' in d) or d['export'] == 'yes' else 'no')
    }
    if m_to_upgrade:
        d['current_profile'] = metadata.getProfile('datacite')
        # datacite_xml ezid profile is defined by presence of 'datacite' assigned to the
        # '_profile' key and XML present in the 'datacite' key
        m_dict['datacite'] = datacite.formRecord(d['id_text'], m_to_upgrade,
                                                 True)
        m_dict['_profile'] = 'datacite'
        # Old tag cleanup
        if m_to_upgrade.get("_profile", "") == "datacite":
            m_dict['datacite.creator'] = ''
            m_dict['datacite.publisher'] = ''
            m_dict['datacite.publicationyear'] = ''
            m_dict['datacite.title'] = ''
            m_dict['datacite.type'] = ''
        if m_to_upgrade.get("_profile", "") == "dc":
            m_dict['dc.creator'] = ''
            m_dict['dc.date'] = ''
            m_dict['dc.publisher'] = ''
            m_dict['dc.title'] = ''
            m_dict['dc.type'] = ''
        if m_to_upgrade.get("_profile", "") == "erc":
            m_dict['erc.who'] = ''
            m_dict['erc.what'] = ''
            m_dict['erc.when'] = ''
    # ToDo: Using current_profile here, but isn't this confusing if executing simpleToAdvanced
    to_write = uic.assembleUpdateDictionary(request, d['current_profile'],
                                            m_dict)
    return ezid.setMetadata(d['id_text'],
                            userauth.getUser(request, returnAnonymous=True),
                            to_write)
示例#17
0
def render(request, template, context={}):
    global alertMessage, google_analytics_id, reload_templates
    c = {
        "session": request.session,
        "authenticatedUser": userauth.getUser(request),
        "alertMessage": alertMessage,
        "feed_cache": newsfeed.getLatestItems(),
        "google_analytics_id": google_analytics_id,
        "debug": django.conf.settings.DEBUG
    }
    c.update(context)
    #this is to keep from having to restart the server every 3 seconds
    #to see template changes in development, only reloads if set for optimal performance
    if reload_templates:
        templ = django.template.loader.get_template(templates[template][1])
    else:
        templ = templates[template][0]
    content = templ.render(django.template.RequestContext(request, c))
    # By setting the content type ourselves, we gain control over the
    # character encoding and can properly set the content length.
    ec = content.encode("UTF-8")
    r = django.http.HttpResponse(ec, content_type="text/html; charset=UTF-8")
    r["Content-Length"] = len(ec)
    return r
示例#18
0
def csvStats(request):
    """
  Returns all statistics to which a user is entitled as a CSV file.
  'requestor' is the user, and should be a StoreUser object.  The
  statistics include those for the requestor; and all users (if the
  requestor is a superuser) or all users in the requestor's realm (if
  the requestor is a realm administrator) or all users in the
  requestor's group (if the requestor is a group administrator); plus
  any users the requestor is a proxy for.  The CSV file is returned as
  a single string.  The columns are:

  owner
  ownergroup
  month
  ARKs with metadata
  ARKs without metadata
  total ARKs
  DOIs with metadata
  DOIs without metadata
  total DOIs

  Rows are grouped by user; the order of users in the CSV file is
  undefined.  For a given user, rows are ordered by month, and the
  rows are complete with respect to the range of months, as described
  in stats.Stats.getTable().
  """
    requestor = userauth.getUser(request)
    users = set([requestor])
    if requestor.isSuperuser:
        for u in ezidapp.models.StoreUser.objects.all():
            users.add(u)
    elif requestor.isRealmAdministrator:
        for g in requestor.realm.groups.all():
            for u in g.users.all():
                users.add(u)
    elif requestor.isGroupAdministrator:
        for u in requestor.group.users.all():
            users.add(u)
    for u in requestor.proxy_for.all():
        users.add(u)
    f = StringIO.StringIO()
    w = csv.writer(f)
    w.writerow(
        [
            "owner",
            "ownergroup",
            "month",
            "ARKs with metadata",
            "ARKs without metadata",
            "ARKs total",
            "DOIs with metadata",
            "DOIs without metadata",
            "DOIs total",
        ]
    )
    for u in users:
        for r in stats.getTable(owner=u.pid):
            outputRow = [u.username, u.group.groupname, r[0]]
            for type in ["ARK", "DOI"]:
                t = 0
                for hasMetadata in [True, False]:
                    v = r[1].get((type, hasMetadata), 0)
                    outputRow.append(str(v))
                    t += v
                outputRow.append(str(t))
            w.writerow(outputRow)
    fn = "EZID_" + requestor.username + datetime.now().strftime("%Y%m%d-%H%M%S")
    return uic.csvResponse(f.getvalue(), fn)
示例#19
0
def tombstone(request):
    """
  Renders a tombstone (i.e., unavailable identifier) page.
  """
    if request.method != "GET": return uic.methodNotAllowed(request)
    assert request.path_info.startswith("/tombstone/id/")
    id = request.path_info[14:]
    if "auth" in request.session:
        r = ezid.getMetadata(id, userauth.getUser(request,
                                                  returnAnonymous=True))
    else:
        r = ezid.getMetadata(id)
    if type(r) is str:
        messages.error(request, uic.formatError(r))
        return uic.redirect("/")
    s, m = r
    assert s.startswith("success:")
    id = s[8:].strip()
    if not m["_status"].startswith("unavailable"):
        return uic.redirect("/id/%s" % urllib.quote(id, ":/"))
    status = m["_status"]
    reason = tombstone_text
    if "|" in m["_status"]:
        status = m["_status"].split("|", 1)[0].strip()
        # Translators: Output for tombstone page (unavailable IDs)
        reason += " " + _("Reason:") + " " + m["_status"].split("|",
                                                                1)[1].strip()
    htmlMode = False
    if m["_profile"] == "datacite" and "datacite" in m:
        md = datacite.dcmsRecordToHtml(m["datacite"])
        if md:
            htmlMode = True
            root = lxml.etree.fromstring(md)
            # Tack on an additional row displaying status
            row = lxml.etree.Element("tr", attrib={"class": "dcms_element"})
            c1 = lxml.etree.SubElement(row,
                                       "th",
                                       attrib={"class": "dcms_label"})
            c1.text = _("Status:")
            c2 = lxml.etree.SubElement(row,
                                       "td",
                                       attrib={"class": "dcms_value"})
            c2.text = status
            root.append(row)
            md = lxml.etree.tostring(root)
    if not htmlMode:
        # This echoes the Merritt hack above.
        if m["_profile"] == "erc" and m.get("erc", "").strip() != "":
            md = [{"label": "ERC", "value": m["erc"].strip()}]
        else:
            p = metadata.getProfile(m["_profile"])
            if not p: p = metadata.getProfile("erc")
            md = []
            for e in p.elements:
                if "." not in e.name: continue
                v = m.get(e.name, "").strip()
                md.append({
                    "label": e.displayName,
                    "value": v if v != "" else "(no value)"
                })
        # Tack on an additional row displaying status
        md.append({"label": _("Status"), "value": status})
    return uic.render(
        request, "tombstone", {
            "identifier": id,
            "identifierLink": "/id/%s" % urllib.quote(id, ":/"),
            "reason": reason,
            "htmlMode": htmlMode,
            "metadata": md
        })
示例#20
0
def search(d, request, noConstraintsReqd=False, s_type="public"):
    """ 
  Run query and organize result set for UI, used for Search, Manage, and Dashboard pages.
  * noConstraintsReqd==True is used by pages that don't require form validation (dashboard, and
    manage page, whose form is unbound/unvalidated if nothing has been entered/posted.
  * If s_type=="public", don't include owner credentials in constraints.
  * 'filtered' means form fields have been submitted w/a search request 
    (useful to know this for the manage page)
  * use owner or ownergroup, not both, otherwise ownergroup takes precedence
  """
    d['REQUEST'] = request.GET
    d = _pageLayout(d, request.GET, s_type)
    if noConstraintsReqd or 'form' in d and d['form'].is_valid():
        # Build dictionary of search constraints
        user_id, group_id = uic.getOwnerOrGroup(d['owner_selected'] if 'owner_selected'\
          in d else None)
        c = _buildAuthorityConstraints(request, s_type, user_id, group_id)
        if s_type in ('public', 'manage'):
            d['queries_urlencoded'] = queryUrlEncoded(
                request)  # Used for Google Analytics
            q = d['q'] if 'q' in d and d['q'] else request.GET
            q2 = {}
            for k, v in q.iteritems():
                q2[k] = q[k].strip() if isinstance(v, basestring) else q[k]
            # Move searches for IDs in keyword field to identifier field.  I wanted to put this in
            # form's clean() function but unable to modify field values that route. I think I need to
            # explicitly override the form's __init__ method
            if 'keywords' in q2:
                kw = re.sub('[\"\']', '', q2['keywords'])
                if kw.lower().startswith(("doi:", "ark:/", "uuid:")) and \
                  (' ' not in kw) and uic.isEmptyStr(q2.get('identifier','')):
                    q2['keywords'] = ''
                    q2['identifier'] = kw
            if d['filtered']:
                c = _buildConstraints(c, q2, s_type)
                c = _buildTimeConstraints(c, q2, s_type)
        elif s_type == 'issues':
            d['sort'] = 'asc'  # Default sort is on update_time descending
            c['hasIssues'] = True
            c['crossref'] = False
        elif s_type == 'crossref':
            d['sort'] = 'asc'
            c['crossref'] = True
            c['crossrefStatus'] = [
                ezidapp.models.Identifier.CR_RESERVED,
                ezidapp.models.Identifier.CR_WORKING,
                ezidapp.models.Identifier.CR_WARNING,
                ezidapp.models.Identifier.CR_FAILURE
            ]
        d['total_results'] = search_util.executeSearchCountOnly(
            userauth.getUser(request, returnAnonymous=True), c)
        d['total_results_str'] = format(d['total_results'], "n")
        d['total_pages'] = int(
            math.ceil(float(d['total_results']) / float(d['ps'])))
        if d['p'] > d['total_pages']: d['p'] = d['total_pages']
        d['p'] = max(d['p'], 1)
        if d['order_by']:
            orderColumn = FIELDS_MAPPED[d['order_by']][0]
            if IS_ASCENDING[d['sort']]: orderColumn = "-" + orderColumn
        else:
            orderColumn = None
        d['results'] = []
        rec_beg = (d['p'] - 1) * d['ps']
        rec_end = d['p'] * d['ps']
        for id in search_util.executeSearch(
                userauth.getUser(request, returnAnonymous=True), c, rec_beg,
                rec_end, orderColumn):
            if s_type in ('public', 'manage'):
                result = {
                    "c_create_time": id.createTime,
                    "c_identifier": id.identifier,
                    "c_title": _truncateStr(id.resourceTitle),
                    "c_creator": _truncateStr(id.resourceCreator),
                    "c_owner": id.owner.username,
                    "c_object_type": id.resourceType,
                    "c_publisher": _truncateStr(id.resourcePublisher),
                    "c_pubyear": _truncateStr(id.resourcePublicationDate),
                    "c_id_status": id.get_status_display(),
                    "c_update_time": id.updateTime,
                }
                if id.isUnavailable and id.unavailableReason != "":
                    result["c_id_status"] += " | " + id.unavailableReason
            elif s_type == 'issues':
                result = {
                    "c_identifier": id.identifier,
                    "c_id_issue": "",
                    "c_title": _truncateStr(id.resourceTitle),
                    "c_update_time": id.updateTime,
                }
                ir = id.issueReasons()
                if ir:
                    result["c_id_issue"] += "; ".join(ir)
            elif s_type == 'crossref':
                result = {
                    "c_identifier": id.identifier,
                    "c_crossref_date": id.createTime,
                    "c_crossref_descr": id.get_crossrefStatus_display(),
                }
                if id.isCrossrefGood and id.crossrefStatus in [
                        id.CR_WORKING, id.CR_RESERVED
                ]:
                    result["c_crossref_msg"] = _("No action necessary")
                else:
                    result["c_crossref_msg"] = id.crossrefMessage
            d['results'].append(result)
        # end of result iteration loop
        if s_type == "public":
            rec_range = '0'
            if d['total_results'] > 0:
                rec_range = str(rec_beg + 1) +  " " + _("to") +  " " +\
                   str(min(rec_end, d['total_results'])) + " " + _("of") + " " +  d['total_results_str']
            d['heading_title'] = _("Showing") + " " + rec_range + " " + _(
                "Search Results")
            d['search_query'] = _buildQuerySyntax(c)
        else:
            if d['filtered']:
                d['heading_title'] = d['total_results_str'] + " " + _(
                    "matches found")
            else:
                d['heading_title'] = _(
                    "Your Identifiers") + " (" + d['total_results_str'] + ")"
        d['search_success'] = True
    else:  # Form did not validate
        d['collapse_advanced_search'] = ""  # Open up adv. search html block
        if '__all__' in d['form'].errors:
            # non_form_error, probably due to all fields being empty
            all_errors = ''
            errors = d['form'].errors['__all__']
            for e in errors:
                all_errors += e
            django.contrib.messages.error(
                request,
                _("Could not complete search.") + "   " + all_errors)
        else:
            err = _(
                "Could not complete search.  Please check the highlighted fields below for details."
            )
            django.contrib.messages.error(request, err)
        d['search_success'] = False
    return d
示例#21
0
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)
示例#22
0
def edit(request):
    """Edit account information form"""
    d = {'menu_item': 'ui_account.edit'}
    user = userauth.getUser(request)
    d["username"] = user.username

    proxies_orig = [
        u.username for u in user.proxies.all().order_by("username")
    ]
    pusers = {u.username: u.displayName for u in\
      allUsersInRealm(user) if u.displayName != user.displayName}
    d['proxy_users_choose'] = sorted(pusers.items(),
                                     key=operator.itemgetter(0))
    if request.method == "GET":
        d['primaryContactName'] = user.primaryContactName
        d['primaryContactEmail'] = user.primaryContactEmail
        d['primaryContactPhone'] = user.primaryContactPhone
        d['secondaryContactName'] = user.secondaryContactName
        d['secondaryContactEmail'] = user.secondaryContactEmail
        d['secondaryContactPhone'] = user.secondaryContactPhone
        d['accountDisplayName'] = user.displayName
        d['accountEmail'] = user.accountEmail
        d['crossrefEmail'] = user.crossrefEmail
        proxy_for_list = user.proxy_for.all().order_by("username")
        d['proxy_for'] = "<br/> ".join("[" + u.username + "]&nbsp;&nbsp;&nbsp;" + u.displayName \
          for u in proxy_for_list) if proxy_for_list else "None"
        d['proxies_default'] = proxies_default
        d['proxy_users_picked_list'] = json.dumps(proxies_orig)
        d['proxy_users_picked'] = ', '.join(
            proxies_orig if proxies_orig else [proxies_default])
        d['form'] = form_objects.UserForm(d,
                                          user=user,
                                          username=d['username'],
                                          pw_reqd=False)
    elif request.method == "POST":
        d['form'] = form_objects.UserForm(request.POST,
                                          initial=d,
                                          user=user,
                                          username=d['username'],
                                          pw_reqd=False)
        basic_info_changed = False
        newProxies = None
        if d['form'].is_valid():
            if d['form'].has_changed():
                basic_info_changed = any(ch in d['form'].changed_data
                                         for ch in ACCOUNT_FIELDS_EDITABLE)
                if request.POST['proxy_users_picked'] not in [
                        "", proxies_default
                ]:
                    newProxies = _getNewProxies(user, proxies_orig, [x.strip() for x in\
                      request.POST['proxy_users_picked'].split(",")])
            _update_edit_user(request, user, newProxies, basic_info_changed)
        else:  # Form did not validate
            if '__all__' in d['form'].errors:
                # non_form_error, probably due to all fields being empty
                all_errors = ''
                errors = d['form'].errors['__all__']
                for e in errors:
                    all_errors += e
                messages.error(
                    request,
                    _("Change(s) could not be made.   ") + all_errors)
            else:
                err = _(
                    "Change(s) could not be made.  Please check the highlighted field(s) below for details."
                )
                messages.error(request, err)
    else:
        return uic.methodNotAllowed(request)
    return uic.render(request, "account/edit", d)