def save_xml_record(recid, uid, xml_record='', to_upload=True, to_merge=False, spec_name=''): """Write XML record to file. Default behaviour is to read the record from a BibEdit cache file, filter out the unchanged volatile subfields, write it back to an XML file and then pass this file to BibUpload. @param xml_record: give XML as string in stead of reading cache file @param to_upload: pass the XML file to BibUpload @param to_merge: prepare an XML file for BibMerge to use """ if not xml_record: # Read record from cache file. cache = get_cache_file_contents(recid, uid) if cache: record = cache[2] used_changes = cache[4] # record_strip_empty_fields(record) # now performed for every record after removing unfilled volatile fields xml_record = record_xml_output(record) delete_cache_file(recid, uid) delete_disabled_changes(used_changes) else: record = create_record(xml_record)[0] # clean the record from unfilled volatile fields record_strip_empty_volatile_subfields(record) record_strip_empty_fields(record) # order subfields alphabetically before saving the record #TP: nechceme record_order_subfields(record) xml_to_write = wash_for_xml(record_xml_output(record)) # Write XML file. if not to_merge: file_path = '%s.xml' % _get_file_path(recid, uid) else: file_path = '%s_%s.xml' % (_get_file_path( recid, uid), CFG_BIBEDIT_TO_MERGE_SUFFIX) xml_file = open(file_path, 'w') xml_file.write(xml_to_write) xml_file.close() user_name = get_user_info(uid)[1] if to_upload: # TP: check whether to add spec name if spec_name == '': # Pass XML file to BibUpload. task_low_level_submission('bibupload', 'bibedit', '-P', '5', '-r', file_path, '-u', user_name) else: task_low_level_submission('bibupload', 'bibedit', '-P', '5', '-r', file_path, '-u', user_name, '-N', spec_name) return True
def save_xml_record(recid, uid, xml_record='', to_upload=True, to_merge=False, task_name="bibedit", sequence_id=None): """Write XML record to file. Default behaviour is to read the record from a BibEdit cache file, filter out the unchanged volatile subfields, write it back to an XML file and then pass this file to BibUpload. @param xml_record: give XML as string in stead of reading cache file @param to_upload: pass the XML file to BibUpload @param to_merge: prepare an XML file for BibMerge to use """ if not xml_record: # Read record from cache file. cache = get_cache_contents(recid, uid) if cache: record = cache[2] used_changes = cache[4] xml_record = record_xml_output(record) delete_cache(recid, uid) delete_disabled_changes(used_changes) else: record = create_record(xml_record)[0] # clean the record from unfilled volatile fields record_strip_empty_volatile_subfields(record) record_strip_empty_fields(record) # order subfields alphabetically before saving the record record_order_subfields(record) xml_to_write = wash_for_xml(record_xml_output(record)) # Write XML file. if not to_merge: fd, file_path = tempfile.mkstemp(dir=CFG_BIBEDIT_CACHEDIR, prefix="%s_" % CFG_BIBEDIT_FILENAME, suffix="_%s_%s.xml" % (recid, uid)) f = os.fdopen(fd, 'w') f.write(xml_to_write) f.close() else: file_path = '%s_%s.xml' % (_get_file_path(recid, uid), CFG_BIBEDIT_TO_MERGE_SUFFIX) xml_file = open(file_path, 'w') xml_file.write(xml_to_write) xml_file.close() user_name = get_user_info(uid)[1] if to_upload: args = ['bibupload', user_name, '-P', '5', '-r', file_path, '-u', user_name] if task_name == "bibedit": args.extend(['--name', 'bibedit']) if sequence_id: args.extend(["-I", sequence_id]) args.extend(['--email-logs-on-error']) task_low_level_submission(*args) return True
def perform_request_add_member(uid, grpID, user_id, ln=CFG_SITE_LANG): """Add waiting member to a group. @param uid: user ID @param grpID: ID of the group @param user_id: selected member ID @param ln: language @return: a (body, errors[], warnings[]) formed tuple """ body = '' errors = [] warnings = [] infos = [] _ = gettext_set_language(ln) user_status = db.get_user_status(uid, grpID) if not len(user_status): errors.append('ERR_WEBSESSION_DB_ERROR') return (body, errors, warnings) if user_id == -1: warnings.append('WRN_WEBSESSION_NO_USER_SELECTED_ADD') (body, errors, warnings) = perform_request_manage_member(uid, grpID, warnings=warnings, ln=ln) else : # test if user is already member or pending status = db.get_user_status(user_id, grpID) if status and status[0][0] == 'M': warnings.append('WRN_WEBSESSION_ALREADY_MEMBER_ADD') (body, errors, warnings) = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) else: db.add_pending_member(grpID, user_id, CFG_WEBSESSION_USERGROUP_STATUS["MEMBER"]) infos.append(CFG_WEBSESSION_INFO_MESSAGES["MEMBER_ADDED"]) group_infos = db.get_group_infos(grpID) group_name = group_infos[0][1] user = get_user_info(user_id, ln)[2] msg_subjet, msg_body = websession_templates.tmpl_member_msg( group_name=group_name, accepted=1, ln=ln) (body, errors, warnings, dummy, dummy) = perform_request_send( uid, msg_to_user=user, msg_to_group="", msg_subject=msg_subjet, msg_body=msg_body, ln=ln) (body, errors, warnings) = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) return (body, errors, warnings)
def save_xml_record(recid, uid, xml_record='', to_upload=True, to_merge=False, spec_name=''): """Write XML record to file. Default behaviour is to read the record from a BibEdit cache file, filter out the unchanged volatile subfields, write it back to an XML file and then pass this file to BibUpload. @param xml_record: give XML as string in stead of reading cache file @param to_upload: pass the XML file to BibUpload @param to_merge: prepare an XML file for BibMerge to use """ if not xml_record: # Read record from cache file. cache = get_cache_file_contents(recid, uid) if cache: record = cache[2] used_changes = cache[4] # record_strip_empty_fields(record) # now performed for every record after removing unfilled volatile fields xml_record = record_xml_output(record) delete_cache_file(recid, uid) delete_disabled_changes(used_changes) else: record = create_record(xml_record)[0] # clean the record from unfilled volatile fields record_strip_empty_volatile_subfields(record) record_strip_empty_fields(record) # order subfields alphabetically before saving the record #TP: nechceme record_order_subfields(record) xml_to_write = wash_for_xml(record_xml_output(record)) # Write XML file. if not to_merge: file_path = '%s.xml' % _get_file_path(recid, uid) else: file_path = '%s_%s.xml' % (_get_file_path(recid, uid), CFG_BIBEDIT_TO_MERGE_SUFFIX) xml_file = open(file_path, 'w') xml_file.write(xml_to_write) xml_file.close() user_name = get_user_info(uid)[1] if to_upload: # TP: check whether to add spec name if spec_name == '': # Pass XML file to BibUpload. task_low_level_submission('bibupload', 'bibedit', '-P', '5', '-r', file_path, '-u', user_name) else: task_low_level_submission('bibupload', 'bibedit', '-P', '5', '-r', file_path, '-u', user_name, '-N', spec_name) return True
def record_locked_by_user_details(recid, uid): """ Get the details about the user that has locked a record and the time the record has been locked. @return: user details and time when record was locked @rtype: tuple """ active_uids = uids_with_active_caches(recid) try: active_uids.remove(uid) except ValueError: pass record_blocked_by_nickname = record_blocked_by_email = locked_since = "" if active_uids: record_blocked_by_uid = active_uids[0] record_blocked_by_nickname = get_user_info(record_blocked_by_uid)[1] record_blocked_by_email = get_email(record_blocked_by_uid) locked_since = get_record_locked_since(recid, record_blocked_by_uid) return record_blocked_by_nickname, record_blocked_by_email, locked_since
def record_locked_by_user_details(recid, uid): """ Get the details about the user that has locked a record and the time the record has been locked. @return: user details and time when record was locked @rtype: tuple """ active_uids = _uids_with_active_caches(recid) try: active_uids.remove(uid) except ValueError: pass record_blocked_by_nickname = record_blocked_by_email = locked_since = "" if active_uids: record_blocked_by_uid = active_uids[0] record_blocked_by_nickname = get_user_info(record_blocked_by_uid)[1] record_blocked_by_email = get_email(record_blocked_by_uid) locked_since = get_record_locked_since(recid, record_blocked_by_uid) return record_blocked_by_nickname, record_blocked_by_email, locked_since
def perform_request_reject_member(uid, grpID, user_id, ln=CFG_SITE_LANG): """Reject waiting member and delete it from the list. @param uid: user ID @param grpID: ID of the group @param member_id: selected member ID @param ln: language @return: a (body, errors[], warnings[]) formed tuple """ body = "" errors = [] warnings = [] infos = [] _ = gettext_set_language(ln) user_status = db.get_user_status(uid, grpID) if not len(user_status): errors.append("ERR_WEBSESSION_DB_ERROR") return (body, errors, warnings) if user_id == -1: warnings.append("WRN_WEBSESSION_NO_USER_SELECTED_DEL") (body, errors, warnings) = perform_request_manage_member(uid, grpID, warnings=warnings, ln=ln) else: # test if user is already member or pending status = db.get_user_status(user_id, grpID) if not status: warnings.append("WRN_WEBSESSION_ALREADY_MEMBER_REJECT") (body, errors, warnings) = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) else: db.delete_member(grpID, user_id) group_infos = db.get_group_infos(grpID) group_name = group_infos[0][1] user = get_user_info(user_id, ln)[2] msg_subjet, msg_body = websession_templates.tmpl_member_msg(group_name=group_name, accepted=0, ln=ln) (body, errors, warnings, dummy, dummy) = perform_request_send( uid, msg_to_user=user, msg_to_group="", msg_subject=msg_subjet, msg_body=msg_body, ln=ln ) infos.append(CFG_WEBSESSION_INFO_MESSAGES["MEMBER_REJECTED"]) (body, errors, warnings) = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) return (body, errors, warnings)
def tmpl_display_inbox(self, messages, infos=[], warnings=[], nb_messages=0, no_quota=0, ln=CFG_SITE_LANG): """ Displays a list of messages, with the appropriate links and buttons @param messages: a list of tuples: [(message_id, user_from_id, user_from_nickname, subject, sent_date, status=] @param infos: a list of informations to print on top of page @param warnings: a list of warnings to display @param nb_messages: number of messages user has @param no_quota: 1 if user has no quota (admin) or 0 else. @param ln: language of the page. @return: the list in HTML format """ _ = gettext_set_language(ln) dummy = 0 inbox = self.tmpl_warning(warnings, ln) inbox += self.tmpl_infobox(infos, ln) if not(no_quota): inbox += self.tmpl_quota(nb_messages, ln) inbox += """ <table class="mailbox"> <thead class="mailboxheader"> <tr class="inboxheader"> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> </tr> </thead> <tfoot> <tr style="height:0px;"> <td></td> <td></td> <td></td> <td></td> </tr> </tfoot> <tbody class="mailboxbody">""" % (_("Subject"), _("Sender"), _("Date"), _("Action")) if len(messages) == 0: inbox += """ <tr class="mailboxrecord" style="height: 100px;"> <td colspan="4" style="text-align: center;"> <b>%s</b> </td> </tr>""" %(_("No messages"),) for (msgid, id_user_from, user_from_nick, subject, sent_date, status) in messages: if not(subject): subject = _("No subject") subject_link = create_html_link( CFG_SITE_URL + '/yourmessages/display_msg', {'msgid': msgid, 'ln': ln}, escape_html(subject)) if user_from_nick: from_link = '%s'% (user_from_nick) else: from_link = get_user_info(id_user_from, ln)[2] action_link = create_html_link(CFG_SITE_URL + '/yourmessages/write', {'msg_reply_id': msgid, 'ln': ln}, _("Reply")) action_link += ' ' action_link += create_html_link(CFG_SITE_URL + '/yourmessages/delete', {'msgid': msgid, 'ln': ln}, _("Delete")) s_date = convert_datetext_to_dategui(sent_date, ln) stat_style = '' if (status == CFG_WEBMESSAGE_STATUS_CODE['NEW']): stat_style = ' style="font-weight:bold"' inbox += """ <tr class="mailboxrecord"> <td%s>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> </tr>""" %(stat_style, subject_link, from_link, s_date, action_link) inbox += """ <tr class="mailboxfooter"> <td colspan="2"> <form name="newMessage" action="%(url_new)s" method="post"> <input type="submit" name="del_all" value="%(write_label)s" class="formbutton" /> </form> </td> <td> </td> <td> <form name="deleteAll" action="%(url_delete_all)s" method="post"> <input type="submit" name="del_all" value="%(delete_all_label)s" class="formbutton" /> </form> </td> </tr> </tbody> </table>""" % {'url_new': create_url(CFG_SITE_URL + '/yourmessages/write', {'ln': ln}), 'url_delete_all': create_url(CFG_SITE_URL + '/yourmessages/delete_all', {'ln': ln}), 'write_label': _("Write new message"), 'delete_all_label': _("Delete All")} return inbox
def tmpl_display_msg(self, msg_id="", msg_from_id="", msg_from_nickname="", msg_sent_to="", msg_sent_to_group="", msg_subject="", msg_body="", msg_sent_date="", msg_received_date=datetext_default, ln=CFG_SITE_LANG): """ Displays a given message @param msg_id: id of the message @param msg_from_id: id of user who sent the message @param msg_from_nickname: nickname of the user who sent the message @param msg_sent_to: list of users who received the message (comma separated string) @param msg_sent_to_group: list of groups who received the message (comma separated string) @param msg_subject: subject of the message @param msg_body: body of the message @param msg_sent_date: date at which the message was sent @param msg_received_date: date at which the message had to be received (if this argument != 0000-00-00 => reminder @param ln: language of the page @return: the message in HTML format """ # load the right message language _ = gettext_set_language(ln) sent_to_link = '' tos = msg_sent_to.split(CFG_WEBMESSAGE_SEPARATOR) if (tos): for to in tos[0:-1]: to_display = to if to.isdigit(): (dummy, to, to_display) = get_user_info(int(to), ln) sent_to_link += create_html_link(CFG_SITE_URL + '/yourmessages/write', {'msg_to': to, 'ln': ln}, escape_html(to_display)) sent_to_link += CFG_WEBMESSAGE_SEPARATOR to_display = tos[-1] to = tos[-1] if to.isdigit(): (dummy, to, to_display) = get_user_info(int(to), ln) sent_to_link += create_html_link(CFG_SITE_URL + '/yourmessages/write', {'msg_to': to, 'ln': ln}, escape_html(to_display)) group_to_link = "" groups = msg_sent_to_group.split(CFG_WEBMESSAGE_SEPARATOR) if (groups): for group in groups[0:-1]: group_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', {'msg_to_group': group, 'ln': ln}, escape_html(group)) group_to_link += CFG_WEBMESSAGE_SEPARATOR group_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', {'msg_to_group': groups[-1], 'ln': ln}, escape_html(groups[-1])) # format the msg so that the '>>' chars give vertical lines final_body = email_quoted_txt2html(msg_body) out = """ <table class="mailbox" style="width: 70%%;"> <thead class="mailboxheader"> <tr> <td class="inboxheader" colspan="2"> <table class="messageheader"> <tr> <td class="mailboxlabel">%(from_label)s</td> <td>%(from_link)s</td> </tr> <tr> <td class="mailboxlabel">%(subject_label)s</td> <td style="width: 100%%;">%(subject)s</td> </tr> <tr> <td class="mailboxlabel">%(sent_label)s</td> <td>%(sent_date)s</td> </tr>""" if (msg_received_date != datetext_default): out += """ <tr> <td class="mailboxlabel">%(received_label)s</td> <td>%(received_date)s</td> </tr>""" out += """ <tr> <td class="mailboxlabel">%(sent_to_label)s</td> <td>%(sent_to)s</td> </tr>""" if (msg_sent_to_group != ""): out += """ <tr> <td class="mailboxlabel">%(groups_label)s</td> <td>%(sent_to_group)s</td> </tr>""" out += """ </table> </td> </tr> </thead> <tfoot> <tr> <td></td> <td></td> </tr> </tfoot> <tbody class="mailboxbody"> <tr class="mailboxrecord"> <td colspan="2">%(body)s</td> </tr> <tr class="mailboxfooter"> <td> <form name="reply" action="%(reply_url)s" method="post"> <input class="formbutton" name="reply" value="%(reply_but_label)s" type="submit" /> </form> </td> <td> <form name="deletemsg" action="%(delete_url)s" method="post"> <input class="formbutton" name="delete" value="%(delete_but_label)s" type="submit" /> </form> </td> </tr> </tbody> </table> """ if msg_from_nickname: msg_from_display = msg_from_nickname else: msg_from_display = get_user_info(msg_from_id, ln)[2] msg_from_nickname = msg_from_id return out % {'from_link': create_html_link( CFG_SITE_URL + '/yourmessages/write', {'msg_to': msg_from_nickname, 'ln': ln}, msg_from_display), 'reply_url': create_url(CFG_SITE_URL + '/yourmessages/write', {'msg_reply_id': msg_id, 'ln': ln}), 'delete_url': create_url(CFG_SITE_URL + '/yourmessages/delete', {'msgid': msg_id, 'ln': ln}), 'sent_date' : convert_datetext_to_dategui(msg_sent_date, ln), 'received_date': convert_datetext_to_dategui(msg_received_date, ln), 'sent_to': sent_to_link, 'sent_to_group': group_to_link, 'subject' : msg_subject, 'body' : final_body, 'reply_to': msg_from_id, 'ln': ln, 'from_label':_("From:"), 'subject_label':_("Subject:"), 'sent_label': _("Sent on:"), 'received_label':_("Received on:"), 'sent_to_label': _("Sent to:"), 'groups_label': _("Sent to groups:"), 'reply_but_label':_("REPLY"), 'delete_but_label': _("DELETE")}
def query_get_latest(comments, ln, top, user_collections, collection): """ private function @param comments: boolean indicating if we want to retrieve comments or reviews @param ln: language @param top: number of results to display @param user_collections: allowed collections for the user @param collection: collection to display @return tuple of comment where comment is tuple (nickname, uid, date_creation, body, id) if latest comments or tuple (nickname, uid, date_creation, body, star_score, id) if latest reviews """ qdict = {'id': 0, 'id_bibrec': 1, 'uid': 2, 'date_creation': 3, 'body': 4, 'nb_abuse_reports': 5, 'star_score': 6, 'nickname': -1} query = """SELECT c.id, c.id_bibrec, c.id_user, DATE_FORMAT(c.date_creation, '%%Y-%%m-%%d %%H:%%i:%%S'), c.body, c.nb_abuse_reports, %s u.nickname FROM cmtRECORDCOMMENT c LEFT JOIN user u ON c.id_user = u.id %s ORDER BY c.date_creation DESC LIMIT %s """ select_fields = not comments and 'c.star_score, ' or '' where_clause = "WHERE " + (comments and 'c.star_score=0' or 'c.star_score>0') + ' AND c.status="ok" AND c.nb_abuse_reports < %s' % CFG_WEBCOMMENT_NB_REPORTS_BEFORE_SEND_EMAIL_TO_ADMIN res = run_sql(query % (select_fields, where_clause, top)) collection_records = [] if collection == 'Show all': for collection_name in user_collections: collection_records.extend(perform_request_search(cc=collection_name)) else: collection_records.extend(perform_request_search(cc=collection)) output = [] for qtuple in res: if qtuple[qdict['id_bibrec']] in collection_records: nickname = qtuple[qdict['nickname']] or get_user_info(qtuple[qdict['uid']], ln)[2] if not comments: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['star_score']], qtuple[qdict['id']]) else: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['id']]) general_infos_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['id']], qtuple[qdict['id_bibrec']], qtuple[qdict['nb_abuse_reports']]) out_tuple = (comment_tuple, general_infos_tuple) output.append(out_tuple) return tuple(output)
def query_get_comments(uid, cmtID, recID, reviews, ln, abuse=False, user_collections='', collection=''): """ private function @param user_collections: allowed collections for the user @param collection: collection to display @return tuple of comment where comment is tuple (nickname, uid, date_creation, body, id, status) if ranking disabled or tuple (nickname, uid, date_creation, body, nb_votes_yes, nb_votes_total, star_score, title, id, status) """ qdict = {'id': 0, 'id_bibrec': 1, 'uid': 2, 'date_creation': 3, 'body': 4, 'status': 5, 'nb_abuse_reports': 6, 'nb_votes_yes': 7, 'nb_votes_total': 8, 'star_score': 9, 'title': 10, 'email': -2, 'nickname': -1} query = """SELECT c.id, c.id_bibrec, c.id_user, DATE_FORMAT(c.date_creation, '%%Y-%%m-%%d %%H:%%i:%%S'), c.body, c.status, c.nb_abuse_reports, %s u.email, u.nickname FROM cmtRECORDCOMMENT c LEFT JOIN user u ON c.id_user = u.id %s ORDER BY c.nb_abuse_reports DESC, c.nb_votes_yes DESC, c.date_creation """ select_fields = reviews and 'c.nb_votes_yes, c.nb_votes_total, c.star_score, c.title,' or '' where_clause = "WHERE " + (reviews and 'c.star_score>0' or 'c.star_score=0') if uid: where_clause += ' AND c.id_user=%i' % uid if recID: where_clause += ' AND c.id_bibrec=%i' % recID if cmtID: where_clause += ' AND c.id=%i' % cmtID if abuse: where_clause += ' AND c.nb_abuse_reports>0' res = run_sql(query % (select_fields, where_clause)) collection_records = [] if collection == 'Show all': for collection_name in user_collections: collection_records.extend(perform_request_search(cc=collection_name)) else: collection_records.extend(perform_request_search(cc=collection)) output = [] for qtuple in res: if qtuple[qdict['id_bibrec']] in collection_records: nickname = qtuple[qdict['nickname']] or get_user_info(qtuple[qdict['uid']], ln)[2] if reviews: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['nb_votes_yes']], qtuple[qdict['nb_votes_total']], qtuple[qdict['star_score']], qtuple[qdict['title']], qtuple[qdict['id']], qtuple[qdict['status']]) else: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['id']], qtuple[qdict['status']]) general_infos_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['email']], qtuple[qdict['id']], qtuple[qdict['id_bibrec']], qtuple[qdict['nb_abuse_reports']]) out_tuple = (comment_tuple, general_infos_tuple) output.append(out_tuple) return tuple(output)
def query_get_latest(comments, ln, top, user_collections, collection): """ private function @param comments: boolean indicating if we want to retrieve comments or reviews @param ln: language @param top: number of results to display @param user_collections: allowed collections for the user @param collection: collection to display @return tuple of comment where comment is tuple (nickname, uid, date_creation, body, id) if latest comments or tuple (nickname, uid, date_creation, body, star_score, id) if latest reviews """ qdict = { 'id': 0, 'id_bibrec': 1, 'uid': 2, 'date_creation': 3, 'body': 4, 'nb_abuse_reports': 5, 'star_score': 6, 'nickname': -1 } query = """SELECT c.id, c.id_bibrec, c.id_user, DATE_FORMAT(c.date_creation, '%%Y-%%m-%%d %%H:%%i:%%S'), c.body, c.nb_abuse_reports, %s u.nickname FROM cmtRECORDCOMMENT c LEFT JOIN user u ON c.id_user = u.id %s ORDER BY c.date_creation DESC LIMIT %s """ select_fields = not comments and 'c.star_score, ' or '' where_clause = "WHERE " + ( comments and 'c.star_score=0' or 'c.star_score>0' ) + ' AND c.status="ok" AND c.nb_abuse_reports < %s' % CFG_WEBCOMMENT_NB_REPORTS_BEFORE_SEND_EMAIL_TO_ADMIN res = run_sql(query % (select_fields, where_clause, top)) collection_records = [] if collection == 'Show all': for collection_name in user_collections: collection_records.extend( perform_request_search(cc=collection_name)) else: collection_records.extend(perform_request_search(cc=collection)) output = [] for qtuple in res: if qtuple[qdict['id_bibrec']] in collection_records: nickname = qtuple[qdict['nickname']] or get_user_info( qtuple[qdict['uid']], ln)[2] if not comments: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['star_score']], qtuple[qdict['id']]) else: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['id']]) general_infos_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['id']], qtuple[qdict['id_bibrec']], qtuple[qdict['nb_abuse_reports']]) out_tuple = (comment_tuple, general_infos_tuple) output.append(out_tuple) return tuple(output)
def query_get_comments(uid, cmtID, recID, reviews, ln, abuse=False, user_collections='', collection=''): """ private function @param user_collections: allowed collections for the user @param collection: collection to display @return tuple of comment where comment is tuple (nickname, uid, date_creation, body, id, status) if ranking disabled or tuple (nickname, uid, date_creation, body, nb_votes_yes, nb_votes_total, star_score, title, id, status) """ qdict = { 'id': 0, 'id_bibrec': 1, 'uid': 2, 'date_creation': 3, 'body': 4, 'status': 5, 'nb_abuse_reports': 6, 'nb_votes_yes': 7, 'nb_votes_total': 8, 'star_score': 9, 'title': 10, 'email': -2, 'nickname': -1 } query = """SELECT c.id, c.id_bibrec, c.id_user, DATE_FORMAT(c.date_creation, '%%Y-%%m-%%d %%H:%%i:%%S'), c.body, c.status, c.nb_abuse_reports, %s u.email, u.nickname FROM cmtRECORDCOMMENT c LEFT JOIN user u ON c.id_user = u.id %s ORDER BY c.nb_abuse_reports DESC, c.nb_votes_yes DESC, c.date_creation """ select_fields = reviews and 'c.nb_votes_yes, c.nb_votes_total, c.star_score, c.title,' or '' where_clause = "WHERE " + (reviews and 'c.star_score>0' or 'c.star_score=0') if uid: where_clause += ' AND c.id_user=%i' % uid if recID: where_clause += ' AND c.id_bibrec=%i' % recID if cmtID: where_clause += ' AND c.id=%i' % cmtID if abuse: where_clause += ' AND c.nb_abuse_reports>0' res = run_sql(query % (select_fields, where_clause)) collection_records = [] if collection == 'Show all': for collection_name in user_collections: collection_records.extend( perform_request_search(cc=collection_name)) else: collection_records.extend(perform_request_search(cc=collection)) output = [] for qtuple in res: if qtuple[qdict['id_bibrec']] in collection_records: nickname = qtuple[qdict['nickname']] or get_user_info( qtuple[qdict['uid']], ln)[2] if reviews: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['nb_votes_yes']], qtuple[qdict['nb_votes_total']], qtuple[qdict['star_score']], qtuple[qdict['title']], qtuple[qdict['id']], qtuple[qdict['status']]) else: comment_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['date_creation']], qtuple[qdict['body']], qtuple[qdict['id']], qtuple[qdict['status']]) general_infos_tuple = (nickname, qtuple[qdict['uid']], qtuple[qdict['email']], qtuple[qdict['id']], qtuple[qdict['id_bibrec']], qtuple[qdict['nb_abuse_reports']]) out_tuple = (comment_tuple, general_infos_tuple) output.append(out_tuple) return tuple(output)
_('The user is already member of the group.')) except InvenioWebSessionWarning, exc: register_exception(stream='warning') warnings.append(exc.message) body = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) else: db.add_pending_member(grpID, user_id, CFG_WEBSESSION_USERGROUP_STATUS["MEMBER"]) infos.append(CFG_WEBSESSION_INFO_MESSAGES["MEMBER_ADDED"]) group_infos = db.get_group_infos(grpID) group_name = group_infos[0][1] user = get_user_info(user_id, ln)[2] msg_subjet, msg_body = websession_templates.tmpl_member_msg( group_name=group_name, accepted=1, ln=ln) (body, dummy, dummy) = perform_request_send(uid, msg_to_user=user, msg_to_group="", msg_subject=msg_subjet, msg_body=msg_body, ln=ln) body = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) return body
def save_xml_record(recid, uid, xml_record='', to_upload=True, to_merge=False, task_name="bibedit", sequence_id=None): """Write XML record to file. Default behaviour is to read the record from a BibEdit cache file, filter out the unchanged volatile subfields, write it back to an XML file and then pass this file to BibUpload. @param xml_record: give XML as string in stead of reading cache file @param to_upload: pass the XML file to BibUpload @param to_merge: prepare an XML file for BibMerge to use """ if not xml_record: # Read record from cache file. cache = get_cache_contents(recid, uid) if cache: record = cache[2] used_changes = cache[4] xml_record = record_xml_output(record) delete_cache(recid, uid) delete_disabled_changes(used_changes) else: record = create_record(xml_record)[0] # clean the record from unfilled volatile fields record_strip_empty_volatile_subfields(record) record_strip_empty_fields(record) # order subfields alphabetically before saving the record record_order_subfields(record) xml_to_write = wash_for_xml(record_xml_output(record)) # Write XML file. if not to_merge: fd, file_path = tempfile.mkstemp(dir=CFG_BIBEDIT_CACHEDIR, prefix="%s_" % CFG_BIBEDIT_FILENAME, suffix="_%s_%s.xml" % (recid, uid)) f = os.fdopen(fd, 'w') f.write(xml_to_write) f.close() else: file_path = '%s_%s.xml' % (_get_file_path( recid, uid), CFG_BIBEDIT_TO_MERGE_SUFFIX) xml_file = open(file_path, 'w') xml_file.write(xml_to_write) xml_file.close() user_name = get_user_info(uid)[1] if to_upload: args = [ 'bibupload', user_name, '-P', '5', '-r', file_path, '-u', user_name ] if task_name == "bibedit": args.extend(['--name', 'bibedit']) if sequence_id: args.extend(["-I", sequence_id]) args.extend(['--email-logs-on-error']) task_low_level_submission(*args) return True
def tmpl_user_list(self, ln=CFG_SITE_LANG): #TP: cele.. """ Generates a list of available collections statistics. """ assignedUsers = list() out = "" #TP: nakreslim oddil pro kazdeho strukturatora for supervisor in cfg_supervisors_groups: out += """<h3>Supervisor %s (#%s)</h3><ul class="supervisor_usersOverview">""" % (get_email(supervisor),supervisor) assignedUsers.append(supervisor) #TP: nakreslim linky a hlavni info pro kazdeho uzivatele for user in cfg_supervisors_groups[int(supervisor)]: assignedUsers.append(user) # ×pan=last+month&s_date=01%2F29%2F2013+00%3A00&f_date=01%2F29%2F2013+09%3A28&format=flot&ids=cardStructured&cols0=UID&col_value0=tomas&action_gen=Generate out += """<li><a class="uNameLink" href="%(site_url)s/supervisors/customevent?ln=%(ln)s×pan=last+month&format=flot&ids=cardStructured&cols0=UID&col_value0=%(user)s&action_gen=Generate">%(email)s</a>""" \ % {'site_url': CFG_SITE_URL, 'email': get_email(user), 'ln': CFG_SITE_LANG, 'user': user} actionInfo = acc_find_possible_actions_user(user, 22) collInfo = "" for aInfo in actionInfo: temp = aInfo[2].split() if len(temp[0]) == 4: for coll in temp: p_total = "980__a:%s" % coll res_total = search_pattern(p=p_total) p_done = "980__a:%s and (950__s:%s or 950__s:2)" % (coll, "p*") res_done = search_pattern_parenthesised(p=p_done) p_check = "980__a:%s and (950__s:na* or 950__s:3)" % (coll) res_check = search_pattern_parenthesised(p=p_check) collLink_main = """<a href="%(site_url)s/search?cc=%(coll)s&ln=%(ln)s&jrec=1&so=a">%(coll)s</a> """ % {'coll': coll, 'site_url': CFG_SITE_URL, 'ln': CFG_SITE_LANG } strProgress = "" if len(res_done)+len(res_check) != 0: if len(res_done) == len(res_total): strProgress = """<span class="supervisor_prog_done">completed</span>: %i""" % (len(res_total)) else: collLink_done = """<span class="supervisor_prog_started">in progress</span>: <a href="%(site_url)s/search?cc=%(coll)s&ln=%(ln)s&&p=950__s:2+or+950__s:p*&jrec=1&so=a">%(res_done)i</a> """ % {'coll': coll, 'site_url': CFG_SITE_URL, 'ln': CFG_SITE_LANG, 'res_done': len(res_done) } strProgress = "%s / %i" % (collLink_done, len(res_total)) if len(res_check) > 0: collLink_check = """<span class="supervisor_prog_review"><a href="%(site_url)s/search?cc=%(coll)s&ln=%(ln)s&p=950__s:3+or+950__s:na*&jrec=1&so=a">%(res_check)i</span></a> """ % {'coll': coll, 'site_url': CFG_SITE_URL, 'ln': CFG_SITE_LANG, 'res_check': len(res_check) } if len(res_done)>0: strProgress = "%s+ %s / %i" % (collLink_done, collLink_check, len(res_total)) else: strProgress = "%s / %i" % (collLink_check, len(res_total)) else: strProgress = """<span class="supervisor_prog_notStarted">waiting</span>: %s""" % len(res_total) collInfo += """ %s <small class="nbdoccollz">(%s)</small>""" % (collLink_main, strProgress) if collInfo != "": out += """<span class="supervisor_usercolls">""" + collInfo + """</span>""" out += """</li>""" out += """</ul>""" #TP: nakreslim seznam neprirazenych uzivatelu out += """<h3>Unassigned users</h3><p>You may want to consider attaching one of the unassigned users to an supervisor. If so, please contact your administrator.</p><ul>""" for user in list_registered_users(): str_user_info = get_user_info(user[0]) if user[0] not in assignedUsers: out += """<li>%s</li>""" \ % (get_email(user[0])) out += """</ul>""" return out
def tmpl_display_inbox(self, messages, infos=[], warnings=[], nb_messages=0, no_quota=0, ln=CFG_SITE_LANG): """ Displays a list of messages, with the appropriate links and buttons @param messages: a list of tuples: [(message_id, user_from_id, user_from_nickname, subject, sent_date, status=] @param infos: a list of informations to print on top of page @param warnings: a list of warnings to display @param nb_messages: number of messages user has @param no_quota: 1 if user has no quota (admin) or 0 else. @param ln: language of the page. @return: the list in HTML format """ _ = gettext_set_language(ln) dummy = 0 inbox = self.tmpl_warning(warnings, ln) inbox += self.tmpl_infobox(infos, ln) if not (no_quota): inbox += self.tmpl_quota(nb_messages, ln) inbox += """ <table class="mailbox"> <thead class="mailboxheader"> <tr class="inboxheader"> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> </tr> </thead> <tfoot> <tr style="height:0px;"> <td></td> <td></td> <td></td> <td></td> </tr> </tfoot> <tbody class="mailboxbody">""" % (_("Subject"), _("Sender"), _("Date"), _("Action")) if len(messages) == 0: inbox += """ <tr class="mailboxrecord" style="height: 100px;"> <td colspan="4" style="text-align: center;"> <b>%s</b> </td> </tr>""" % (_("No messages"), ) for (msgid, id_user_from, user_from_nick, subject, sent_date, status) in messages: if not (subject): subject = _("No subject") subject_link = create_html_link( CFG_SITE_URL + '/yourmessages/display_msg', { 'msgid': msgid, 'ln': ln }, escape_html(subject)) if user_from_nick: from_link = '%s' % (user_from_nick) else: from_link = get_user_info(id_user_from, ln)[2] action_link = create_html_link( CFG_SITE_URL + '/yourmessages/write', { 'msg_reply_id': msgid, 'ln': ln }, _("Reply")) action_link += ' ' action_link += create_html_link( CFG_SITE_URL + '/yourmessages/delete', { 'msgid': msgid, 'ln': ln }, _("Delete")) s_date = convert_datetext_to_dategui(sent_date, ln) stat_style = '' if (status == CFG_WEBMESSAGE_STATUS_CODE['NEW']): stat_style = ' style="font-weight:bold"' inbox += """ <tr class="mailboxrecord"> <td%s>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> </tr>""" % (stat_style, subject_link, from_link, s_date, action_link) inbox += """ <tr class="mailboxfooter"> <td colspan="2"> <form name="newMessage" action="%(url_new)s" method="post"> <input type="submit" name="del_all" value="%(write_label)s" class="formbutton" /> </form> </td> <td> </td> <td> <form name="deleteAll" action="%(url_delete_all)s" method="post"> <input type="submit" name="del_all" value="%(delete_all_label)s" class="formbutton" /> </form> </td> </tr> </tbody> </table>""" % { 'url_new': create_url(CFG_SITE_URL + '/yourmessages/write', {'ln': ln}), 'url_delete_all': create_url(CFG_SITE_URL + '/yourmessages/delete_all', {'ln': ln}), 'write_label': _("Write new message"), 'delete_all_label': _("Delete All") } return inbox
def tmpl_display_msg(self, msg_id="", msg_from_id="", msg_from_nickname="", msg_sent_to="", msg_sent_to_group="", msg_subject="", msg_body="", msg_sent_date="", msg_received_date=datetext_default, ln=CFG_SITE_LANG): """ Displays a given message @param msg_id: id of the message @param msg_from_id: id of user who sent the message @param msg_from_nickname: nickname of the user who sent the message @param msg_sent_to: list of users who received the message (comma separated string) @param msg_sent_to_group: list of groups who received the message (comma separated string) @param msg_subject: subject of the message @param msg_body: body of the message @param msg_sent_date: date at which the message was sent @param msg_received_date: date at which the message had to be received (if this argument != 0000-00-00 => reminder @param ln: language of the page @return: the message in HTML format """ # load the right message language _ = gettext_set_language(ln) sent_to_link = '' tos = msg_sent_to.split(CFG_WEBMESSAGE_SEPARATOR) if (tos): for to in tos[0:-1]: to_display = to if to.isdigit(): (dummy, to, to_display) = get_user_info(int(to), ln) sent_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', { 'msg_to': to, 'ln': ln }, escape_html(to_display)) sent_to_link += CFG_WEBMESSAGE_SEPARATOR to_display = tos[-1] to = tos[-1] if to.isdigit(): (dummy, to, to_display) = get_user_info(int(to), ln) sent_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', { 'msg_to': to, 'ln': ln }, escape_html(to_display)) group_to_link = "" groups = msg_sent_to_group.split(CFG_WEBMESSAGE_SEPARATOR) if (groups): for group in groups[0:-1]: group_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', { 'msg_to_group': group, 'ln': ln }, escape_html(group)) group_to_link += CFG_WEBMESSAGE_SEPARATOR group_to_link += create_html_link( CFG_SITE_URL + '/yourmessages/write', { 'msg_to_group': groups[-1], 'ln': ln }, escape_html(groups[-1])) # format the msg so that the '>>' chars give vertical lines final_body = email_quoted_txt2html(msg_body) out = """ <table class="mailbox" style="width: 70%%;"> <thead class="mailboxheader"> <tr> <td class="inboxheader" colspan="2"> <table class="messageheader"> <tr> <td class="mailboxlabel">%(from_label)s</td> <td>%(from_link)s</td> </tr> <tr> <td class="mailboxlabel">%(subject_label)s</td> <td style="width: 100%%;">%(subject)s</td> </tr> <tr> <td class="mailboxlabel">%(sent_label)s</td> <td>%(sent_date)s</td> </tr>""" if (msg_received_date != datetext_default): out += """ <tr> <td class="mailboxlabel">%(received_label)s</td> <td>%(received_date)s</td> </tr>""" out += """ <tr> <td class="mailboxlabel">%(sent_to_label)s</td> <td>%(sent_to)s</td> </tr>""" if (msg_sent_to_group != ""): out += """ <tr> <td class="mailboxlabel">%(groups_label)s</td> <td>%(sent_to_group)s</td> </tr>""" out += """ </table> </td> </tr> </thead> <tfoot> <tr> <td></td> <td></td> </tr> </tfoot> <tbody class="mailboxbody"> <tr class="mailboxrecord"> <td colspan="2">%(body)s</td> </tr> <tr class="mailboxfooter"> <td> <form name="reply" action="%(reply_url)s" method="post"> <input class="formbutton" name="reply" value="%(reply_but_label)s" type="submit" /> </form> </td> <td> <form name="deletemsg" action="%(delete_url)s" method="post"> <input class="formbutton" name="delete" value="%(delete_but_label)s" type="submit" /> </form> </td> </tr> </tbody> </table> """ if msg_from_nickname: msg_from_display = msg_from_nickname else: msg_from_display = get_user_info(msg_from_id, ln)[2] msg_from_nickname = msg_from_id return out % { 'from_link': create_html_link(CFG_SITE_URL + '/yourmessages/write', { 'msg_to': msg_from_nickname, 'ln': ln }, msg_from_display), 'reply_url': create_url(CFG_SITE_URL + '/yourmessages/write', { 'msg_reply_id': msg_id, 'ln': ln }), 'delete_url': create_url(CFG_SITE_URL + '/yourmessages/delete', { 'msgid': msg_id, 'ln': ln }), 'sent_date': convert_datetext_to_dategui(msg_sent_date, ln), 'received_date': convert_datetext_to_dategui(msg_received_date, ln), 'sent_to': sent_to_link, 'sent_to_group': group_to_link, 'subject': msg_subject, 'body': final_body, 'reply_to': msg_from_id, 'ln': ln, 'from_label': _("From:"), 'subject_label': _("Subject:"), 'sent_label': _("Sent on:"), 'received_label': _("Received on:"), 'sent_to_label': _("Sent to:"), 'groups_label': _("Sent to groups:"), 'reply_but_label': _("REPLY"), 'delete_but_label': _("DELETE") }
else: # test if user is already member or pending status = db.get_user_status(user_id, grpID) if status and status[0][0] == "M": try: raise InvenioWebSessionWarning(_("The user is already member of the group.")) except InvenioWebSessionWarning, exc: register_exception(stream="warning") warnings.append(exc.message) body = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) else: db.add_pending_member(grpID, user_id, CFG_WEBSESSION_USERGROUP_STATUS["MEMBER"]) infos.append(CFG_WEBSESSION_INFO_MESSAGES["MEMBER_ADDED"]) group_infos = db.get_group_infos(grpID) group_name = group_infos[0][1] user = get_user_info(user_id, ln)[2] msg_subjet, msg_body = websession_templates.tmpl_member_msg(group_name=group_name, accepted=1, ln=ln) (body, dummy, dummy) = perform_request_send( uid, msg_to_user=user, msg_to_group="", msg_subject=msg_subjet, msg_body=msg_body, ln=ln ) body = perform_request_manage_member(uid, grpID, infos=infos, warnings=warnings, ln=ln) return body def perform_request_reject_member(uid, grpID, user_id, ln=CFG_SITE_LANG): """Reject waiting member and delete it from the list. @param uid: user ID @param grpID: ID of the group @param member_id: selected member ID @param ln: language @return: body with warnings