def is_no_quota_user(uid): """Return True if the user belongs to any of the no_quota roles.""" no_quota_role_ids = [acc_get_role_id(role) for role in cfg['CFG_WEBMESSAGE_ROLES_WITHOUT_QUOTA']] user_info = UserInfo(uid) for role_id in no_quota_role_ids: if acc_is_user_in_role(user_info, role_id): return True return False
def Mail_Approval_Request_to_Committee_Chair(parameters, curdir, form, user_info=None): """ This function sends a confirmation email to the Committee Chair when approval for a document is requested. """ FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME, CFG_SITE_SUPPORT_EMAIL) # retrieve useful information from webSubmit configuration res = run_sql("select * from sbmCPLXAPPROVAL where rn=%s", (rn, )) categ = res[0][1] pubcomchair_address = "" # Try to retrieve the committee chair's email from the referee's database for user in acc_get_role_users( acc_get_role_id("pubcomchair_%s_%s" % (res[0][0], categ))): pubcomchair_address += user[1] #Get the document details from the repository - use the function in publiline.py item_details = get_brief_doc_details_from_repository(rn) #Generate the author list authors = "" for element in item_details['authors']: authors += element + ", " message = """ The document %s has been published as a Communication. Please select an appropriate referee for this document. Title: %s Author(s): %s To access the document(s), select the file(s) from the location: <%s/%s/%s> To select a referee, please go to: <%s/publiline.py?flow=cplx&doctype=%s&categ=%s&apptype=%s&RN=%s&ln=en> --------------------------------------------- Best regards. The submission team.""" % ( rn, item_details['title'], authors, CFG_SITE_URL, CFG_SITE_RECORD, sysno, CFG_SITE_URL, res[0][0], res[0][1], res[0][3], rn) # send the mail send_email(FROMADDR, pubcomchair_address, "Request for Referee Selection : Document %s" % rn, message, footer="") return ""
def is_no_quota_user(uid): """Return True if the user belongs to any of the no_quota roles.""" no_quota_role_ids = [ acc_get_role_id(role) for role in cfg['CFG_WEBMESSAGE_ROLES_WITHOUT_QUOTA'] ] user_info = UserInfo(uid) for role_id in no_quota_role_ids: if acc_is_user_in_role(user_info, role_id): return True return False
def _resolve_maximum_acces_rights(uid): ''' returns [max_role, lcul] to use in execute_action and check_transaction_permissions. Defaults to ['guest',0] if user has no roles assigned. Always returns the maximum privilege. ''' roles = {bconfig.CLAIMPAPER_ADMIN_ROLE: acc_get_role_id(bconfig.CLAIMPAPER_ADMIN_ROLE), bconfig.CLAIMPAPER_USER_ROLE: acc_get_role_id(bconfig.CLAIMPAPER_USER_ROLE)} uroles = acc_get_user_roles(uid) max_role = ['guest', 0] for r in roles: if roles[r] in uroles: rright = bconfig.CMPROLESLCUL[r] if rright >= max_role[1]: max_role = [r, rright] return max_role
def check_quota(nb_messages): """ @param nb_messages: max number of messages a user can have @return: a dictionary of users over-quota """ from invenio.legacy.webuser import collect_user_info from invenio.modules.access.control import acc_is_user_in_role, acc_get_role_id no_quota_role_ids = [acc_get_role_id(role) for role in CFG_WEBMESSAGE_ROLES_WITHOUT_QUOTA] res = {} for uid, n in run_sql("SELECT id_user_to, COUNT(id_user_to) FROM user_msgMESSAGE GROUP BY id_user_to HAVING COUNT(id_user_to) > %s", (nb_messages, )): user_info = collect_user_info(uid) for role_id in no_quota_role_ids: if acc_is_user_in_role(user_info, role_id): break else: res[uid] = n return res
def Mail_Approval_Request_to_Committee_Chair(parameters, curdir, form, user_info=None): """ This function sends a confirmation email to the Committee Chair when approval for a document is requested. """ FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME,CFG_SITE_SUPPORT_EMAIL) # retrieve useful information from webSubmit configuration res = run_sql("select * from sbmCPLXAPPROVAL where rn=%s", (rn, )) categ = res[0][1] pubcomchair_address = "" # Try to retrieve the committee chair's email from the referee's database for user in acc_get_role_users(acc_get_role_id("pubcomchair_%s_%s" % (res[0][0],categ))): pubcomchair_address += user[1] #Get the document details from the repository - use the function in publiline.py item_details = get_brief_doc_details_from_repository(rn) #Generate the author list authors = "" for element in item_details['authors']: authors += element + ", " message = """ The document %s has been published as a Communication. Please select an appropriate referee for this document. Title: %s Author(s): %s To access the document(s), select the file(s) from the location: <%s/%s/%s> To select a referee, please go to: <%s/publiline.py?flow=cplx&doctype=%s&categ=%s&apptype=%s&RN=%s&ln=en> --------------------------------------------- Best regards. The submission team.""" % (rn,item_details['title'],authors,CFG_SITE_URL,CFG_SITE_RECORD,sysno,CFG_SITE_URL,res[0][0],res[0][1],res[0][3],rn) # send the mail send_email(FROMADDR,pubcomchair_address,"Request for Referee Selection : Document %s" % rn, message,footer="") return ""
def Send_APP_Mail(parameters, curdir, form, user_info=None): """ This function send an email informing the original submitter of a document that the referee has approved/ rejected the document. The email is also sent to the referee for checking. Parameters: * addressesAPP: email addresses of the people who will receive this email (comma separated list). this parameter may contain the <CATEG> string. In which case the variable computed from the [categformatAFP] parameter replaces this string. eg.: "<CATEG>[email protected]" * categformatAPP contains a regular expression used to compute the category of the document given the reference of the document. eg.: if [categformatAFP]="TEST-<CATEG>-.*" and the reference of the document is "TEST-CATEGORY1-2001-001", then the computed category equals "CATEGORY1" * newrnin: Name of the file containing the 2nd reference of the approved document (if any). * edsrn: Name of the file containing the reference of the approved document. """ global titlevalue, authorvalue, emailvalue, sysno, rn FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME, CFG_SITE_SUPPORT_EMAIL) sequence_id = bibtask_allocate_sequenceid(curdir) doctype = form['doctype'] titlevalue = titlevalue.replace("\n", " ") authorvalue = authorvalue.replace("\n", "; ") # variables declaration categformat = parameters['categformatAPP'] otheraddresses = parameters['addressesAPP'] newrnpath = parameters['newrnin'] ## Get the name of the decision file: try: decision_filename = parameters['decision_file'] except KeyError: decision_filename = "" ## Get the name of the comments file: try: comments_filename = parameters['comments_file'] except KeyError: comments_filename = "" ## Now try to read the comments from the comments_filename: if comments_filename in (None, "", "NULL"): ## We don't have a name for the comments file. ## For backward compatibility reasons, try to read the comments from ## a file called 'COM' in curdir: if os.path.exists("%s/COM" % curdir): try: fh_comments = open("%s/COM" % curdir, "r") comment = fh_comments.read() fh_comments.close() except IOError: ## Unable to open the comments file exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open " \ "comments file [%s/COM] but was " \ "unable to." % curdir register_exception(prefix=exception_prefix) comment = "" else: comment = comment.strip() else: comment = "" else: ## Try to read the comments from the comments file: if os.path.exists("%s/%s" % (curdir, comments_filename)): try: fh_comments = open("%s/%s" % (curdir, comments_filename), "r") comment = fh_comments.read() fh_comments.close() except IOError: ## Oops, unable to open the comments file. comment = "" exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open comments " \ "file [%s/%s] but was unable to." \ % (curdir, comments_filename) register_exception(prefix=exception_prefix) else: comment = comment.strip() else: comment = "" ## Now try to read the decision from the decision_filename: if decision_filename in (None, "", "NULL"): ## We don't have a name for the decision file. ## For backward compatibility reasons, try to read the decision from ## a file called 'decision' in curdir: if os.path.exists("%s/decision" % curdir): try: fh_decision = open("%s/decision" % curdir, "r") decision = fh_decision.read() fh_decision.close() except IOError: ## Unable to open the decision file exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open " \ "decision file [%s/decision] but was " \ "unable to." % curdir register_exception(prefix=exception_prefix) decision = "" else: decision = decision.strip() else: decision = "" else: ## Try to read the decision from the decision file: try: fh_decision = open("%s/%s" % (curdir, decision_filename), "r") decision = fh_decision.read() fh_decision.close() except IOError: ## Oops, unable to open the decision file. decision = "" exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open decision " \ "file [%s/%s] but was unable to." \ % (curdir, decision_filename) register_exception(prefix=exception_prefix) else: decision = decision.strip() if os.path.exists("%s/%s" % (curdir, newrnpath)): fp = open("%s/%s" % (curdir, newrnpath), "r") newrn = fp.read() fp.close() else: newrn = "" # Document name res = run_sql("SELECT ldocname FROM sbmDOCTYPE WHERE sdocname=%s", (doctype, )) docname = res[0][0] # retrieve category categformat = categformat.replace("<CATEG>", "([^-]*)") m_categ_search = re.match(categformat, rn) if m_categ_search is not None: if len(m_categ_search.groups()) > 0: ## Found a match for the category of this document. Get it: category = m_categ_search.group(1) else: ## This document has no category. category = "unknown" else: category = "unknown" ## Get the referee email address: if CFG_CERN_SITE: ## The referees system in CERN now works with listbox membership. ## List names should take the format ## "*****@*****.**" ## Make sure that your list exists! ## FIXME - to be replaced by a mailing alias in webaccess in the ## future. referee_listname = "service-cds-referee-%s" % doctype.lower() if category != "": referee_listname += "-%s" % category.lower() referee_listname += "@cern.ch" addresses = referee_listname else: # Build referee's email address refereeaddress = "" # Try to retrieve the referee's email from the referee's database for user in acc_get_role_users( acc_get_role_id("referee_%s_%s" % (doctype, category))): refereeaddress += user[1] + "," # And if there is a general referee for user in acc_get_role_users( acc_get_role_id("referee_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$", "", refereeaddress) # Creation of the mail for the referee otheraddresses = otheraddresses.replace("<CATEG>", category) addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$", "", addresses) ## Add the record's submitter(s) into the list of recipients: ## Get the email address(es) of the record submitter(s)/owner(s) from ## the record itself: record_owners = print_record(sysno, 'tm', \ [CFG_WEBSUBMIT_RECORD_OWNER_EMAIL]).strip() if record_owners != "": record_owners_list = record_owners.split("\n") record_owners_list = [email.lower().strip() \ for email in record_owners_list] else: #if the record owner can not be retrieved from the metadata #(in case the record has not been inserted yet), #try to use the global variable emailvalue try: record_owners_list = [emailvalue] except NameError: record_owners_list = [] record_owners = ",".join([owner for owner in record_owners_list]) if record_owners != "": addresses += ",%s" % record_owners if decision == "approve": mailtitle = "%s has been approved" % rn mailbody = "The %s %s has been approved." % (docname, rn) mailbody += "\nIt will soon be accessible here:\n\n<%s/%s/%s>" % ( CFG_SITE_URL, CFG_SITE_RECORD, sysno) else: mailtitle = "%s has been rejected" % rn mailbody = "The %s %s has been rejected." % (docname, rn) if rn != newrn and decision == "approve" and newrn != "": mailbody += "\n\nIts new reference number is: %s" % newrn mailbody += "\n\nTitle: %s\n\nAuthor(s): %s\n\n" % (titlevalue, authorvalue) if comment != "": mailbody += "Comments from the referee:\n%s\n" % comment # Send mail to referee if any recipients or copy to admin if addresses or CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN: scheduled_send_email( FROMADDR, addresses, mailtitle, mailbody, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN, other_bibtasklet_arguments=['-I', str(sequence_id)]) return ""
def index(req, c=CFG_SITE_NAME, ln=CFG_SITE_LANG, todo="", id="", doctype="", categ="", addusers="", warningText="", role=""): """Main entry point for the management of referees.""" ln = wash_language(ln) # get user ID: uid = getUid(req) (auth_code, auth_message) = acc_authorize_action(req, "cfgwebsubmit", verbose=0) if auth_code != 0: ## user is not authorised to use WebSubmit Admin: return page_not_authorized(req=req, text=auth_message) # request for deleting a user if todo == "deleteuser": acc_delete_user_role(id, name_role=role) # request for adding user(s) if todo == "adduser": role = "referee_%s_%s" % (doctype, categ[1]) roleId = acc_get_role_id(role) # if the role does not exists, we create it if roleId == 0: if acc_add_role(role, "referees for document type %s category %s" % (doctype, categ[1])) == 0: return error_page("Cannot create referee role", req, ln) else: roleId = acc_get_role_id(role) # if the action does not exist, we create it actionId = acc_get_action_id("referee") if actionId == 0: if acc_add_action("referee", "", "no", ("doctype","categ")) == 0: return error_page("Cannot create action 'referee'", req, ln) else: actionId = acc_get_action_id("referee") #create arguments arg1Id = acc_add_argument("doctype", doctype) arg2Id = acc_add_argument("categ", categ[1]) # then link the role with the action if acc_add_role_action_arguments(roleId, actionId, -1, 0, 0, [arg1Id, arg2Id]) == 0: return error_page("Cannot link role with action", req, ln) roleId = acc_get_role_id(role) # For each id in the array if isinstance(addusers, types.ListType): for adduser in addusers: # First check whether this id is not already associated with this rule myRoles = acc_get_user_roles(adduser) if not roleId in myRoles: # Actually add the role to the user acc_add_user_role(adduser, roleId) else: warningText = '<span style="color:#f00">Sorry... This user is already a referee for this category.</span>' else: # First check whether this id is not already associated with this rule myRoles = acc_get_user_roles(addusers) if not roleId in myRoles: # Actually add the role to the user acc_add_user_role(addusers, roleId) else: warningText = '<span style="color:#f00">Sorry... This user is already a referee for this category.</span>' return page(title="websubmit admin - referee selection", body=displayRefereesPage(doctype, warningText), description="", keywords="", uid=uid, language=ln, req=req)
def Send_Approval_Request (parameters, curdir, form, user_info=None): """ This function sends an email to the referee in order to start the simple approval process. This function is very CERN-specific and should be changed in case of external use. Must be called after the Get_Report_Number function. Parameters: * addressesDAM: email addresses of the people who will receive this email (comma separated list). this parameter may contain the <CATEG> string. In which case the variable computed from the [categformatDAM] parameter replaces this string. eg.:"<CATEG>[email protected]" * categformatDAM: contains a regular expression used to compute the category of the document given the reference of the document. eg.: if [categformatAFP]="TEST-<CATEG>-.*" and the reference of the document is "TEST-CATEGORY1-2001-001", then the computed category equals "CATEGORY1" * authorfile: name of the file in which the authors are stored * titlefile: name of the file in which the title is stored. * directory: parameter used to create the URL to access the files. """ global rn,sysno # variables declaration doctype = re.search(".*/([^/]*)/([^/]*)/[^/]*$",curdir).group(2) FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME,CFG_SITE_SUPPORT_EMAIL) otheraddresses = parameters['addressesDAM'] categformat = parameters['categformatDAM'] # retrieve category categformat = categformat.replace("<CATEG>","([^-]*)") m_categ_search = re.match(categformat, rn) if m_categ_search is not None: if len(m_categ_search.groups()) > 0: ## Found a match for the category of this document. Get it: category = m_categ_search.group(1) else: ## This document has no category. category = "unknown" else: category = "unknown" # create TI if os.path.exists("%s/date" % curdir): fp = open("%s/date" % curdir, "r") date = fp.read() fp.close() else: date = "" if os.path.exists("%s/%s" % (curdir,parameters['titleFile'])): fp = open("%s/%s" % (curdir,parameters['titleFile']),"r") title = fp.read() fp.close() title = title.replace("\n","") else: title = "" title += " - %s" % date # create AU if os.path.exists("%s/%s" % (curdir,parameters['authorfile'])): fp = open("%s/%s" % (curdir,parameters['authorfile']), "r") author = fp.read() fp.close() else: author = "" # we get the referee password sth = run_sql("SELECT access FROM sbmAPPROVAL WHERE rn=%s", (rn,)) if len(sth) >0: access = sth[0][0] # Build referee's email address refereeaddress = "" # Try to retrieve the referee's email from the referee's database for user in acc_get_role_users(acc_get_role_id("referee_%s_%s" % (doctype,category))): refereeaddress += user[1] + "," # And if there are general referees for user in acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$","",refereeaddress) # Creation of the mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) title_referee = "Request for approval of %s" % rn mail_referee = "The document %s has been submitted to the %s Server..\nYour approval is requested on it.\n\n" % (rn,CFG_SITE_NAME) mail_referee +="Title: %s\n\nAuthor(s): %s\n\n" % (title,author) mail_referee +="To access the document(s), select the file(s) from the location:<%s/%s/%s/files/>\n\n" % (CFG_SITE_URL,CFG_SITE_RECORD,sysno) mail_referee +="To approve/reject the document, you should go to this URL:\n<%s/approve.py?access=%s>\n" % (CFG_SITE_URL,access) mail_referee +="---------------------------------------------\nBest regards.\nThe submission team.\n" #Send mail to referee send_email(FROMADDR, addresses, title_referee, mail_referee, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) return ""
def Send_Request_For_Publication(parameters, curdir, form, user_info=None): global rn, sysno # variables declaration doctype = re.search(".*/([^/]*)/([^/]*)/[^/]*$", curdir).group(2) FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME, CFG_SITE_SUPPORT_EMAIL) otheraddresses = parameters['addressesDAM'] categformat = parameters['categformatDAM'] # retrieve category categformat = categformat.replace("<CATEG>", "([^-]*)") categs = re.match(categformat, rn) if categs is not None: category = categs.group(1) else: category = "unknown" # create TI if os.path.exists("%s/date" % curdir): fp = open("%s/date" % curdir, "r") date = fp.read() fp.close() else: date = "" if os.path.exists("%s/%s" % (curdir, parameters['titleFile'])): fp = open("%s/%s" % (curdir, parameters['titleFile']), "r") title = fp.read() fp.close() title = title.replace("\n", "") else: title = "" title += " - %s" % date # create AU if os.path.exists("%s/%s" % (curdir, parameters['authorfile'])): fp = open("%s/%s" % (curdir, parameters['authorfile']), "r") author = fp.read() fp.close() else: author = "" # we get the referee password #sth = run_sql("SELECT access FROM sbmAPPROVAL WHERE rn=%s", (rn,)) #if len(sth) >0: #access = sth[0][0] # Build referee's email address refereeaddress = "" # Try to retrieve the publication committee chair's email from the role database for user in acc_get_role_users( acc_get_role_id("pubcomchair_%s_%s" % (doctype, category))): refereeaddress += user[1] + "," # And if there are general referees for user in acc_get_role_users( acc_get_role_id("pubcomchair_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$", "", refereeaddress) # Creation of the mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$", "", addresses) title_referee = "Request for publication of %s" % rn mail_referee = "The document %s has been asked for publication to the %s Server..\nYour have to select an editorial board for it.\n\n" % ( rn, CFG_SITE_NAME) mail_referee += "Title: %s\n\nAuthor(s): %s\n\n" % (title, author) mail_referee += "To access the document(s), select the file(s) from the location:<%s/%s/%s/files/>\n\n" % ( CFG_SITE_URL, CFG_SITE_RECORD, sysno) mail_referee += "To select an editorial board, you should go to this URL:\n<%s/publiline.py?doctype=%s&categ=%s&RN=%s>\n" % ( CFG_SITE_URL, doctype, category, rn) mail_referee += "---------------------------------------------\nBest regards.\nThe submission team.\n" #Send mail to referee send_email(FROMADDR, addresses, title_referee, mail_referee, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) return ""
def Send_Approval_Request(parameters, curdir, form, user_info=None): """ This function sends an email to the referee in order to start the simple approval process. This function is very CERN-specific and should be changed in case of external use. Must be called after the Get_Report_Number function. Parameters: * addressesDAM: email addresses of the people who will receive this email (comma separated list). this parameter may contain the <CATEG> string. In which case the variable computed from the [categformatDAM] parameter replaces this string. eg.:"<CATEG>[email protected]" * categformatDAM: contains a regular expression used to compute the category of the document given the reference of the document. eg.: if [categformatAFP]="TEST-<CATEG>-.*" and the reference of the document is "TEST-CATEGORY1-2001-001", then the computed category equals "CATEGORY1" * authorfile: name of the file in which the authors are stored * titlefile: name of the file in which the title is stored. * directory: parameter used to create the URL to access the files. """ global rn, sysno # variables declaration doctype = re.search(".*/([^/]*)/([^/]*)/[^/]*$", curdir).group(2) FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME, CFG_SITE_SUPPORT_EMAIL) otheraddresses = parameters['addressesDAM'] categformat = parameters['categformatDAM'] # retrieve category categformat = categformat.replace("<CATEG>", "([^-]*)") m_categ_search = re.match(categformat, rn) if m_categ_search is not None: if len(m_categ_search.groups()) > 0: ## Found a match for the category of this document. Get it: category = m_categ_search.group(1) else: ## This document has no category. category = "unknown" else: category = "unknown" # create TI if os.path.exists("%s/date" % curdir): fp = open("%s/date" % curdir, "r") date = fp.read() fp.close() else: date = "" if os.path.exists("%s/%s" % (curdir, parameters['titleFile'])): fp = open("%s/%s" % (curdir, parameters['titleFile']), "r") title = fp.read() fp.close() title = title.replace("\n", "") else: title = "" title += " - %s" % date # create AU if os.path.exists("%s/%s" % (curdir, parameters['authorfile'])): fp = open("%s/%s" % (curdir, parameters['authorfile']), "r") author = fp.read() fp.close() else: author = "" # we get the referee password sth = run_sql("SELECT access FROM sbmAPPROVAL WHERE rn=%s", (rn, )) if len(sth) > 0: access = sth[0][0] # Build referee's email address refereeaddress = "" # Try to retrieve the referee's email from the referee's database for user in acc_get_role_users( acc_get_role_id("referee_%s_%s" % (doctype, category))): refereeaddress += user[1] + "," # And if there are general referees for user in acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$", "", refereeaddress) # Creation of the mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$", "", addresses) title_referee = "Request for approval of %s" % rn mail_referee = "The document %s has been submitted to the %s Server..\nYour approval is requested on it.\n\n" % ( rn, CFG_SITE_NAME) mail_referee += "Title: %s\n\nAuthor(s): %s\n\n" % (title, author) mail_referee += "To access the document(s), select the file(s) from the location:<%s/%s/%s/files/>\n\n" % ( CFG_SITE_URL, CFG_SITE_RECORD, sysno) mail_referee += "To approve/reject the document, you should go to this URL:\n<%s/approve.py?access=%s>\n" % ( CFG_SITE_URL, access) mail_referee += "---------------------------------------------\nBest regards.\nThe submission team.\n" #Send mail to referee send_email(FROMADDR, addresses, title_referee, mail_referee, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) return ""
def Mail_Approval_Withdrawn_to_Referee(parameters, \ curdir, \ form, \ user_info=None): """ This function sends an email to the referee of a document informing him/her that the request for its approval has been withdrawn. @param categ_file_withd: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from a file in the current submission's working directory. It should therefore be a filename. @param categ_rnseek_withd: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from the document's reference number. It is infact a string that will be compiled into a regexp and an attempt will be made to match it agains the document's reference number starting from the left-most position. The only pre-requisite is that the segment in which the category is sought should be indicated with <CATEGORY>. Thus, an example might be as follows: ATL(-COM)?-<CATEGORY>-.+ This would allow "PHYS" in the following reference number to be recognised as the category: ATL-COM-PHYS-2008-001 @return: (string) - empty string. """ ## Get the reference number (as global rn - sorry!) and the document type: global sysno, rn doctype = form['doctype'] ######## ## Get the parameters from the list: ######## ## Get the name of the category file: ####### try: ## If it has been provided, get the name of the file in which the ## category is stored: category_file = parameters["categ_file_withd"] except KeyError: ## No value given for the category file: category_file = None else: if category_file is not None: category_file = str(category_file) category_file = os.path.basename(category_file).strip() if category_file == "": category_file = None ######## ## Get the regexp that is used to find the category in the report number: ######## try: ## If it has been provided, get the regexp used for identifying ## a document-type's category from its reference number: category_rn_regexp = parameters["categ_rnseek_withd"] except KeyError: ## No value given for the category regexp: category_rn_regexp = None else: if category_rn_regexp is not None: category_rn_regexp = str(category_rn_regexp).strip() if category_rn_regexp == "": category_rn_regexp = None ####### ## Resolve the document type's category: ## ## This is a long process. The end result is that the category is extracted ## either from a file in curdir, or from the report number. ## If it's taken from the report number, the admin must configure the ## function to accept a regular expression that is used to find the ## category in the report number. ## if category_file is not None and category_rn_regexp is not None: ## It is not valid to have both a category file and a pattern ## describing how to extract the category from a report number. ## raise an InvenioWebSubmitFunctionWarning: msg = "Error in Mail_Approval_Withdrawn_to_Referee function: " \ "received instructions to search for the document's category " \ "in both its report number AND in a category file. Could " \ "not determine which to use - please notify the " \ "administrator." raise InvenioWebSubmitFunctionWarning(msg) elif category_file is not None: ## Attempt to recover the category information from a file in the ## current submission's working directory: category = ParamFromFile("%s/%s" % (curdir, category_file)) if category is not None: category = category.strip() if category in (None, ""): ## The category cannot be resolved. msg = "Error in Mail_Approval_Withdrawn_to_Referee function: " \ "received instructions to search for the document's " \ "category in a category file, but could not recover the " \ "category from that file. The referee cannot be notified " \ "of the approval request withdrawal by mail." raise InvenioWebSubmitFunctionWarning(msg) elif category_rn_regexp is not None: ## Attempt to recover the category information from the document's ## reference number using the regexp in category_rn_regexp: ## ## Does the category regexp contain the key-phrase "<CATEG>"? if category_rn_regexp.find("<CATEG>") != -1: ## Yes. Replace "<CATEG>" with "(?P<category>.+?)". ## For example, this: ## ATL(-COM)?-<CATEG>- ## Will be transformed into this: ## ATL(-COM)?-(?P<category>.+?)- category_rn_final_regexp = \ category_rn_regexp.replace("<CATEG>", r"(?P<category>.+?)", 1) else: ## The regexp for category didn't contain "<CATEG>", but this is ## mandatory. msg = "Error in Mail_Approval_Withdrawn_to_Referee function: The" \ " [%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number," \ " using a poorly formed search expression (no marker for " \ "the category was present.) Since the document's category " \ "cannot be retrieved, the referee cannot be " \ "notified of the approval request withdrawal by mail." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionWarning(msg) ## try: ## Attempt to compile the regexp for finding the category: re_categ_from_rn = re.compile(category_rn_final_regexp) except sre_constants.error: ## The expression passed to this function could not be compiled ## into a regexp. Register this exception and raise an ## InvenioWebSubmitFunctionWarning: exception_prefix = "Error in Mail_Approval_Withdrawn_to_Referee " \ "function: The [%(doctype)s] submission has " \ "been configured to search for the document " \ "type's category in its reference number, " \ "using the following regexp: /%(regexp)s/. " \ "This regexp, however, could not be " \ "compiled correctly (created it from " \ "%(categ-search-term)s.)" \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Mail_Approval_Withdrawn_to_Referee function: The" \ " [%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number," \ " using a poorly formed search expression. Since the " \ "document's category cannot be retrieved, the referee" \ "cannot be notified of the approval request withdrawal by " \ "mail." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionWarning(msg) else: ## Now attempt to recover the category from the RN string: m_categ_from_rn = re_categ_from_rn.match(rn) if m_categ_from_rn is not None: ## The pattern matched in the string. ## Extract the category from the match: try: category = m_categ_from_rn.group("category") except IndexError: ## There was no "category" group. That group is mandatory. exception_prefix = \ "Error in Mail_Approval_Withdrawn_to_Referee " \ "function: The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number using the " \ "following regexp: " \ "/%(regexp)s/. The search produced a match, but " \ "there was no \"category\" group in the match " \ "object although this group is mandatory. The " \ "regexp was compiled from the following string: " \ "[%(categ-search-term)s]." \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Mail_Approval_Withdrawn_to_Referee " \ "function: The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number, using a poorly " \ "formed search expression (there was no category " \ "marker). Since the document's category therefore " \ "cannot be retrieved, the referee cannot be " \ "notified of the approval request withdrawal " \ "by mail." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionWarning(msg) else: category = category.strip() if category == "": msg = "Error in Mail_Approval_Withdrawn_to_Referee " \ "function: The [%(doctype)s] submission has " \ "been configured to search for the document " \ "type's category in its reference number, but " \ "no category was found. The referee cannot be " \ "notified of the approval request withdrawal " \ "by mail." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionWarning(msg) else: ## No match. Cannot find the category and therefore cannot ## continue: msg = "Error in Mail_Approval_Withdrawn_to_Referee function:" \ " The [%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number, but no match was made. The referee " \ "cannot be notified of the approval request " \ "withdrawal by mail." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionWarning(msg) else: ## The document type has no category. category = "" ## ## End of category recovery ####### ## Get the referee email address: if CFG_CERN_SITE: ## The referees system in CERN now works with listbox membership. ## List names should take the format ## "*****@*****.**" ## Make sure that your list exists! ## FIXME - to be replaced by a mailing alias in webaccess in the ## future. ## see if was a PROC request or not notes = get_approval_request_notes(doctype,rn) was_proc = 'n' was_slide = 'n' if notes: note_lines = notes.split('\n') for note_line in note_lines: if note_line.find('Requested Note Classification:') == 0: note_type = note_line.split()[-1] if note_type == 'PROC': was_proc = 'y' elif note_type == 'SLIDE': was_slide = 'y' break # there may be more than one - just take the first if was_proc == 'y': referee_listname = "service-cds-referee-%s" % doctype.lower() referee_listname += "-%s" % 'proc' elif was_slide == 'y': referee_listname = "atlas-speakers-comm" else: referee_listname = "service-cds-referee-%s" % doctype.lower() if category != "": referee_listname += "-%s" % category.lower() referee_listname += "@cern.ch" mailto_addresses = referee_listname if category == 'CDSTEST': ## our special testing category referee_listname = "service-cds-referee-%s" % doctype.lower() referee_listname += "-%s" % category.lower() mailto_addresses = referee_listname + "@cern.ch" else: referee_address = "" ## Try to retrieve the referee's email from the referee's database: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_%s" \ % (doctype, category))): referee_address += user[1] + "," ## And if there are general referees: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): referee_address += user[1] + "," referee_address = re.sub(",$", "", referee_address) # Creation of the mail for the referee mailto_addresses = "" if referee_address != "": mailto_addresses = referee_address + "," else: mailto_addresses = re.sub(",$", "", mailto_addresses) ## ## Send the email: mail_subj = "Request for approval of [%s] withdrawn" % rn mail_body = CFG_MAIL_BODY % \ { 'site-name' : CFG_SITE_NAME, 'report-number' : rn, } send_email(CFG_SITE_SUPPORT_EMAIL, mailto_addresses, mail_subj, mail_body, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) ## return ""
def Mail_Approval_Request_to_Referee(parameters, curdir, form, user_info=None): """ This function sends an email to the referee of a document informing him/her that a request for its approval has been submitted by the user. @param categ_file_appreq: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from a file in the current submission's working directory. It should therefore be a filename. @param categ_rnseek_appreq: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from the document's reference number. It is infact a string that will be compiled into a regexp and an attempt will be made to match it agains the document's reference number starting from the left-most position. The only pre-requisite is that the segment in which the category is sought should be indicated with <CATEGORY>. Thus, an example might be as follows: ATL(-COM)?-<CATEGORY>-.+ This would allow "PHYS" in the following reference number to be recognised as the category: ATL-COM-PHYS-2008-001 @param edsrn: (string) - the name of the field in which the report number should be placed when the referee visits the form for making a decision. @return: (string) - empty string. """ ## Get the reference number (as global rn - sorry!) and the document type: global sysno, rn doctype = form['doctype'] ######## ## Get the parameters from the list: ######## ## Get the name of the report-number file: ######## try: edsrn_file = parameters["edsrn"] except KeyError: ## No value given for the edsrn file: msg = "Error in Mail_Approval_Request_to_Referee function: unable " \ "to determine the name of the file in which the document's " \ "report number should be stored." raise InvenioWebSubmitFunctionError(msg) else: edsrn_file = str(edsrn_file) edsrn_file = os.path.basename(edsrn_file).strip() if edsrn_file == "": msg = "Error in Mail_Approval_Request_to_Referee function: " \ "unable to determine the name of the file in which " \ "the document's report number should be stored." raise InvenioWebSubmitFunctionError(msg) ######## ## Get the name of the category file: ####### try: ## If it has been provided, get the name of the file in which the ## category is stored: category_file = parameters["categ_file_appreq"] except KeyError: ## No value given for the category file: category_file = None else: if category_file is not None: category_file = str(category_file) category_file = os.path.basename(category_file).strip() if category_file == "": category_file = None ######## ## Get the regexp that is used to find the category in the report number: ######## try: ## If it has been provided, get the regexp used for identifying ## a document-type's category from its reference number: category_rn_regexp = parameters["categ_rnseek_appreq"] except KeyError: ## No value given for the category regexp: category_rn_regexp = None else: if category_rn_regexp is not None: category_rn_regexp = str(category_rn_regexp).strip() if category_rn_regexp == "": category_rn_regexp = None ####### ## Resolve the document type's category: ## ## This is a long process. The end result is that the category is extracted ## either from a file in curdir, or from the report number. ## If it's taken from the report number, the admin must configure the ## function to accept a regular expression that is used to find the ## category in the report number. ## if category_file is not None and category_rn_regexp is not None: ## It is not valid to have both a category file and a pattern ## describing how to extract the category from a report number. ## raise an InvenioWebSubmitFunctionError msg = "Error in Register_Approval_Request function: received " \ "instructions to search for the document's category in " \ "both its report number AND in a category file. Could " \ "not determine which to use - please notify the " \ "administrator." raise InvenioWebSubmitFunctionError(msg) elif category_file is not None: ## Attempt to recover the category information from a file in the ## current submission's working directory: category = ParamFromFile("%s/%s" % (curdir, category_file)) if category is not None: category = category.strip() if category in (None, ""): ## The category cannot be resolved. msg = "Error in Register_Approval_Request function: received " \ "instructions to search for the document's category in " \ "a category file, but could not recover the category " \ "from that file. An approval request therefore cannot " \ "be registered for the document." raise InvenioWebSubmitFunctionError(msg) elif category_rn_regexp is not None: ## Attempt to recover the category information from the document's ## reference number using the regexp in category_rn_regexp: ## ## Does the category regexp contain the key-phrase "<CATEG>"? if category_rn_regexp.find("<CATEG>") != -1: ## Yes. Replace "<CATEG>" with "(?P<category>.+?)". ## For example, this: ## ATL(-COM)?-<CATEG>- ## Will be transformed into this: ## ATL(-COM)?-(?P<category>.+?)- category_rn_final_regexp = \ category_rn_regexp.replace("<CATEG>", r"(?P<category>.+?)", 1) else: ## The regexp for category didn't contain "<CATEG>", but this is ## mandatory. msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number, " \ "using a poorly formed search expression (no marker for " \ "the category was present.) Since the document's category " \ "therefore cannot be retrieved, an approval request cannot " \ "be registered for it. Please report this problem to the " \ "administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) ## try: ## Attempt to compile the regexp for finding the category: re_categ_from_rn = re.compile(category_rn_final_regexp) except sre_constants.error: ## The expression passed to this function could not be compiled ## into a regexp. Register this exception and raise an ## InvenioWebSubmitFunctionError: exception_prefix = "Error in Register_Approval_Request function: " \ "The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number, using the " \ "following regexp: /%(regexp)s/. This regexp, " \ "however, could not be compiled correctly " \ "(created it from %(categ-search-term)s.)" \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number, " \ "using a poorly formed search expression. Since the " \ "document's category therefore cannot be retrieved, an " \ "approval request cannot be registered for it. Please " \ "report this problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## Now attempt to recover the category from the RN string: m_categ_from_rn = re_categ_from_rn.match(rn) if m_categ_from_rn is not None: ## The pattern matched in the string. ## Extract the category from the match: try: category = m_categ_from_rn.group("category") except IndexError: ## There was no "category" group. That group is mandatory. exception_prefix = \ "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number using the following regexp: " \ "/%(regexp)s/. The search produced a match, but " \ "there was no \"category\" group in the match " \ "object although this group is mandatory. The " \ "regexp was compiled from the following string: " \ "[%(categ-search-term)s]." \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number, using a poorly formed search " \ "expression (there was no category marker). Since " \ "the document's category therefore cannot be " \ "retrieved, an approval request cannot be " \ "registered for it. Please report this problem to " \ "the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: category = category.strip() if category == "": msg = "Error in Register_Approval_Request function: " \ "The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number, but no " \ "category was found. The request for approval " \ "cannot be registered. Please report this " \ "problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## No match. Cannot find the category and therefore cannot ## continue: msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number, but no match was made. The request " \ "for approval cannot be registered. Please report " \ "this problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## The document type has no category. category = "" ## ## End of category recovery ####### ####### ## Get the title and author(s) from the record: ####### ## Author(s): rec_authors = "" rec_first_author = print_record(int(sysno), 'tm', "100__a") rec_other_authors = print_record(int(sysno), 'tm', "700__a") if rec_first_author != "": rec_authors += "".join(["%s\n" % author.strip() for \ author in rec_first_author.split("\n")]) if rec_other_authors != "": rec_authors += "".join(["%s\n" % author.strip() for \ author in rec_other_authors.split("\n")]) ## Title: rec_title = "".join(["%s\n" % title.strip() for title in \ print_record(int(sysno), 'tm', "245__a").split("\n")]) ## ####### ## the normal approval action approve_act = 'APP' ## Get notes about the approval request: approval_notes = get_approval_request_notes(doctype, rn) ## Get the referee email address: if CFG_CERN_SITE: ## The referees system in CERN now works with listbox membership. ## List names should take the format ## "*****@*****.**" ## Make sure that your list exists! ## FIXME - to be replaced by a mailing alias in webaccess in the ## future. if doctype == 'ATN': ## Special case of 'RPR' action for doctype ATN action = ParamFromFile("%s/%s" % (curdir, 'act')).strip() if action == 'RPR': notetype = ParamFromFile("%s/%s" % (curdir, 'ATN_NOTETYPE')).strip() if notetype not in ('SLIDE', 'PROC'): raise InvenioWebSubmitFunctionError( 'ERROR function Mail_Approval_Request_to_Referee:: do not recognize notetype ' + notetype) if notetype == 'PROC': approve_act = 'APR' # RPR PROC requires APR action to approve referee_listname = "*****@*****.**" elif notetype == 'SLIDE': ## SLIDES approval approve_act = 'APS' # RPR SLIDE requires APS action to approve referee_listname = "*****@*****.**" else: raise InvenioWebSubmitFunctionError( 'ERROR function Mail_Approval_Request_to_Referee:: do not understand notetype: ' + notetype) else: referee_listname = "service-cds-referee-%s" % doctype.lower() if category != "": referee_listname += "-%s" % category.lower() mailto_addresses = referee_listname + "@cern.ch" if category == 'CDSTEST': referee_listname = "service-cds-referee-%s" % doctype.lower() referee_listname += "-%s" % category.lower() mailto_addresses = referee_listname + "@cern.ch" else: referee_address = "" ## Try to retrieve the referee's email from the referee's database: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_%s" \ % (doctype, category))): referee_address += user[1] + "," ## And if there are general referees: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): referee_address += user[1] + "," referee_address = re.sub(",$", "", referee_address) # Creation of the mail for the referee mailto_addresses = "" if referee_address != "": mailto_addresses = referee_address + "," else: mailto_addresses = re.sub(",$", "", mailto_addresses) ## ## Send the email: mail_subj = "Request for approval of [%s]" % rn mail_body = CFG_MAIL_BODY % \ { 'site-name' : CFG_SITE_NAME, 'CFG_SITE_RECORD' : CFG_SITE_RECORD, 'report-number-fieldname' : edsrn_file, 'report-number' : rn, 'title' : rec_title, 'authors' : rec_authors, 'site-url' : CFG_SITE_URL, 'record-id' : sysno, 'approval-action' : approve_act, 'doctype' : doctype, 'notes' : approval_notes, 'category' : category, } send_email(CFG_SITE_SUPPORT_EMAIL, mailto_addresses, mail_subj, mail_body, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) ## return ""
def User_is_Record_Owner_or_Curator(parameters, curdir, form, user_info=None): """ Check that user is either the original submitter, or that it belongs to the role(s) given as parameter. This enables collaborative editing of records, so that collections can be curated by a group of people in addition to the original submitter. If the user has permission, the function ends silently. If not, it will raise an InvenioWebSubmitFunctionStop, informing the user that they don't have rights and sending them back to the submission web form. This function makes it unnecessary to protect the submission with WebAccess (i.e. 'submit' action): the function can check authorizations by itself. However if the case the action in which this function is used is still protected with WebAccess (eg. an authorization exists for the 'submit' action, in 'MBI'), ALL the possible submitters AND the curators groups must be linked to the authorization in order for WebSubmit to let users reach this function: this function then ensures that only curators or submitters of the record will be able to continue further. A record owner must have her email in the record metadata. A record curator must be in the role given as parameter to this function. WARNING: you must remember that category-based restrictions require you to check that the selected category matches the document to modify: one can select category 'foo' to modify a document submitted in category 'bar', given that submissions are indepedendant of the record they create. WARNING: for backward compatibility reasons, if no role is given as parameter, the function simply check against the WebAccess 'submit' action, with this submission parameters. It then means that anybody connected to the authorization will be able to modify ANY of the records this submission can handle. @parameters: - curator_role: a role or mapping of roles that determine if user is a curator or not. The parameter can simply be the name of a WebAccess role. For eg: curator_photo where 'curator_photo' is a WebAccess role matching curator users for this submission. The parameter can also map the submission categories to different roles, so that different curator groups can be defined. For eg: ARTICLE=curator_art|REPORT=curator_rep|*=curator_gen (syntax: '|' to split mappings, and '=' to map category->role) This specifies that role 'curator_art' is used when category 'Article' is selected (code for this category is 'ARTICLE'), 'curator_rep' when 'Report' ('REPORT' code) is selected, and curator_gen in all other cases. * matches all categories. When defining a mapping category->role, and category cannot be retrieved (for eg. with /submit/direct URLs that do not specify category), only the * rule/role is matched. Eg: foo=role1|*=role2 matches role2 only When no role is defined or matched, the curator role is checked against the WebAccess 'submit' action, for current WebSubmit doctype, action and category. - curator_flag: the name of a file in which '1' is written if current submitter is a curator. Otherwise, an empty file is written. If no value is given, no file is written. @return: Empty string. @Exceptions raised: InvenioWebSubmitFunctionStop when user is denied permission to work with the record. """ global sysno # Check if the user is superadmin, in which case grant access if acc_is_user_in_role(user_info, CFG_SUPERADMINROLE_ID): return "" # Get current doctype doctype_fd = open(os.path.join(curdir, 'doctype')) doctype = doctype_fd.read() doctype_fd.close() # Get current action act_fd = open(os.path.join(curdir, 'act')) act = act_fd.read() act_fd.close() # Get category. This one might not exist category = None if os.path.exists(os.path.join(curdir, 'combo%s' % doctype)): category_fd = open(os.path.join(curdir, 'combo%s' % doctype)) category = category_fd.read() category_fd.close() # Get role to belong to in order to be curator. If not specifed, # we simply check against 'submit' WebAccess action for the current # WebSubmit action (for eg. 'MBI') curator_roles = [] try: curator_role = parameters['curator_role'] except: curator_role = '' if '=' in curator_role: # Admin specifed a different role for different category. # For eg: general=curator_gen|photo=curator_photo|*=curator_other curator_roles = [categ_and_role.split('=', 1)[1].strip() \ for categ_and_role in curator_role.split('|') if \ len(categ_and_role.split('=', 1)) == 2 and \ categ_and_role.split('=', 1)[0].strip() in (category, '*')] elif curator_role: curator_roles = [curator_role] ## Get the current user's e-mail address: user_email = user_info["email"].lower() ## Now get the email address(es) of the record submitter(s)/owner(s) from ## the record itself: record_owners_list = [email.lower().strip() for email in \ get_fieldvalues(sysno, CFG_WEBSUBMIT_RECORD_OWNER_EMAIL)] ## Now determine whether this user is listed in the record as an "owner" ## (or submitter): user_has_permission = False user_msg = "" if user_email not in ("", "guest") and user_email in record_owners_list: ## This user's email address is listed in the record. She should ## be allowed to work with it: user_has_permission = True # Check if user is curator is_curator = False if curator_roles: # Check against roles for role in curator_roles: if not acc_get_role_id(role): # Role is not defined continue if acc_is_user_in_role(user_info, acc_get_role_id(role)): # One matching role found user_has_permission = True is_curator = True break else: # Check against authorization for 'submit' (for backward compatibility) (auth_code, dummy) = acc_authorize_action(user_info, \ "submit", \ verbose=0, \ doctype=doctype, \ act=act) if auth_code == 0: ## The user is a curator for this ## submission/collection. Do not prevent access. is_curator = True user_has_permission = True try: curator_flag = parameters['curator_flag'] if curator_flag: flag_fd = open(os.path.join(curdir, curator_flag), 'w') flag_fd.write(is_curator and '1' or '0') flag_fd.close() except: pass ## Finally, if the user still doesn't have permission to work with this ## record, raise an InvenioWebSubmitFunctionStop exception sending the ## user back to the form. if not user_has_permission: raise InvenioWebSubmitFunctionStop(CFG_MSG_USER_NOT_AUTHORIZED) return ""
def Mail_Approval_Request_to_Referee(parameters, curdir, form, user_info=None): """ This function sends an email to the referee of a document informing him/her that a request for its approval has been submitted by the user. @param categ_file_appreq: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from a file in the current submission's working directory. It should therefore be a filename. @param categ_rnseek_appreq: (string) - some document types are separated into different categories, each of which has its own referee(s). In such document types, it's necessary to know the document- type's category in order to choose the referee. This parameter provides a means by which the category information can be extracted from the document's reference number. It is infact a string that will be compiled into a regexp and an attempt will be made to match it agains the document's reference number starting from the left-most position. The only pre-requisite is that the segment in which the category is sought should be indicated with <CATEGORY>. Thus, an example might be as follows: ATL(-COM)?-<CATEGORY>-.+ This would allow "PHYS" in the following reference number to be recognised as the category: ATL-COM-PHYS-2008-001 @param edsrn: (string) - the name of the field in which the report number should be placed when the referee visits the form for making a decision. @return: (string) - empty string. """ ## Get the reference number (as global rn - sorry!) and the document type: global sysno, rn doctype = form['doctype'] ######## ## Get the parameters from the list: ######## ## Get the name of the report-number file: ######## try: edsrn_file = parameters["edsrn"] except KeyError: ## No value given for the edsrn file: msg = "Error in Mail_Approval_Request_to_Referee function: unable " \ "to determine the name of the file in which the document's " \ "report number should be stored." raise InvenioWebSubmitFunctionError(msg) else: edsrn_file = str(edsrn_file) edsrn_file = os.path.basename(edsrn_file).strip() if edsrn_file == "": msg = "Error in Mail_Approval_Request_to_Referee function: " \ "unable to determine the name of the file in which " \ "the document's report number should be stored." raise InvenioWebSubmitFunctionError(msg) ######## ## Get the name of the category file: ####### try: ## If it has been provided, get the name of the file in which the ## category is stored: category_file = parameters["categ_file_appreq"] except KeyError: ## No value given for the category file: category_file = None else: if category_file is not None: category_file = str(category_file) category_file = os.path.basename(category_file).strip() if category_file == "": category_file = None ######## ## Get the regexp that is used to find the category in the report number: ######## try: ## If it has been provided, get the regexp used for identifying ## a document-type's category from its reference number: category_rn_regexp = parameters["categ_rnseek_appreq"] except KeyError: ## No value given for the category regexp: category_rn_regexp = None else: if category_rn_regexp is not None: category_rn_regexp = str(category_rn_regexp).strip() if category_rn_regexp == "": category_rn_regexp = None ####### ## Resolve the document type's category: ## ## This is a long process. The end result is that the category is extracted ## either from a file in curdir, or from the report number. ## If it's taken from the report number, the admin must configure the ## function to accept a regular expression that is used to find the ## category in the report number. ## if category_file is not None and category_rn_regexp is not None: ## It is not valid to have both a category file and a pattern ## describing how to extract the category from a report number. ## raise an InvenioWebSubmitFunctionError msg = "Error in Register_Approval_Request function: received " \ "instructions to search for the document's category in " \ "both its report number AND in a category file. Could " \ "not determine which to use - please notify the " \ "administrator." raise InvenioWebSubmitFunctionError(msg) elif category_file is not None: ## Attempt to recover the category information from a file in the ## current submission's working directory: category = ParamFromFile("%s/%s" % (curdir, category_file)) if category is not None: category = category.strip() if category in (None, ""): ## The category cannot be resolved. msg = "Error in Register_Approval_Request function: received " \ "instructions to search for the document's category in " \ "a category file, but could not recover the category " \ "from that file. An approval request therefore cannot " \ "be registered for the document." raise InvenioWebSubmitFunctionError(msg) elif category_rn_regexp is not None: ## Attempt to recover the category information from the document's ## reference number using the regexp in category_rn_regexp: ## ## Does the category regexp contain the key-phrase "<CATEG>"? if category_rn_regexp.find("<CATEG>") != -1: ## Yes. Replace "<CATEG>" with "(?P<category>.+?)". ## For example, this: ## ATL(-COM)?-<CATEG>- ## Will be transformed into this: ## ATL(-COM)?-(?P<category>.+?)- category_rn_final_regexp = \ category_rn_regexp.replace("<CATEG>", r"(?P<category>.+?)", 1) else: ## The regexp for category didn't contain "<CATEG>", but this is ## mandatory. msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number, " \ "using a poorly formed search expression (no marker for " \ "the category was present.) Since the document's category " \ "therefore cannot be retrieved, an approval request cannot " \ "be registered for it. Please report this problem to the " \ "administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) ## try: ## Attempt to compile the regexp for finding the category: re_categ_from_rn = re.compile(category_rn_final_regexp) except sre_constants.error: ## The expression passed to this function could not be compiled ## into a regexp. Register this exception and raise an ## InvenioWebSubmitFunctionError: exception_prefix = "Error in Register_Approval_Request function: " \ "The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number, using the " \ "following regexp: /%(regexp)s/. This regexp, " \ "however, could not be compiled correctly " \ "(created it from %(categ-search-term)s.)" \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to search " \ "for the document type's category in its reference number, " \ "using a poorly formed search expression. Since the " \ "document's category therefore cannot be retrieved, an " \ "approval request cannot be registered for it. Please " \ "report this problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## Now attempt to recover the category from the RN string: m_categ_from_rn = re_categ_from_rn.match(rn) if m_categ_from_rn is not None: ## The pattern matched in the string. ## Extract the category from the match: try: category = m_categ_from_rn.group("category") except IndexError: ## There was no "category" group. That group is mandatory. exception_prefix = \ "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number using the following regexp: " \ "/%(regexp)s/. The search produced a match, but " \ "there was no \"category\" group in the match " \ "object although this group is mandatory. The " \ "regexp was compiled from the following string: " \ "[%(categ-search-term)s]." \ % { 'doctype' : doctype, \ 'regexp' : category_rn_final_regexp, \ 'categ-search-term' : category_rn_regexp, } register_exception(prefix=exception_prefix) msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number, using a poorly formed search " \ "expression (there was no category marker). Since " \ "the document's category therefore cannot be " \ "retrieved, an approval request cannot be " \ "registered for it. Please report this problem to " \ "the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: category = category.strip() if category == "": msg = "Error in Register_Approval_Request function: " \ "The [%(doctype)s] submission has been " \ "configured to search for the document type's " \ "category in its reference number, but no " \ "category was found. The request for approval " \ "cannot be registered. Please report this " \ "problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## No match. Cannot find the category and therefore cannot ## continue: msg = "Error in Register_Approval_Request function: The " \ "[%(doctype)s] submission has been configured to " \ "search for the document type's category in its " \ "reference number, but no match was made. The request " \ "for approval cannot be registered. Please report " \ "this problem to the administrator." \ % { 'doctype' : doctype, } raise InvenioWebSubmitFunctionError(msg) else: ## The document type has no category. category = "" ## ## End of category recovery ####### ####### ## Get the title and author(s) from the record: ####### ## Author(s): rec_authors = "" rec_first_author = print_record(int(sysno), 'tm', "100__a") rec_other_authors = print_record(int(sysno), 'tm', "700__a") if rec_first_author != "": rec_authors += "".join(["%s\n" % author.strip() for \ author in rec_first_author.split("\n")]) if rec_other_authors != "": rec_authors += "".join(["%s\n" % author.strip() for \ author in rec_other_authors.split("\n")]) ## Title: rec_title = "".join(["%s\n" % title.strip() for title in \ print_record(int(sysno), 'tm', "245__a").split("\n")]) ## ####### ## the normal approval action approve_act = 'APP' ## Get notes about the approval request: approval_notes = get_approval_request_notes(doctype, rn) ## Get the referee email address: if CFG_CERN_SITE: ## The referees system in CERN now works with listbox membership. ## List names should take the format ## "*****@*****.**" ## Make sure that your list exists! ## FIXME - to be replaced by a mailing alias in webaccess in the ## future. if doctype == 'ATN': ## Special case of 'RPR' action for doctype ATN action = ParamFromFile("%s/%s" % (curdir,'act')).strip() if action == 'RPR': notetype = ParamFromFile("%s/%s" % (curdir,'ATN_NOTETYPE')).strip() if notetype not in ('SLIDE','PROC'): raise InvenioWebSubmitFunctionError('ERROR function Mail_Approval_Request_to_Referee:: do not recognize notetype ' + notetype) if notetype == 'PROC': approve_act = 'APR' # RPR PROC requires APR action to approve referee_listname = "*****@*****.**" elif notetype == 'SLIDE': ## SLIDES approval approve_act = 'APS' # RPR SLIDE requires APS action to approve referee_listname = "*****@*****.**" else: raise InvenioWebSubmitFunctionError('ERROR function Mail_Approval_Request_to_Referee:: do not understand notetype: ' +notetype) else: referee_listname = "service-cds-referee-%s" % doctype.lower() if category != "": referee_listname += "-%s" % category.lower() mailto_addresses = referee_listname + "@cern.ch" if category == 'CDSTEST': referee_listname = "service-cds-referee-%s" % doctype.lower() referee_listname += "-%s" % category.lower() mailto_addresses = referee_listname + "@cern.ch" else: referee_address = "" ## Try to retrieve the referee's email from the referee's database: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_%s" \ % (doctype, category))): referee_address += user[1] + "," ## And if there are general referees: for user in \ acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): referee_address += user[1] + "," referee_address = re.sub(",$", "", referee_address) # Creation of the mail for the referee mailto_addresses = "" if referee_address != "": mailto_addresses = referee_address + "," else: mailto_addresses = re.sub(",$", "", mailto_addresses) ## ## Send the email: mail_subj = "Request for approval of [%s]" % rn mail_body = CFG_MAIL_BODY % \ { 'site-name' : CFG_SITE_NAME, 'CFG_SITE_RECORD' : CFG_SITE_RECORD, 'report-number-fieldname' : edsrn_file, 'report-number' : rn, 'title' : rec_title, 'authors' : rec_authors, 'site-url' : CFG_SITE_URL, 'record-id' : sysno, 'approval-action' : approve_act, 'doctype' : doctype, 'notes' : approval_notes, 'category' : category, } send_email(CFG_SITE_SUPPORT_EMAIL, mailto_addresses, mail_subj, mail_body, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) ## return ""
def Send_APP_Mail (parameters, curdir, form, user_info=None): """ This function send an email informing the original submitter of a document that the referee has approved/ rejected the document. The email is also sent to the referee for checking. Parameters: * addressesAPP: email addresses of the people who will receive this email (comma separated list). this parameter may contain the <CATEG> string. In which case the variable computed from the [categformatAFP] parameter replaces this string. eg.: "<CATEG>[email protected]" * categformatAPP contains a regular expression used to compute the category of the document given the reference of the document. eg.: if [categformatAFP]="TEST-<CATEG>-.*" and the reference of the document is "TEST-CATEGORY1-2001-001", then the computed category equals "CATEGORY1" * newrnin: Name of the file containing the 2nd reference of the approved document (if any). * edsrn: Name of the file containing the reference of the approved document. """ global titlevalue,authorvalue, emailvalue,sysno,rn FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME,CFG_SITE_SUPPORT_EMAIL) sequence_id = bibtask_allocate_sequenceid(curdir) doctype = form['doctype'] titlevalue = titlevalue.replace("\n"," ") authorvalue = authorvalue.replace("\n","; ") # variables declaration categformat = parameters['categformatAPP'] otheraddresses = parameters['addressesAPP'] newrnpath = parameters['newrnin'] ## Get the name of the decision file: try: decision_filename = parameters['decision_file'] except KeyError: decision_filename = "" ## Get the name of the comments file: try: comments_filename = parameters['comments_file'] except KeyError: comments_filename = "" ## Now try to read the comments from the comments_filename: if comments_filename in (None, "", "NULL"): ## We don't have a name for the comments file. ## For backward compatibility reasons, try to read the comments from ## a file called 'COM' in curdir: if os.path.exists("%s/COM" % curdir): try: fh_comments = open("%s/COM" % curdir, "r") comment = fh_comments.read() fh_comments.close() except IOError: ## Unable to open the comments file exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open " \ "comments file [%s/COM] but was " \ "unable to." % curdir register_exception(prefix=exception_prefix) comment = "" else: comment = comment.strip() else: comment = "" else: ## Try to read the comments from the comments file: if os.path.exists("%s/%s" % (curdir, comments_filename)): try: fh_comments = open("%s/%s" % (curdir, comments_filename), "r") comment = fh_comments.read() fh_comments.close() except IOError: ## Oops, unable to open the comments file. comment = "" exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open comments " \ "file [%s/%s] but was unable to." \ % (curdir, comments_filename) register_exception(prefix=exception_prefix) else: comment = comment.strip() else: comment = "" ## Now try to read the decision from the decision_filename: if decision_filename in (None, "", "NULL"): ## We don't have a name for the decision file. ## For backward compatibility reasons, try to read the decision from ## a file called 'decision' in curdir: if os.path.exists("%s/decision" % curdir): try: fh_decision = open("%s/decision" % curdir, "r") decision = fh_decision.read() fh_decision.close() except IOError: ## Unable to open the decision file exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open " \ "decision file [%s/decision] but was " \ "unable to." % curdir register_exception(prefix=exception_prefix) decision = "" else: decision = decision.strip() else: decision = "" else: ## Try to read the decision from the decision file: try: fh_decision = open("%s/%s" % (curdir, decision_filename), "r") decision = fh_decision.read() fh_decision.close() except IOError: ## Oops, unable to open the decision file. decision = "" exception_prefix = "Error in WebSubmit function " \ "Send_APP_Mail. Tried to open decision " \ "file [%s/%s] but was unable to." \ % (curdir, decision_filename) register_exception(prefix=exception_prefix) else: decision = decision.strip() if os.path.exists("%s/%s" % (curdir,newrnpath)): fp = open("%s/%s" % (curdir,newrnpath) , "r") newrn = fp.read() fp.close() else: newrn = "" # Document name res = run_sql("SELECT ldocname FROM sbmDOCTYPE WHERE sdocname=%s", (doctype,)) docname = res[0][0] # retrieve category categformat = categformat.replace("<CATEG>", "([^-]*)") m_categ_search = re.match(categformat, rn) if m_categ_search is not None: if len(m_categ_search.groups()) > 0: ## Found a match for the category of this document. Get it: category = m_categ_search.group(1) else: ## This document has no category. category = "unknown" else: category = "unknown" ## Get the referee email address: if CFG_CERN_SITE: ## The referees system in CERN now works with listbox membership. ## List names should take the format ## "*****@*****.**" ## Make sure that your list exists! ## FIXME - to be replaced by a mailing alias in webaccess in the ## future. referee_listname = "service-cds-referee-%s" % doctype.lower() if category != "": referee_listname += "-%s" % category.lower() referee_listname += "@cern.ch" addresses = referee_listname else: # Build referee's email address refereeaddress = "" # Try to retrieve the referee's email from the referee's database for user in acc_get_role_users(acc_get_role_id("referee_%s_%s" % (doctype,category))): refereeaddress += user[1] + "," # And if there is a general referee for user in acc_get_role_users(acc_get_role_id("referee_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$","",refereeaddress) # Creation of the mail for the referee otheraddresses = otheraddresses.replace("<CATEG>",category) addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) ## Add the record's submitter(s) into the list of recipients: ## Get the email address(es) of the record submitter(s)/owner(s) from ## the record itself: record_owners = print_record(sysno, 'tm', \ [CFG_WEBSUBMIT_RECORD_OWNER_EMAIL]).strip() if record_owners != "": record_owners_list = record_owners.split("\n") record_owners_list = [email.lower().strip() \ for email in record_owners_list] else: #if the record owner can not be retrieved from the metadata #(in case the record has not been inserted yet), #try to use the global variable emailvalue try: record_owners_list = [emailvalue] except NameError: record_owners_list = [] record_owners = ",".join([owner for owner in record_owners_list]) if record_owners != "": addresses += ",%s" % record_owners if decision == "approve": mailtitle = "%s has been approved" % rn mailbody = "The %s %s has been approved." % (docname,rn) mailbody += "\nIt will soon be accessible here:\n\n<%s/%s/%s>" % (CFG_SITE_URL,CFG_SITE_RECORD,sysno) else: mailtitle = "%s has been rejected" % rn mailbody = "The %s %s has been rejected." % (docname,rn) if rn != newrn and decision == "approve" and newrn != "": mailbody += "\n\nIts new reference number is: %s" % newrn mailbody += "\n\nTitle: %s\n\nAuthor(s): %s\n\n" % (titlevalue,authorvalue) if comment != "": mailbody += "Comments from the referee:\n%s\n" % comment # Send mail to referee if any recipients or copy to admin if addresses or CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN: scheduled_send_email(FROMADDR, addresses, mailtitle, mailbody, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN, other_bibtasklet_arguments=['-I', str(sequence_id)]) return ""
def Send_Request_For_Direct_Approval(parameters, curdir, form, user_info=None): """ This function sends an email to the referee asking him/her to approve/reject a document Parameters: * directory: parameter to the link manager program * addressesDAM: address of the referee(s) * categformatDAM: variable needed to extract the category of the document and use it to derive the address. * authorfile: name of the file containing the author list * titleFile: name of the file containing the title """ global rn,sysno # variables declaration doctype = re.search(".*/([^/]*)/([^/]*)/[^/]*$",curdir).group(2) FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME,CFG_SITE_SUPPORT_EMAIL) otheraddresses = parameters['addressesDAM'] categformat = parameters['categformatDAM'] # retrieve category categformat = categformat.replace("<CATEG>","([^-]*)") categs = re.match(categformat,rn) if categs is not None: category = categs.group(1) else: category = "unknown" # create TI if os.path.exists("%s/date" % curdir): fp = open("%s/date" % curdir, "r") date = fp.read() fp.close() else: date = "" if os.path.exists("%s/%s" % (curdir,parameters['titleFile'])): fp = open("%s/%s" % (curdir,parameters['titleFile']),"r") title = fp.read() fp.close() title = title.replace("\n","") else: title = "" title += " - %s" % date # create AU if os.path.exists("%s/%s" % (curdir,parameters['authorfile'])): fp = open("%s/%s" % (curdir,parameters['authorfile']), "r") author = fp.read() fp.close() else: author = "" # we get the referee password #sth = run_sql("SELECT access FROM sbmAPPROVAL WHERE rn=%s", (rn,)) #if len(sth) >0: #access = sth[0][0] # Build referee's email address refereeaddress = "" # Try to retrieve the publication committee chair's email from the role database for user in acc_get_role_users(acc_get_role_id("projectleader_%s_%s" % (doctype,category))): refereeaddress += user[1] + "," # And if there are general referees for user in acc_get_role_users(acc_get_role_id("projectleader_%s_*" % doctype)): refereeaddress += user[1] + "," refereeaddress = re.sub(",$","",refereeaddress) # Creation of the mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) title_referee = "Request for direct approval of %s" % rn mail_referee = "The document %s has been asked direct approval to the %s Server..\nYour approval is requested on it.\n\n" % (rn,CFG_SITE_NAME) mail_referee +="Title: %s\n\nAuthor(s): %s\n\n" % (title,author) mail_referee +="To access the document(s), select the file(s) from the location:<%s/%s/%s/files/>\n\n" % (CFG_SITE_URL,CFG_SITE_RECORD,sysno) mail_referee +="To approve/reject the document, you should go to this URL:\n<%s/publiline.py?doctype=%s&categ=%s&RN=%s>\n" % (CFG_SITE_URL,doctype,category,rn) mail_referee +="---------------------------------------------\nBest regards.\nThe submission team.\n" #Send mail to referee send_email(FROMADDR, addresses, title_referee, mail_referee, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) return ""
def _precache(self, info, force=False): """Calculate permissions for user actions. FIXME: compatibility layer only !!! """ CFG_BIBAUTHORID_ENABLED = current_app.config.get( 'CFG_BIBAUTHORID_ENABLED', False) # get authorization key acc_key = self.get_acc_key() acc = cache.get(acc_key) if not force and acc_key is not None and acc is not None: return acc # FIXME: acc_authorize_action should use flask request directly user_info = info user_info.update(self.req) from invenio.legacy.webuser import isUserSubmitter, isUserReferee, \ isUserAdmin, isUserSuperAdmin from invenio.modules.access.engine import acc_authorize_action from invenio.modules.access.control import acc_get_role_id, \ acc_is_user_in_role from invenio_search.utils import \ get_permitted_restricted_collections from invenio_deposit.cache import \ get_authorized_deposition_types data = {} data['precached_permitted_restricted_collections'] = \ get_permitted_restricted_collections(user_info) data['precached_allowed_deposition_types'] = \ get_authorized_deposition_types(user_info) data['precached_useloans'] = acc_authorize_action( user_info, 'useloans')[0] == 0 data['precached_usegroups'] = acc_authorize_action( user_info, 'usegroups')[0] == 0 data['precached_usemessages'] = acc_authorize_action( user_info, 'usemessages')[0] == 0 try: data['precached_viewsubmissions'] = isUserSubmitter(user_info) except Exception: data['precached_viewsubmissions'] = None data['precached_useapprove'] = isUserReferee(user_info) data['precached_useadmin'] = isUserAdmin(user_info) data['precached_usesuperadmin'] = isUserSuperAdmin(user_info) data['precached_canseehiddenmarctags'] = acc_authorize_action( user_info, 'runbibedit')[0] == 0 usepaperclaim = False usepaperattribution = False viewclaimlink = False if (CFG_BIBAUTHORID_ENABLED and acc_is_user_in_role( user_info, acc_get_role_id("paperclaimviewers"))): usepaperclaim = True if (CFG_BIBAUTHORID_ENABLED and acc_is_user_in_role( user_info, acc_get_role_id("paperattributionviewers"))): usepaperattribution = True viewlink = False try: viewlink = session['personinfo']['claim_in_process'] except (KeyError, TypeError): pass if (current_app.config.get('CFG_BIBAUTHORID_ENABLED') and usepaperattribution and viewlink): viewclaimlink = True # if (CFG_BIBAUTHORID_ENABLED # and ((usepaperclaim or usepaperattribution) # and acc_is_user_in_role( # data, acc_get_role_id("paperattributionlinkviewers")))): # viewclaimlink = True data['precached_viewclaimlink'] = viewclaimlink data['precached_usepaperclaim'] = usepaperclaim data['precached_usepaperattribution'] = usepaperattribution timeout = current_app.config.get( 'CFG_WEBSESSION_EXPIRY_LIMIT_DEFAULT', 0)*3600 cache.set(acc_key, data, timeout=timeout) return data
def _precache(self, info, force=False): """Calculate prermitions for user actions. FIXME: compatibility layer only !!! """ CFG_BIBAUTHORID_ENABLED = current_app.config.get( 'CFG_BIBAUTHORID_ENABLED', False) # get autorization key acc_key = self.get_acc_key() acc = cache.get(acc_key) if not force and acc_key is not None and acc is not None: return acc # FIXME: acc_authorize_action should use flask request directly user_info = info user_info.update(self.req) from invenio.legacy.webuser import isUserSubmitter, isUserReferee, \ isUserAdmin, isUserSuperAdmin from invenio.modules.access.engine import acc_authorize_action from invenio.modules.access.control import acc_get_role_id, \ acc_is_user_in_role from invenio.modules.search.utils import \ get_permitted_restricted_collections data = {} data['precached_permitted_restricted_collections'] = \ get_permitted_restricted_collections(user_info) data['precached_usebaskets'] = acc_authorize_action( user_info, 'usebaskets')[0] == 0 data['precached_useloans'] = acc_authorize_action( user_info, 'useloans')[0] == 0 data['precached_usegroups'] = acc_authorize_action( user_info, 'usegroups')[0] == 0 data['precached_usealerts'] = acc_authorize_action( user_info, 'usealerts')[0] == 0 data['precached_usemessages'] = acc_authorize_action( user_info, 'usemessages')[0] == 0 data['precached_usestats'] = acc_authorize_action( user_info, 'runwebstatadmin')[0] == 0 try: data['precached_viewsubmissions'] = isUserSubmitter(user_info) except Exception: data['precached_viewsubmissions'] = None data['precached_useapprove'] = isUserReferee(user_info) data['precached_useadmin'] = isUserAdmin(user_info) data['precached_usesuperadmin'] = isUserSuperAdmin(user_info) data['precached_canseehiddenmarctags'] = acc_authorize_action( user_info, 'runbibedit')[0] == 0 usepaperclaim = False usepaperattribution = False viewclaimlink = False if (CFG_BIBAUTHORID_ENABLED and acc_is_user_in_role( user_info, acc_get_role_id("paperclaimviewers"))): usepaperclaim = True if (CFG_BIBAUTHORID_ENABLED and acc_is_user_in_role( user_info, acc_get_role_id("paperattributionviewers"))): usepaperattribution = True viewlink = False try: viewlink = session['personinfo']['claim_in_process'] except (KeyError, TypeError): pass if (current_app.config.get('CFG_BIBAUTHORID_ENABLED') and usepaperattribution and viewlink): viewclaimlink = True # if (CFG_BIBAUTHORID_ENABLED # and ((usepaperclaim or usepaperattribution) # and acc_is_user_in_role( # data, acc_get_role_id("paperattributionlinkviewers")))): # viewclaimlink = True data['precached_viewclaimlink'] = viewclaimlink data['precached_usepaperclaim'] = usepaperclaim data['precached_usepaperattribution'] = usepaperattribution timeout = current_app.config.get( 'CFG_WEBSESSION_EXPIRY_LIMIT_DEFAULT', 0)*3600 cache.set(acc_key, data, timeout=timeout) return data