def displayUserTable(doctype): """Display the list of referees for the given doctype, as well as the control to remove them""" t = "" # start displaying the table which will contain the list of email addresses. t += """ <table class="searchbox"> <tr> <th class="portalboxheader" colspan="2">Referees</th> </tr>""" roles = acc_get_all_roles() referees = {} for role in roles: role_name = role[1] role_id = role[0] if re.match("^referee_%s_" % doctype, role_name): # Try to retrieve the referee's email from the referee's database if acc_get_role_users(role_id) is not None: referees[role_name] = acc_get_role_users(role_id) if len(referees) == 0: t += '<tr><td align="center" colspan="2"><img src="%s/img/noway.gif" height="16px" width="16px" alt="Empty"/></td></tr>' % CFG_SITE_URL i = 0 for role in referees.keys(): categ = re.match("referee_%s_(.*)" % doctype, role).group(1) res = run_sql( "SELECT lname FROM sbmCATEGORIES WHERE sname=%s and doctype=%s", ( categ, doctype, )) if len(res) > 0: categname = "Referee(s) for category: %s" % res[0][0] else: categname = "General Referee(s)" t += '<tr><td colspan="2"><small><b>%s</b> </small></td></tr>' % categname for referee in referees[role]: if int(i / 2) == i / 2: bgcolor = "#eeeeee" else: bgcolor = "#dddddd" t += '<tr bgcolor="%s">' % bgcolor t += '<td align="right"><small>' t += referee[1] t += '</small></td>' t += '''<td><a href="" onclick="if (confirm('Are you sure you want to delete this referee?')){document.forms[0].todo.value='deleteuser';document.forms[0].id.value='%s';document.forms[0].role.value='%s';document.forms[0].submit();return false;}else{return false;}">''' % ( referee[0], role) t += '<img src="%s/img/iconcross.gif" border="0" alt="Remove" /></a>' % CFG_SITE_URL t += '</td>' t += '</tr>' i += 1 # close table t += "</table>" return t
def displayUserTable(doctype): """Display the list of referees for the given doctype, as well as the control to remove them""" t = "" # start displaying the table which will contain the list of email addresses. t += """ <table class="searchbox"> <tr> <th class="portalboxheader" colspan="2">Referees</th> </tr>""" roles = acc_get_all_roles() referees = {} for role in roles: role_name = role[1] role_id = role[0] if re.match("^referee_%s_" % doctype, role_name): # Try to retrieve the referee's email from the referee's database if acc_get_role_users(role_id) is not None: referees[role_name] = acc_get_role_users(role_id) if len(referees) == 0: t += '<tr><td align="center" colspan="2"><img src="%s/img/noway.gif" height="16px" width="16px" alt="Empty"/></td></tr>' % CFG_SITE_URL i = 0 for role in referees.keys(): categ = re.match("referee_%s_(.*)" % doctype, role).group(1) res = run_sql("SELECT lname FROM sbmCATEGORIES WHERE sname=%s and doctype=%s", (categ, doctype,)) if len(res) > 0: categname = "Referee(s) for category: %s" % res[0][0] else: categname = "General Referee(s)" t += '<tr><td colspan="2"><small><b>%s</b> </small></td></tr>' % categname for referee in referees[role]: if int(i/2) == i/2: bgcolor = "#eeeeee" else: bgcolor = "#dddddd" t += '<tr bgcolor="%s">' % bgcolor t += '<td align="right"><small>' t += referee[1] t += '</small></td>' t += '''<td><a href="" onclick="if (confirm('Are you sure you want to delete this referee?')){document.forms[0].todo.value='deleteuser';document.forms[0].id.value='%s';document.forms[0].role.value='%s';document.forms[0].submit();return false;}else{return false;}">''' % (referee[0], role) t += '<img src="%s/img/iconcross.gif" border="0" alt="Remove" /></a>' % CFG_SITE_URL t += '</td>' t += '</tr>' i += 1 # close table t += "</table>" return t
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 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 acc_get_authorized_emails(name_action, **arguments): """ Given the action and its arguments, try to retireve all the matching email addresses of users authorized. This is a best effort operation, because if a role is authorized and happens to be defined using a FireRole rule based on regular expression or on IP addresses, non every email might be returned. @param name_action: the name of the action. @type name_action: string @param arguments: the arguments to the action. @return: the list of authorized emails. @rtype: set of string """ authorized_emails = set() roles = acc_find_possible_roles(name_action, always_add_superadmin=False, **arguments) for id_role in roles: for dummy1, email, dummy2 in acc_get_role_users(id_role): authorized_emails.add(email.lower().strip()) firerole = load_role_definition(id_role) authorized_emails = authorized_emails.union(acc_firerole_extract_emails(firerole)) return authorized_emails
def Send_Request_For_Refereeing_Process(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 refereeing process of %s" % rn mail_referee = "The document %s has been asked for refereing process 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/record/%s/files/>\n\n" % ( CFG_SITE_URL, sysno) mail_referee += "To approve/reject the document, you should go to this URL:\n<%s/approve.py?%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_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/record/%s/files/>\n\n" % (CFG_SITE_URL,sysno) mail_referee +="To approve/reject the document, you should go to this URL:\n<%s/approve.py?%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_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, '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 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 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 JOBSUBMIT_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" * titleFile: name of the file in which the title is stored. * contactnamefile: name of the file in which the title is stored. * contactemailfile: name of the file in which the title is stored. * referencefile: name of the file in which the title is stored. * affiliationfile: name of the file in which the title is stored. * regionfile: name of the file in which the title is stored. * rankfile: name of the file in which the title is stored. * fieldfile: name of the file in which the title is stored. * experimentsfile: name of the file in which the title is stored. * urlfile: name of the file in which the title is stored. * datefile: name of the file in which the title is stored. * abstractfile: 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) 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" # get record data date = get_file_contents(curdir, "date") title = get_file_contents(curdir, parameters['titleFile']).replace("\n", "") title += " - %s" % date contactname = get_file_contents(curdir, parameters['contactnamefile']).replace( "\n", ", ") contactemail = get_file_contents(curdir, parameters['contactemailfile']).replace( "\n", ", ") reference = get_file_contents(curdir, parameters['referencefile']).replace( "\n", ", ") affiliation = get_file_contents(curdir, parameters['affiliationfile']).replace( "\n", ", ") region = get_file_contents(curdir, parameters['regionfile']).replace("\n", ", ") rank = get_file_contents(curdir, parameters['rankfile']).replace("\n", ", ") field = get_file_contents(curdir, parameters['fieldfile']).replace("\n", ", ") experiments = get_file_contents(curdir, parameters['experimentsfile']).replace( "\n", ", ") url = get_file_contents(curdir, parameters['urlfile']).replace("\n", " ") date = get_file_contents(curdir, parameters['datefile']).replace("\n", "") abstract = get_file_contents(curdir, parameters['abstractfile']) # 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 != "" and otheraddresses != CFG_WEBSUBMIT_JOBS_SUPPORT_EMAIL: addresses += otheraddresses else: addresses = re.sub(",$", "", addresses) record_url = "%s/%s/%s" % (CFG_SITE_URL, CFG_SITE_RECORD, sysno) title_referee = "Request for approval of %s" % rn mail_referee = """ The document %(rn)s has been submitted to the Jobs database.\nYour approval is requested on it. Title: %(title)s Contact name(s): %(contactname)s Contact email(s): %(contactemail)s Reference(s): %(reference)s Affliliation(s): %(affiliation)s Region(s): %(region)s Rank(s): %(rank)s Field(s): %(field)s Experiments(s): %(experiments)s URL: %(url)s Deadline date: %(date)s Description: %(abstract)s The record will appear here: %(recordlink)s To approve/reject the document, you should go to this URL:\n%(access)s\n """ % { 'rn': rn, 'title': title, 'contactname': contactname, 'contactemail': contactemail, 'reference': reference, 'affiliation': affiliation, 'region': region, 'rank': rank, 'region': region, 'field': field, 'experiments': experiments, 'url': url, 'date': date, 'abstract': abstract, 'access': "%s/approve.py?access=%s" % (CFG_SITE_URL, access), 'recordlink': record_url } #Send mail to referee send_email(fromaddr=CFG_WEBSUBMIT_JOBS_FROMADDR, toaddr=CFG_WEBSUBMIT_JOBS_SUPPORT_EMAIL, subject=title_referee, \ content=mail_referee, footer=email_footer(support_email=CFG_WEBSUBMIT_JOBS_SUPPORT_EMAIL), copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN, bccaddr=addresses, replytoaddr=contactemail) 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 DPI_Mail_Approval_Request_to_Referee(parameters, curdir, form, user_info=None): """ This function sends an email to the referee in order to start the approval process related to the deletion of a post record. 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" * directory: parameter used to create the URL to access the files. """ global rn, sysno doctype = 'BSIREF' approval_action = 'APO' action = ParamFromFile("%s/%s" % (curdir,'act')).strip() 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 = "" post_author = "".join(["%s" % author.strip() for author in \ get_fieldvalues(int(sysno), "100__a")]) post_title = "".join(["%s" % title.strip() for title in \ get_fieldvalues(int(sysno), "245__a")]) post_url = "".join(["%s" % url.strip() for url in \ get_fieldvalues(int(sysno), "520__u")]) # 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 e-mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) # Send the email: mail_subject = "Request for post deletion approval : [%(id)s]" if post_title: mail_subject = mail_subject % {'id': post_title} else: mail_subject = mail_subject % {'id': post_url} mail_body = CFG_MAIL_BODY % \ {'title': post_title, 'author': post_author, 'post_url': post_url, 'record_id': sysno, 'site_name': CFG_SITE_NAME, 'site_url': CFG_SITE_URL, 'doctype': doctype, 'access': access, 'approval_action': approval_action, 'rn': rn } send_email(CFG_SITE_SUPPORT_EMAIL, addresses, mail_subject, 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, sysno, rn FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME, CFG_SITE_SUPPORT_EMAIL) 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: 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: send_email(FROMADDR, addresses, mailtitle, mailbody, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN) return ""
def MBI_Mail_Approval_Request_to_Referee(parameters, curdir, form, user_info=None): """ This function sends an email to the referee in order to start the approval process related to the metadata modification of a blog record. 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" * directory: parameter used to create the URL to access the files. """ global rn, sysno doctype = 'BSIREF' approval_action = 'APM' sequence_id = bibtask_allocate_sequenceid(curdir) action = ParamFromFile("%s/%s" % (curdir,'act')).strip() 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" blog_title = "".join(["%s" % title.strip() for title in \ get_fieldvalues(int(sysno), "245__a")]) blog_url = "".join(["%s" % url.strip() for url in \ get_fieldvalues(int(sysno), "520__u")]) blog_topic = "".join(["%s" % topic.strip() for topic in \ get_fieldvalues(int(sysno), "654__a")]) blog_license = "".join(["%s" % license.strip() for license in \ get_fieldvalues(int(sysno), "542__f")]) # 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 e-mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) if os.path.exists("%s/recmysql" % curdir): fp = open("%s/recmysql" % curdir,"r") modifiedrec_xml = fp.read() fp.close() else: raise InvenioWebSubmitFunctionError("Cannot create database record") modifiedrec = create_record(modifiedrec_xml)[0] new_title = record_get_field_values(modifiedrec, "245", code = "a") new_topic = record_get_field_values(modifiedrec, "654", code = "a") new_license = record_get_field_values(modifiedrec, "542", code = "f") modified_fields = "" if new_title: modified_fields += "New title: '%s'\n" % new_title[0] if new_topic: modified_fields += " New topic: '%s'\n" % new_topic[0] if new_license: modified_fields += " New license: '%s'" % new_license[0] # Send the email: mail_subject = "Request for approval of blog metadata modification: [%(id)s]" if blog_title: mail_subject = mail_subject % {'id': blog_title} else: mail_subject = mail_subject % {'id': blog_url} mail_body = CFG_MAIL_BODY % \ {'title': blog_title, 'blog_url': blog_url, 'topic': blog_topic, 'license': blog_license, 'modified_fields': modified_fields, 'site_name' : CFG_SITE_NAME, 'site_url': CFG_SITE_URL, 'doctype': doctype, 'access': access, 'approval_action': approval_action, 'rn': rn } scheduled_send_email(CFG_SITE_SUPPORT_EMAIL, addresses, mail_subject, mail_body, copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN, other_bibtasklet_arguments=['-I', str(sequence_id)]) return ""
def CONFSUBMIT_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" * titleFile: name of the file in which the title is stored. * submitteremailfile: name of the file in which the title is stored. * submitternamefile: name of the file in which the title is stored. * contactnamefile: name of the file in which the title is stored. * contactemailfile: name of the file in which the title is stored. * referencefile: name of the file in which the title is stored. * affiliationfile: name of the file in which the title is stored. * regionfile: name of the file in which the title is stored. * rankfile: name of the file in which the title is stored. * fieldfile: name of the file in which the title is stored. * experimentsfile: name of the file in which the title is stored. * urlfile: name of the file in which the title is stored. * datefile: name of the file in which the title is stored. * abstractfile: name of the file in which the title is stored. * seriesnamefile: name of the file where the series name is stored. * seriesnumberfile: name of the file where the series number is stored. * directory: parameter used to create the URL to access the files. """ global rn,sysno # variables declaration doctype = re.search(".*/([^/]*)/([^/]*)/[^/]*$",curdir).group(2) 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" # get record data date = get_file_contents(curdir, "date") title = get_file_contents(curdir, parameters['titleFile']).replace("\n","") title += " - %s" % date submitteremail = get_file_contents(curdir, parameters['submitteremailfile']).replace("\n",", ") submittername = get_file_contents(curdir, parameters['submitternamefile']).replace("\n",", ") contactname = get_file_contents(curdir, parameters['contactnamefile']).replace("\n",", ") contactemail = get_file_contents(curdir, parameters['contactemailfile']).replace("\n",", ") subtitle = get_file_contents(curdir, parameters['subtitle']).replace("\n",", ") city = get_file_contents(curdir, parameters['cityfile']).replace("\n",", ") country = get_file_contents(curdir, parameters['countryfile']).replace("\n",", ") state = get_file_contents(curdir, parameters['statefile']).replace("\n",", ") stdate = get_file_contents(curdir, parameters['stdatefile']).replace("\n",", ") fndate = get_file_contents(curdir, parameters['fndatefile']).replace("\n",", ") field = get_file_contents(curdir, parameters['fieldfile']).replace("\n",", ") url = get_file_contents(curdir, parameters['urlfile']).replace("\n"," ") shorttitle = get_file_contents(curdir, parameters['shorttitle']).replace("\n"," ") keywords = get_file_contents(curdir, parameters['keywords']).replace("\n"," ") proceedings = get_file_contents(curdir, parameters['proceedings']).replace("\n"," ") seriesname = get_file_contents(curdir, parameters['seriesnamefile']).replace("\n"," ") seriesnumber = get_file_contents(curdir, parameters['seriesnumberfile']).replace("\n"," ") abstract = get_file_contents(curdir, parameters['abstractfile']) # 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) record_url = "%s/%s/%s" % (CFG_SITE_URL, CFG_SITE_RECORD, sysno) title_referee = "Request for approval of %s" % rn mail_referee = """ The document %(rn)s has been submitted to the Conferences database and it will appear here:\n%(recordlink)s. To approve/reject the document, you should go to this URL:\n%(access)s\n Title: %(title)s Date: from %(stdate)s to %(fndate)s Place: %(city)s, %(state)s, %(country)s Series name: %(seriesname)s Series number: %(seriesnumber)s URL: %(url)s Field(s): %(field)s Description: %(abstract)s Contact name(s): %(contactname)s Contact email(s): %(contactemail)s Submitter name(s): %(submittername)s Submitter email(s): %(submitteremail)s """ % {'rn' : rn, 'title' : title, 'submitteremail' : submitteremail, 'submittername' : submittername, 'contactname' : contactname, 'contactemail' : contactemail, 'field' : field, 'city' : city, 'state' : state, 'country' : country, 'stdate' : stdate, 'fndate' : fndate, 'url' : url, 'subtitle' : subtitle, 'shorttitle' : shorttitle, 'proceedings' : proceedings, 'keywords' : keywords, 'access' : "%s/approve.py?access=%s" % (CFG_SITE_URL,access), 'recordlink' : record_url, 'abstract' : abstract, 'seriesname' : seriesname, 'seriesnumber' : seriesnumber } #Send mail to referee send_email(fromaddr=CFG_WEBSUBMIT_CONF_FROMADDR, toaddr=CFG_WEBSUBMIT_CONF_SUPPORT_EMAIL, subject=title_referee, \ content=mail_referee, footer=email_footer(support_email=CFG_WEBSUBMIT_CONF_SUPPORT_EMAIL), copy_to_admin=CFG_WEBSUBMIT_COPY_MAILS_TO_ADMIN, bccaddr=addresses, replytoaddr=contactemail) 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 Send_Request_For_Refereeing_Process(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 refereeing process of %s" % rn mail_referee = "The document %s has been asked for refereing process 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/record/%s/files/>\n\n" % (CFG_SITE_URL,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 SBI_Mail_Approval_Request_to_Referee(parameters, curdir, form, user_info=None): """ This function sends an email to the referee in order to start the approval process related to the submission of a blog record. 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" * 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 sequence_id = bibtask_allocate_sequenceid(curdir) doctype = 'BSIREF' approval_action = 'APS' action = ParamFromFile("%s/%s" % (curdir,'act')).strip() 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" 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 = "" # 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 e-mail for the referee addresses = "" if refereeaddress != "": addresses = refereeaddress + "," if otheraddresses != "": addresses += otheraddresses else: addresses = re.sub(",$","",addresses) try: fp = open("%s/BSI_URL" % curdir,"r") blog_url = fp.read().replace ("\n"," ") fp.close() except: blog_url = "" try: fp = open("%s/BSI_LICENSE" % curdir,"r") blog_license = fp.read().replace ("\n"," ") fp.close() except: blog_license = "" try: fp = open("%s/BSI_TOPIC" % curdir,"r") blog_topic = fp.read().replace ("\n"," ") fp.close() except: blog_topic = "" ## Send the email: mail_subject = "Request for approval of new blog submission: [%s]" % rn mail_body = CFG_MAIL_BODY % \ {'title': title, 'blog_url': blog_url, 'topic': blog_topic, 'license': blog_license, 'record_id': sysno, 'site_name' : CFG_SITE_NAME, 'site_url': CFG_SITE_URL, 'doctype': doctype, 'access': access, 'approval_action': approval_action, 'rn': rn } scheduled_send_email(CFG_SITE_SUPPORT_EMAIL, addresses, mail_subject, mail_body, other_bibtasklet_arguments=['-I', str(sequence_id)]) return ""
def APO_Mail_Final_Decision_to_User (parameters, curdir, form, user_info=None): """ This function sends an email to the user informing him/her about the decision taken by the referee on his/her proposition. This email is also sent to the referee for checking. Parameters: * 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" """ global sysno, rn FROMADDR = '%s Submission Engine <%s>' % (CFG_SITE_NAME,CFG_SITE_SUPPORT_EMAIL) doctype = form['doctype'] # variables declaration categformat = parameters['categformatAPP'] sequence_id = bibtask_allocate_sequenceid(curdir) ## 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 " \ "APO_Mail_Final_Decision_to_User. 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 " \ "APO_Mail_Final_Decision_to_User. 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 " \ "APO_Mail_Final_Decision_to_User. 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 " \ "APO_Mail_Final_Decision_to_User. Tried to open decision " \ "file [%s/%s] but was unable to." \ % (curdir, decision_filename) register_exception(prefix=exception_prefix) else: decision = decision.strip() # 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" # 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 addresses = "" if refereeaddress != "": addresses = refereeaddress + "," 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: record_owners_list = [] record_owners = ",".join([owner for owner in record_owners_list]) if record_owners != "": addresses += ",%s" % record_owners # Add "SuE" (user who throught the action) into the list of addresses: try: fp_sue = open("%s/SuE" % curdir, "r") sue = fp_sue.readline() fp_sue.close() addresses += ",%s" % sue except IOError: sue = "" post_title = "".join(["%s" % title.strip() for title in \ get_fieldvalues(int(sysno), "245__a")]) post_url = "".join(["%s" % url.strip() for url in \ get_fieldvalues(int(sysno), "520__u")]) if decision != "": if decision == "approve": mailtitle = "Post record deletion approved: [%(id)s]" if post_title: mailtitle = mailtitle % {'id': post_title} else: mailtitle = mailtitle % {'id': post_url} mailbody = "\nThe deletion of the post record with URL [%s] and title '%s' has been approved.\n" % (post_url, post_title) mailbody += "\nThis post record will be no longer available in the repository.\n" else: mailtitle = "Post record deletion has been rejected: [%(id)s]" if post_title: mailtitle = mailtitle % {'id': post_title} else: mailtitle = mailtitle % {'id': post_url} mailbody = "\nThe deletion of the post record with URL [%s] and title '%s' has been rejected.\n" % (post_url, post_title) # 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 ""