diff --git a/modules/bibcatalog/lib/bibcatalog_system.py b/modules/bibcatalog/lib/bibcatalog_system.py
index 2614e452e..6fff09e29 100644
--- a/modules/bibcatalog/lib/bibcatalog_system.py
+++ b/modules/bibcatalog/lib/bibcatalog_system.py
@@ -1,155 +1,156 @@
# -*- coding: utf-8 -*-
##
## This file is part of CDS Invenio.
## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 CERN.
##
## CDS Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## CDS Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with CDS Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
"""
Provide a "ticket" interface with a request tracker.
Please see the help/hacking/bibcatalog-api page for details.
This is a base class that cannot be instantiated.
"""
from invenio.webuser import get_user_preferences
class BibCatalogSystem:
""" A template class for ticket support."""
- TICKET_ATTRIBUTES = ['ticketid', 'priority', 'recordid', 'subject', 'text', 'creator', 'owner', 'date', 'status', 'queue', 'url_display', 'url_close']
+ TICKET_ATTRIBUTES = ['ticketid', 'priority', 'recordid', 'subject', 'text', 'creator', 'owner', 'date', 'status', 'queue', 'url_display', 'url_modify', 'url_close']
def check_system(self, uid):
"""Check connectivity. Return a string describing the error or an empty str
@param uid: invenio user id
@type uid: number
@return: empty string on success. Otherwise a string describing error.
@rtype: string
"""
return "this class cannot be instantiated"
def ticket_search(self, uid, recordid=-1, subject="", text="", creator="", owner="", \
date_from="", date_until="", status="", priority=""):
"""Search for tickets based on various criteria. Return an array of ticket numbers
@param uid: invenio user id.
@type uid: number
@param recordid: search criteria - ticket contains this record id.
@type recordid: number
@param subject: search criteria - ticket has this subject (substr).
@type subject: string
@param text: search criteria - ticket has this text in body (substr).
@type text: string
@param creator: search criteria - ticket creator's id.
@type creator: number
@param owner: search criteria - ticket owner's id.
@type owner: number
@param date_from: search criteria - ticket created starting from this date. Example: '2009-01-24'
@type date_until: date in yyyy-mm-dd format
@param date_until: search criteria - ticket created until from this date. Example: '2009-01-24'
@type date_from: date in yyyy-mm-dd format
@param status: search criteria - ticket has this status. Example: 'resolved'.
@type status: string
@param priority: search criteria - ticket priority number.
@type priority: number.
"""
pass
def ticket_submit(self, uid, subject, recordid, text="", queue="", priority="", owner=""):
- """submit a ticket. Return 1 on success
+ """submit a ticket. Return ticket number on success, otherwise None
@param uid: invenio user id
@type uid: number
@param subject: set this as the ticket's subject.
@type subject: string
@param recordid: ticket concerns this record.
@type recordid: number
@param text: ticket body.
@type text: string
@param queue: the queue for this ticket (if supported).
@type queue: string
@param priority: ticket priority.
@type priority: number
@param owner: set ticket owner to this uid.
@type owner: number
+ @return: new ticket id or None
"""
pass
def ticket_assign(self, uid, ticketid, to_user):
"""assign a ticket to a user. Return 1 on success
@param uid: invenio user id
@type uid: number
@param ticketid: ticket id
@type ticketid: number
@param to_user: assign ticket to this user
@type to_user: number
@return: 1 on success, 0 otherwise
@rtype: number
"""
pass
def ticket_set_attribute(self, uid, ticketid, attribute, new_value):
"""set an attribute of a ticket. Return 1 on success
@param uid: invenio user id
@type uid: number
@param ticketid: ticket id
@type ticketid: number
@param attribute. This is a member of TICKET_ATTRIBUTES.
@type attribute: string
@param new_value: new value for this attribute.
@type new_value: string
@return: 1 on success, 0 otherwise
@rtype: number
"""
pass
def ticket_get_attribute(self, uid, ticketid, attrname):
"""return an attribute
@param uid: invenio user id
@type uid: number
@param ticketid: ticket id
@type ticketid: number
@param attrname: attribute name.
@type attrname: string
@return: the value of the attribute, or None if the ticket or attribute does not exist
@rtype: string
"""
pass
def ticket_get_info(self, uid, ticketid, attrlist = None):
"""Return the attributes of a ticket as a dictionary whose fields are TICKET_ATTRIBUTES.
@param uid: user id
@type uid: number
@param ticketid: ticket id
@type ticketid: number
@param attrlist: a list of attributes, each in TICKET_ATTRIBUTES.
@type attrlist: list
@return: dictionary whose fields are TICKET_ATTRIBUTES
@rtype: dictionary
"""
pass
def get_bibcat_from_prefs(uid):
"""gets username and pw from user prefs as a tuple.
if not successfull, returns None
@param uid: user id
@type uid: number
@return: ('bibcatalog_username', 'bibcatalog_password')
@rtype: tuple
"""
user_pref = get_user_preferences(uid)
if not user_pref.has_key('bibcatalog_username'):
return (None, None)
if not user_pref.has_key('bibcatalog_password'):
return (None, None)
return (user_pref['bibcatalog_username'], user_pref['bibcatalog_password'])
diff --git a/modules/bibcatalog/lib/bibcatalog_system_rt.py b/modules/bibcatalog/lib/bibcatalog_system_rt.py
index 78ec7bacf..f52ec7a74 100644
--- a/modules/bibcatalog/lib/bibcatalog_system_rt.py
+++ b/modules/bibcatalog/lib/bibcatalog_system_rt.py
@@ -1,355 +1,364 @@
# -*- coding: utf-8 -*-
##
## This file is part of CDS Invenio.
## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 CERN.
##
## CDS Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## CDS Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with CDS Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
"""
Provide a "ticket" interface with a request tracker.
This is a subclass of BibCatalogSystem
"""
import os
import os.path
import invenio.webuser
from invenio.shellutils import run_shell_command, escape_shell_arg
from invenio.bibcatalog_system import BibCatalogSystem, get_bibcat_from_prefs
from invenio.config import CFG_BIBCATALOG_SYSTEM, \
CFG_BIBCATALOG_SYSTEM_RT_CLI, \
CFG_BIBCATALOG_SYSTEM_RT_URL, \
CFG_BIBCATALOG_SYSTEM_RT_URL, \
CFG_BIBCATALOG_QUEUES
class BibCatalogSystemRT(BibCatalogSystem):
BIBCATALOG_RT_SERVER = "" #construct this by http://user:password@RT_URL
def check_system(self, uid):
"""return an error string if there are problems"""
user_pref = invenio.webuser.get_user_preferences(uid)
if not user_pref.has_key('bibcatalog_username'):
return "user " + str(uid) + " has no bibcatalog_username"
rtuid = user_pref['bibcatalog_username']
if not user_pref.has_key('bibcatalog_password'):
return "user " + str(uid) + " has no bibcatalog_password"
rtpw = user_pref['bibcatalog_password']
if not CFG_BIBCATALOG_SYSTEM == 'RT':
return "CFG_BIBCATALOG_SYSTEM is not RT though this is an RT module"
if not CFG_BIBCATALOG_SYSTEM_RT_CLI:
return "CFG_BIBCATALOG_SYSTEM_RT_CLI not defined or empty"
if not os.path.exists(CFG_BIBCATALOG_SYSTEM_RT_CLI):
return "CFG_BIBCATALOG_SYSTEM_RT_CLI " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " file does not exists"
#check that you can execute it.. this is a safe call unless someone can fake CFG_BIBCATALOG_SYSTEM_RT_CLI (unlikely)
dummy, myout, myerr = run_shell_command(CFG_BIBCATALOG_SYSTEM_RT_CLI + " help")
helpfound = False
if myerr.count("help") > 0:
helpfound = True
if not helpfound:
return "Execution of CFG_BIBCATALOG_SYSTEM_RT_CLI " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " help did not produce output 'help'"
if not CFG_BIBCATALOG_SYSTEM_RT_URL:
return "CFG_BIBCATALOG_SYSTEM_RT_URL not defined or empty"
#construct.. split RT_URL at //
if CFG_BIBCATALOG_SYSTEM_RT_URL.count("http://") == 0:
return "CFG_BIBCATALOG__SYSTEM_RT_URL does not start with 'http://'"
httppart, siteandpath = CFG_BIBCATALOG_SYSTEM_RT_URL.split("//")
BIBCATALOG_RT_SERVER = httppart + "//" + rtuid + ":" + rtpw + "@" + siteandpath
#set as env var
os.environ["RTUSER"] = rtuid
os.environ["RTSERVER"] = BIBCATALOG_RT_SERVER
#try to talk to RT server
#this is a safe call since rtpw is the only variable in it, and it is escaped
rtpw = escape_shell_arg(rtpw)
dummy, myout, myerr = run_shell_command("echo "+rtpw+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " ls \"Subject like 'F00'\"")
if len(myerr) > 0:
return "could not connect to " + BIBCATALOG_RT_SERVER + " " + myerr
#finally, check that there is some sane output like tickets or 'No matching result'
saneoutput = (myout.count('matching') > 0) or (myout.count('1') > 0)
if not saneoutput:
return CFG_BIBCATALOG_SYSTEM_RT_CLI + " returned " + myout + " instead of 'matching' or '1'"
if not CFG_BIBCATALOG_QUEUES:
return "CFG_BIBCATALOG_QUEUES not defined or empty"
(username, dummy) = get_bibcat_from_prefs(uid)
if (username is None):
return "Cannot find user preference bibcatalog_username for uid "+str(uid)
return ""
def ticket_search(self, uid, recordid=-1, subject="", text="", creator="", owner="", \
- date_from="", date_until="", status="", priority=""):
+ date_from="", date_until="", status="", priority="", include_resolved=False):
"""returns a list of ticket ID's related to this record or by
matching the subject, creator or owner of the ticket."""
search_atoms = [] #the search expression will be made by and'ing these
+ if not include_resolved:
+ search_atoms.append("Status != 'resolved'")
if (recordid > -1):
#search by recid
search_atoms.append("CF.{RecordID} = " + escape_shell_arg(str(recordid)))
if (len(subject) > 0):
#search by subject
search_atoms.append("Subject like " + escape_shell_arg(str(subject)))
if (len(text) > 0):
search_atoms.append("Content like " + escape_shell_arg(str(text)))
if (len(str(creator)) > 0):
#search for this person's bibcatalog_username in preferences
creatorprefs = invenio.webuser.get_user_preferences(creator)
creator = "Nobody can Have This Kind of Name"
if creatorprefs.has_key("bibcatalog_username"):
creator = creatorprefs["bibcatalog_username"]
search_atoms.append("Creator = " + escape_shell_arg(str(creator)))
if (len(str(owner)) > 0):
ownerprefs = invenio.webuser.get_user_preferences(owner)
owner = "Nobody can Have This Kind of Name"
if ownerprefs.has_key("bibcatalog_username"):
owner = ownerprefs["bibcatalog_username"]
search_atoms.append("Owner = " + escape_shell_arg(str(owner)))
if (len(date_from) > 0):
search_atoms.append("Created >= " + escape_shell_arg(str(date_from)))
if (len(date_until) > 0):
search_atoms.append("Created <= " + escape_shell_arg(str(date_until)))
if (len(str(status)) > 0):
search_atoms.append("Status = " + escape_shell_arg(str(status)))
if (len(str(priority)) > 0):
#try to convert to int
intpri = -1
try:
intpri = int(priority)
except:
pass
if (intpri > -1):
search_atoms.append("Priority = " + str(intpri))
searchexp = " and ".join(search_atoms)
tickets = []
if not CFG_BIBCATALOG_SYSTEM_RT_URL:
return tickets
httppart, siteandpath = CFG_BIBCATALOG_SYSTEM_RT_URL.split("//")
(username, passwd) = get_bibcat_from_prefs(uid)
BIBCATALOG_RT_SERVER = httppart + "//" + username + ":" + passwd + "@" + siteandpath
#set as env var
os.environ["RTUSER"] = username
os.environ["RTSERVER"] = BIBCATALOG_RT_SERVER
#search..
if len(searchexp) == 0:
#just make an expression that is true for all tickets
searchexp = "Created > '1900-01-01'"
passwd = escape_shell_arg(passwd)
#make a call. This is safe since passwd and all variables in searchexp have been escaped.
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " ls \"" + searchexp + "\"")
for line in myout.split("\n"):
#if there are matching lines they will look like NUM:subj.. so pick num
if (line.count(': ') > 0) and (line.count("Invalid") == 0): #the parameters may be insane
tnum, dummy = line.split(': ') #get the ticket id and transform it to int
try:
inum = int(tnum)
tickets.append(tnum)
except:
pass
return tickets
def ticket_submit(self, uid, subject, recordid, text="", queue="", priority="", owner=""):
"""creates a ticket. return ticket num on success, otherwise None"""
if not CFG_BIBCATALOG_SYSTEM_RT_URL:
return None
(username, passwd) = get_bibcat_from_prefs(uid)
httppart, siteandpath = CFG_BIBCATALOG_SYSTEM_RT_URL.split("//")
BIBCATALOG_RT_SERVER = httppart + "//" + username + ":" + passwd + "@" + siteandpath
#set as env var
os.environ["RTUSER"] = username
os.environ["RTSERVER"] = BIBCATALOG_RT_SERVER
queueset = ""
textset = ""
priorityset = ""
ownerset = ""
- subjectset = " subject=" + escape_shell_arg(subject)
+ subjectset = ""
+ if subject:
+ subjectset = " subject=" + escape_shell_arg(subject)
recidset = " CF-RecordID=" + escape_shell_arg(str(recordid))
if text:
textset = " text=" + escape_shell_arg(text)
if priority:
priorityset = " priority=" + escape_shell_arg(str(priority))
if queue:
queueset = " queue=" + escape_shell_arg(queue)
if owner:
#get the owner name from prefs
ownerprefs = invenio.webuser.get_user_preferences(owner)
if ownerprefs.has_key("bibcatalog_username"):
owner = ownerprefs["bibcatalog_username"]
ownerset = " owner=" + escape_shell_arg(owner)
#make a command.. note that all set 'set' parts have been escaped
command = CFG_BIBCATALOG_SYSTEM_RT_CLI + " create -t ticket set " + subjectset + recidset + \
queueset + textset + priorityset + ownerset
passwd = escape_shell_arg(passwd)
#make a call.. passwd and command have been escaped (see above)
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + command)
inum = -1
for line in myout.split("\n"):
if line.count(' ') > 0:
stuff = line.split(' ')
- inum = int(stuff[2])
+ try:
+ inum = int(stuff[2])
+ except:
+ pass
if inum > 0:
return inum
return None
def ticket_assign(self, uid, ticketid, to_user):
"""assign a ticket to an RT user. Returns 1 on success, 0 on failure"""
return self.ticket_set_attribute(uid, ticketid, 'owner', to_user)
def ticket_set_attribute(self, uid, ticketid, attribute, new_value):
"""change the ticket's attribute. Returns 1 on success, 0 on failure"""
#check that the attribute is accepted..
if attribute not in BibCatalogSystem.TICKET_ATTRIBUTES:
return 0
#we cannot change read-only values.. including text that is an attachment. pity
if attribute in ['creator', 'date', 'ticketid', 'url_close', 'url_display', 'recordid', 'text']:
return 0
#check attribute
setme = ""
if (attribute == 'priority'):
try:
dummy = int(new_value)
except:
return 0
setme = "set Priority=" + str(new_value)
if (attribute == 'subject'):
subject = escape_shell_arg(new_value)
setme = "set Subject='" + subject +"'"
if (attribute == 'owner'):
#convert from invenio to RT
ownerprefs = invenio.webuser.get_user_preferences(new_value)
if not ownerprefs.has_key("bibcatalog_username"):
return 0
else:
owner = escape_shell_arg(ownerprefs["bibcatalog_username"])
setme = " set owner='" + owner +"'"
if (attribute == 'status'):
setme = " set status='" + escape_shell_arg(new_value) +"'"
if (attribute == 'queue'):
setme = " set queue='" + escape_shell_arg(new_value) +"'"
if not CFG_BIBCATALOG_SYSTEM_RT_URL:
return 0
#make sure ticketid is numeric
try:
dummy = int(ticketid)
except:
return 0
(username, passwd) = get_bibcat_from_prefs(uid)
httppart, siteandpath = CFG_BIBCATALOG_SYSTEM_RT_URL.split("//")
BIBCATALOG_RT_SERVER = httppart + "//" + username + ":" + passwd + "@" + siteandpath
#set as env var
os.environ["RTUSER"] = username
os.environ["RTSERVER"] = BIBCATALOG_RT_SERVER
passwd = escape_shell_arg(passwd)
#make a call. safe since passwd and all variables in 'setme' have been escaped
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " edit ticket/" + str(ticketid) + setme)
respOK = False
mylines = myout.split("\n")
for line in mylines:
if line.count('updated') > 0:
respOK = True
if respOK:
return 1
#print str(mylines)
return 0
def ticket_get_attribute(self, uid, ticketid, attrname):
"""return an attribute of a ticket"""
ticinfo = self.ticket_get_info(uid, ticketid, [attrname])
if ticinfo.has_key(attrname):
return ticinfo[attrname]
return None
def ticket_get_info(self, uid, ticketid, attrlist = None):
"""return ticket info as a dictionary of pre-defined attribute names.
Or just those listed in attrlist.
Returns None on failure"""
if not CFG_BIBCATALOG_SYSTEM_RT_URL:
return 0
#make sure ticketid is numeric
try:
dummy = int(ticketid)
except:
return 0
if attrlist is None:
attrlist = []
(username, passwd) = get_bibcat_from_prefs(uid)
httppart, siteandpath = CFG_BIBCATALOG_SYSTEM_RT_URL.split("//")
BIBCATALOG_RT_SERVER = httppart + "//" + username + ":" + passwd + "@" + siteandpath
#set as env var
os.environ["RTUSER"] = username
os.environ["RTSERVER"] = BIBCATALOG_RT_SERVER
passwd = escape_shell_arg(passwd)
#make a call. This is safe.. passwd escaped, ticketid numeric
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " show ticket/" + str(ticketid))
tdict = {}
for line in myout.split("\n"):
if line.count(": ") > 0:
tattr, tvaluen = line.split(": ")
tvalue = tvaluen.rstrip()
tdict[tattr] = tvalue
#query again to get attachments -> Contents
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " show ticket/" + str(ticketid) + "/attachments/")
attachments = []
for line in myout.split("\n"):
if line.count(": ") > 1: #there is a line Attachments: 40: xxx
aline = line.split(": ")
attachments.append(aline[1])
#query again for each attachment
for att in attachments:
#passwd still escaped..
dummy, myout, dummyerr = run_shell_command("echo "+passwd+" | " + CFG_BIBCATALOG_SYSTEM_RT_CLI + " show ticket/" + str(ticketid) + "/attachments/" + att)
#get the contents line
for line in myout.split("\n"):
if line.count("Content: ") > 0:
cstuff = line.split("Content: ")
tdict['Text'] = cstuff[1].rstrip()
if (len(tdict) > 0):
#iterate over TICKET_ATTRIBUTES to make a canonical ticket
candict = {}
for f in BibCatalogSystem.TICKET_ATTRIBUTES:
tcased = f.title()
if tdict.has_key(tcased):
candict[f] = tdict[tcased]
if tdict.has_key('CF.{RecordID}'):
candict['recordid'] = tdict['CF.{RecordID}']
if tdict.has_key('id'):
candict['ticketid'] = tdict['id']
#make specific URL attributes:
url_display = CFG_BIBCATALOG_SYSTEM_RT_URL + "/Ticket/Display.html?id="+str(ticketid)
candict['url_display'] = url_display
url_close = CFG_BIBCATALOG_SYSTEM_RT_URL + "/Ticket/Update.html?Action=Resolve&id="+str(ticketid)
candict['url_close'] = url_close
+ url_modify = CFG_BIBCATALOG_SYSTEM_RT_URL + "/Ticket/Modify.html?id="+str(ticketid)
+ candict['url_modify'] = url_modify
#change the ticket owner into invenio UID
if tdict.has_key('owner'):
rt_owner = tdict["owner"]
uid = invenio.webuser.get_uid_based_on_pref("bibcatalog_username", rt_owner)
candict['owner'] = uid
if len(attrlist) == 0: #return all fields
return candict
else: #return only the fields that were requested
tdict = {}
for f in attrlist:
if candict.has_key(f):
tdict[f] = candict[f]
return tdict
else:
return None
diff --git a/modules/bibedit/lib/bibedit_engine.py b/modules/bibedit/lib/bibedit_engine.py
index 3d6819a96..b1713c77e 100644
--- a/modules/bibedit/lib/bibedit_engine.py
+++ b/modules/bibedit/lib/bibedit_engine.py
@@ -1,399 +1,424 @@
## This file is part of CDS Invenio.
## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 CERN.
##
## CDS Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## CDS Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with CDS Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# pylint: disable-msg=C0103
"""CDS Invenio BibEdit Engine."""
__revision__ = "$Id"
from invenio.bibedit_config import CFG_BIBEDIT_JS_HASH_CHECK_INTERVAL, \
CFG_BIBEDIT_JS_CHECK_SCROLL_INTERVAL, CFG_BIBEDIT_JS_STATUS_ERROR_TIME, \
CFG_BIBEDIT_JS_STATUS_INFO_TIME, CFG_BIBEDIT_JS_NEW_ADD_FIELD_FORM_COLOR, \
CFG_BIBEDIT_JS_NEW_ADD_FIELD_FORM_COLOR_FADE_DURATION, \
CFG_BIBEDIT_JS_NEW_FIELDS_COLOR, \
CFG_BIBEDIT_JS_NEW_FIELDS_COLOR_FADE_DURATION, \
CFG_BIBEDIT_AJAX_RESULT_CODES, CFG_BIBEDIT_MAX_SEARCH_RESULTS, \
CFG_BIBEDIT_TAG_FORMAT
from invenio.bibedit_dblayer import get_name_tags_all
from invenio.bibedit_utils import cache_exists, cache_expired, \
create_cache_file, delete_cache_file, get_cache_file_contents, \
get_cache_mtime, latest_record_revision, record_locked_by_other_user, \
record_locked_by_queue, save_xml_record, touch_cache_file, \
update_cache_file_contents
from invenio.bibrecord import record_add_field, record_add_subfield_into, \
record_modify_controlfield, record_modify_subfield, record_move_subfield, \
record_delete_subfield, record_delete_field
from invenio.config import CFG_BIBEDIT_PROTECTED_FIELDS, CFG_CERN_SITE, \
CFG_SITE_URL
from invenio.search_engine import record_exists, search_pattern
from invenio.webuser import getUid, session_param_get, session_param_set
from invenio.bibcatalog import bibcatalog_system
import invenio.template
bibedit_templates = invenio.template.load('bibedit')
def perform_request_init():
"""Handle the initial request by adding menu and Javascript to the page."""
errors = []
warnings = []
body = ''
# Add script data.
tag_names = get_name_tags_all()
protected_fields = ['001']
protected_fields.extend(CFG_BIBEDIT_PROTECTED_FIELDS.split(','))
history_url = '"' + CFG_SITE_URL + '/admin/bibedit/bibeditadmin.py/history"'
cern_site = 'false'
if CFG_CERN_SITE:
cern_site = 'true'
data = {'gTagNames': tag_names,
'gProtectedFields': protected_fields,
'gSiteURL': '"' + CFG_SITE_URL + '"',
'gHistoryURL': history_url,
'gCERNSite': cern_site,
'gHASH_CHECK_INTERVAL': CFG_BIBEDIT_JS_HASH_CHECK_INTERVAL,
'gCHECK_SCROLL_INTERVAL': CFG_BIBEDIT_JS_CHECK_SCROLL_INTERVAL,
'gSTATUS_ERROR_TIME': CFG_BIBEDIT_JS_STATUS_ERROR_TIME,
'gSTATUS_INFO_TIME': CFG_BIBEDIT_JS_STATUS_INFO_TIME,
'gNEW_ADD_FIELD_FORM_COLOR':
'"' + CFG_BIBEDIT_JS_NEW_ADD_FIELD_FORM_COLOR + '"',
'gNEW_ADD_FIELD_FORM_COLOR_FADE_DURATION':
CFG_BIBEDIT_JS_NEW_ADD_FIELD_FORM_COLOR_FADE_DURATION,
'gNEW_FIELDS_COLOR': '"' + CFG_BIBEDIT_JS_NEW_FIELDS_COLOR + '"',
'gNEW_FIELDS_COLOR_FADE_DURATION':
CFG_BIBEDIT_JS_NEW_FIELDS_COLOR_FADE_DURATION,
'gRESULT_CODES': CFG_BIBEDIT_AJAX_RESULT_CODES
}
body += '\n'
# Add scripts (the ordering is NOT irrelevant).
scripts = ['jquery.min.js', 'effects.core.min.js',
'effects.highlight.min.js', 'jquery.autogrow.js',
'jquery.jeditable.mini.js', 'jquery.hotkeys.min.js', 'json2.js',
'bibedit_display.js', 'bibedit_engine.js', 'bibedit_keys.js',
'bibedit_menu.js']
for script in scripts:
body += ' \n' % (CFG_SITE_URL, script)
# Build page structure and menu.
body += bibedit_templates.menu()
body += '