string notes_bible_n (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); string page; Assets_Header header = Assets_Header (translate("Bibles"), request); page += header.run (); Assets_View view; string bibleblock; vector <string> bibles = access_bible_bibles (webserver_request); bibles.push_back (notes_logic.generalBibleName ()); for (auto & bible : bibles) { bibleblock.append ("<li><a href=\"bulk?bible=" + bible + "\">" + bible + "</a></li>\n"); } view.set_variable ("bibleblock", bibleblock); page += view.render ("notes", "bible-n"); page += Assets_Page::footer (); return page; }
string public_create (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); string page; Assets_Header header = Assets_Header (translate("Create note"), request); page += header.run (); Assets_View view; string bible = request->database_config_user()->getBible (); int book = Ipc_Focus::getBook (webserver_request); int chapter = Ipc_Focus::getChapter (webserver_request); int verse = Ipc_Focus::getVerse (webserver_request); string chapter_usfm = request->database_bibles()->getChapter (bible, book, chapter); string verse_usfm = usfm_get_verse_text (chapter_usfm, verse); string stylesheet = Database_Config_Bible::getExportStylesheet (bible); Filter_Text filter_text = Filter_Text (bible); filter_text.html_text_standard = new Html_Text (bible); filter_text.addUsfmCode (verse_usfm); filter_text.run (stylesheet); string versetext = filter_text.html_text_standard->getInnerHtml (); view.set_variable ("versetext", versetext); if (request->post.count ("submit")) { string summary = filter_string_trim (request->post["summary"]); if (summary.empty ()) summary = translate ("Feedback"); string contents = "<p>" + versetext + "</p>" + filter_string_trim (request->post["contents"]); int identifier = notes_logic.createNote (bible, book, chapter, verse, summary, contents, false); // A note created by a public user is made public to all. database_notes.setPublic (identifier, true); // Subscribe the user to the note. // Then the user receives email about any updates made on this note. database_notes.subscribe (identifier); // Go to the main public notes page. redirect_browser (request, public_index_url ()); return ""; } if (request->post.count ("cancel")) { redirect_browser (request, public_index_url ()); return ""; } string passage = filter_passage_display (book, chapter, convert_to_string (verse)); view.set_variable ("passage", passage); page += view.render ("public", "create"); page += Assets_Page::footer (); return page; }
string notes_assign_n (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); Database_NoteAssignment database_noteassignment; string page; Assets_Header header = Assets_Header (translate("Assign notes"), request); page += header.run(); Assets_View view; string user = request->session_logic ()->currentUser (); // Notes can be assigned to the assignees. string userblock; vector <string> assignees = database_noteassignment.assignees (user); for (auto & assignee : assignees) { userblock.append ("<li><a href=\"bulk?assign=" + assignee + "\">" + assignee + "</a></li>\n"); } view.set_variable ("userblock", userblock); page += view.render ("notes", "assign-n"); page += Assets_Page::footer (); return page; }
void email_receive () { // Bail out when the mail storage host has not been defined, rather than giving an error message. if (Database_Config_General::getMailStorageHost () == "") return; // One email receiver runs at a time. if (config_globals_mail_receive_running) return; config_globals_mail_receive_running = true; // Once this flag is set, the coder should be careful not to exit from the function // without clearin this flag. // Email count. string error; int emailcount = email_receive_count (error); // Messages start at number 1 instead of 0. for (int i = 1; i <= emailcount; i++) { Webserver_Request request; Confirm_Worker confirm_worker = Confirm_Worker (&request); Notes_Logic notes_logic = Notes_Logic (&request); error.clear (); string body = email_receive_message (error); if (error.empty ()) { // Extract "from" and subject, and clean body. string from; string subject; email_dissect (body, from, subject); Database_Logs::log ("Processing email from " + from + " with subject " + subject); if (confirm_worker.handleEmail (from, subject, body)) { } else if (notes_logic.handleEmailComment (from, subject, body)) { } else if (notes_logic.handleEmailNew (from, subject, body)) { } else { Database_Logs::log ("Could not allocate email from " + from + ", subject " + subject); Database_Logs::log (body); } } else { Database_Logs::log ("Error retrieving mail: " + error); } } config_globals_mail_receive_running = false; }
string notes_assign_1 (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); Database_NoteAssignment database_noteassignment; string page; Assets_Header header = Assets_Header (translate("Assign note"), request); page += header.run(); Assets_View view; string success, error; string user = request->session_logic ()->currentUser (); int id = convert_to_int (request->query ["id"]); view.set_variable ("id", convert_to_string (id)); if (request->query.count ("assign")) { string assign = request->query ["assign"]; if (database_noteassignment.exists (user, assign)) { notes_logic.assignUser (id, assign); } redirect_browser (request, notes_actions_url () + "?id=" + convert_to_string (id)); return ""; } // Note assignees. string userblock; vector <string> assignees = database_noteassignment.assignees (user); for (auto & assignee : assignees) { userblock.append ("<li><a href=\"assign-1?id=" + convert_to_string (id) + "&assign=" + assignee + "\">" + assignee + "</a></li>\n"); } view.set_variable ("userblock", userblock); view.set_variable ("success", success); view.set_variable ("error", error); page += view.render ("notes", "assign-1"); page += Assets_Page::footer (); return page; }
string public_comment (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); string page; Assets_Header header = Assets_Header (translate("Feedback"), request); page += header.run(); Assets_View view; int id = convert_to_int (request->query ["id"]); view.set_variable ("id", convert_to_string (id)); if (request->post.count ("submit")) { string comment = filter_string_trim (request->post ["comment"]); notes_logic.addComment (id, comment); redirect_browser (request, public_note_url () + "?id=" + convert_to_string (id)); return ""; } if (request->post.count ("cancel")) { redirect_browser (request, public_note_url () + "?id=" + convert_to_string (id)); return ""; } string summary = database_notes.getSummary (id); view.set_variable ("summary", summary); string content = database_notes.getContents (id); view.set_variable ("content", content); page += view.render ("public", "comment"); page += Assets_Page::footer (); return page; }
string notes_severity_1 (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); string page; Assets_Header header = Assets_Header (translate("Severity"), request); page += header.run(); Assets_View view; string success, error; int id = convert_to_int (request->query ["id"]); view.set_variable ("id", convert_to_string (id)); if (request->query.count ("severity")) { int severity = convert_to_int (request->query["severity"]); notes_logic.setRawSeverity (id, severity); redirect_browser (request, notes_actions_url () + "?id=" + convert_to_string (id)); return ""; } string severityblock; vector <Database_Notes_Text> severities = database_notes.getPossibleSeverities (); for (auto & severity : severities) { severityblock.append ("<li><a href=\"severity-1?id=" + convert_to_string (id) + "&severity=" + severity.raw + "\">" + severity.localized + "</a></li>\n"); } view.set_variable ("severityblock", severityblock); view.set_variable ("success", success); view.set_variable ("error", error); page += view.render ("notes", "severity-1"); page += Assets_Page::footer (); return page; }
string notes_actions (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); Notes_Logic notes_logic = Notes_Logic (webserver_request); string page; Assets_Header header = Assets_Header (translate("Note actions"), request); header.setNavigator (); page += header.run (); Assets_View view; string success, error; string user = request->session_logic()->currentUser (); int level = request->session_logic()->currentLevel (); int id; if (request->query.count ("id")) id = convert_to_int (request->query ["id"]); else id = convert_to_int (request->post ["id"]); if (request->query.count ("unsubscribe")) { notes_logic.unsubscribe (id); } if (request->query.count ("subscribe")) { notes_logic.subscribe (id); } if (request->query.count ("unassign")) { string unassign = request->query["unassign"]; notes_logic.unassignUser (id, unassign); } if (request->query.count ("done")) { notes_logic.unassignUser (id, user); } if (request->query.count ("markdel")) { notes_logic.markForDeletion (id); success = translate("The note will be deleted after a week.") + " " + translate ("Adding a comment to the note cancels the deletion."); } if (request->query.count ("unmarkdel")) { notes_logic.unmarkForDeletion (id); } if (request->query.count ("delete")) { notes_logic.erase (id); redirect_browser (request, notes_index_url ()); return ""; } if (request->query.count ("publicnote")) { bool state = database_notes.getPublic (id); database_notes.setPublic (id, !state); } view.set_variable ("id", convert_to_string (id)); string summary = database_notes.getSummary (id); view.set_variable ("summary", summary); bool subscribed = database_notes.isSubscribed (id, user); if (subscribed) view.enable_zone ("subscribed"); else view.enable_zone ("subscribe"); vector <string> assignees = database_notes.getAssignees (id); string assigneeblock; for (auto & assignee : assignees) { assigneeblock.append (assignee); if (level >= Filter_Roles::manager ()) { assigneeblock.append ("<a href=\"?id=" + convert_to_string (id) + "&unassign=" + assignee + "\"> [" + translate("unassign") + "]</a>"); assigneeblock.append (" | "); } } view.set_variable ("assigneeblock", assigneeblock); if (level >= Filter_Roles::manager ()) view.enable_zone ("assign"); bool assigned = database_notes.isAssigned (id, user); if (assigned) view.enable_zone ("assigned"); string status = database_notes.getStatus (id); view.set_variable ("status", status); if (Filter_Roles::translator ()) view.enable_zone ("editstatus"); else view.enable_zone ("viewstatus"); string verses = filter_passage_display_inline (database_notes.getPassages (id)); view.set_variable ("verses", verses); string severity = database_notes.getSeverity (id); view.set_variable ("severity", severity); string bible = database_notes.getBible (id); view.set_variable ("bible", bible); if (bible.empty ()) view.enable_zone ("nobible"); if (level >= Filter_Roles::manager ()) view.enable_zone ("rawedit"); if (level >= Filter_Roles::manager ()) view.enable_zone ("marknote"); bool marked = database_notes.isMarkedForDeletion (id); if (marked) view.enable_zone ("marked"); else view.enable_zone ("mark"); #ifndef HAVE_CLIENT view.enable_zone ("cloud"); string on_off = styles_logic_off_on_inherit_toggle_text (database_notes.getPublic (id)); view.set_variable ("publicnote", on_off); #endif // Roles of translator or higher can edit the public visibility of a note. if (level >= Filter_Roles::translator ()) view.enable_zone ("translator"); view.set_variable ("success", success); view.set_variable ("error", error); page += view.render ("notes", "actions"); page += Assets_Page::footer (); return page; }