public static function save($params) { $item = $params['item']; $status = $params['status']; $type = $params['type']; $transcript = $params['transcript']; $user = User::getAuthenticatedUser(); // Make sure user has access (member of project, item is in queue) // TODO: Finish // Update it if it exists; add it if it doesn't $transcriptObj = $user->loadTranscript($item, $type); if ($transcriptObj) { $user->updateTranscript($item, $status, $transcript->getText(), $transcript->getFields(), $type); } else { $user->addTranscript($item, $status, $transcript->getText(), $transcript->getFields(), $type); } // Load the project $project = new Project($item->project_slug); $projectOwner = new User($project->owner); // TODO: load any users who have admin rights // Trigger notifications $notify = Settings::getProtected('notify'); $notify->trigger("user_save_transcript_{$status}", array('user' => $user, 'username' => $user->username, 'item' => $item->title)); $notify->trigger("admin_save_transcript_{$status}", array('admins' => array($projectOwner), 'username' => $user->username, 'item' => $item->title)); }
public static function admin($params) { $format = Utils::getFormat($params['args'], 0, 2); $app_url = Settings::getProtected('app_url'); $db = Settings::getProtected('db'); $user = User::getAuthenticatedUser(); // Make sure the user is at least creator or admin RoleController::forceClearance(array('system.creator', 'system.admin'), $user); // Get latest work for the user's projects $latestWorkList = $db->getAdminProjectsLatestWork($user->username, 5); $latestWork = array(); foreach ($latestWorkList as $work) { $qn = $work['queue_name']; $type = substr($qn, strpos($qn, '.') + 1, strpos($qn, ':') - strpos($qn, '.') - 1); $username = substr($qn, strpos($qn, ':') + 1); $item = new Item($work['item_id'], $work['project_slug']); $project = new Project($work['project_slug']); if ($item->project_type == 'system') { $transcriptURL = "{$app_url}/projects/" . $item->project_slug . "/items/" . $item->item_id . "/{$type}/{$username}"; $editURL = "{$app_url}/projects/" . $item->project_slug . "/items/" . $item->item_id . "/edit"; } else { $transcriptURL = "{$app_url}/" . $item->project_owner . "/projects/" . $item->project_slug . "/items/" . $item->item_id . "/{$type}/{$username}"; $editURL = "{$app_url}/" . $item->project_owner . "/projects/" . $item->project_slug . "/items/" . $item->item_id . "/edit"; } array_push($latestWork, array('item' => $item->getResponse(), 'project' => $project->getResponse(), 'type' => $type, 'username' => $username, 'date_completed' => $work['date_completed'], 'transcript_url' => $transcriptURL, 'edit_url' => $editURL)); } $newestMembers = $db->getNewestProjectMembers($user->username, 5); // Only get list of users if they're a site admin $users = array(); if ($user->role == 'admin') { $usernameList = $db->getUsers(); foreach ($usernameList as $username) { $tempUser = new User($username['username']); $tempUserArray = $tempUser->getResponse(); // Get list of projects they're working on $projects = $db->getUserProjectsWithStats($username['username']); $tempUserArray['projects'] = $projects; array_push($users, $tempUserArray); } } $response = array('page_title' => 'Admin Dashboard', 'user' => $user->getResponse(), 'latest_work' => $latestWork, 'newest_members' => $newestMembers, 'users' => $users); switch ($format) { case 'json': echo json_encode($response); break; case 'html': Template::render('admin_dashboard', $response); break; } }
public static function userDashboard($params) { $format = $params['args'][1] != '' ? $params['args'][1] : 'html'; $app_url = Settings::getProtected('app_url'); $user = User::getAuthenticatedUser(); // Put it in the settings cache Settings::setProtected('username', $user->username); // Set up proofing and reviewing objects $proofing = array(); $reviewing = array(); // Load the user's proofing queue $proofQueue = new Queue("user.proof:{$user->username}"); $proofing['items'] = array(); foreach ($proofQueue->getItems() as $item) { array_push($proofing['items'], array('title' => $item->title, 'status' => $item->status, 'project_slug' => $item->project_slug, 'project_type' => $item->project_type, 'project_owner' => $item->project_owner, 'item_id' => $item->item_id, 'type' => $item->type)); } // Load the user's reviewing queue $reviewQueue = new Queue("user.review:{$user->username}"); $reviewing['items'] = array(); foreach ($reviewQueue->getItems() as $item) { array_push($reviewing['items'], array('title' => $item->title, 'status' => $item->status, 'project_slug' => $item->project_slug, 'project_type' => $item->project_type, 'project_owner' => $item->project_owner, 'item_id' => $item->item_id, 'type' => $item->type)); } // Add extra info (edit link and slug) to each item $prooflist = array(); foreach ($proofing['items'] as &$item) { if ($item['project_type'] == 'system') { $item['editlink'] = $app_url . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/proof'; } else { if ($item['project_type'] == 'user') { $item['editlink'] = $app_url . '/users/' . $item['project_owner'] . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/proof'; } } if (!in_array($item['project_slug'], $prooflist)) { $prooflist[] = $item['project_slug']; } } $reviewlist = array(); foreach ($reviewing['items'] as &$item) { if ($item['project_type'] == 'system') { $item['editlink'] = $app_url . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/review'; } else { if ($item['project_type'] == 'user') { $item['editlink'] = $app_url . '/users/' . $item['project_owner'] . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/review'; } } if (!in_array($item['project_slug'], $reviewlist)) { $reviewlist[] = $item["project_slug"]; } } // Add link and percentages to each project $projects = $user->getProjectSummaries(); $projectInfo = array(); $proofing['projects'] = array(); $reviewing['projects'] = array(); foreach ($projects as &$project) { $roles = $user->getRolesForProject($project['slug']); // If the project is available for proofing or reviewing (with no items already claimed), // then add it to the appropriate list if (!in_array($project["slug"], $prooflist) && $project["available_to_proof"] > 0 && in_array('proofer', $roles)) { array_push($proofing['projects'], $project['slug']); } if (!in_array($project["slug"], $reviewlist) && $project["available_to_review"] > 0 && in_array('reviewer', $roles)) { array_push($reviewing['projects'], $project['slug']); } // Set up percentage bars if ($project['num_items'] == 0) { $project['percent_proofed'] = 0; $project['percent_reviewed'] = 0; } else { $project['percent_proofed'] = round($project['num_proofed'] / $project['num_items'] * 100, 0); $project['percent_reviewed'] = round($project['num_reviewed'] / $project['num_items'] * 100, 0); } // And the project link if ($project['type'] == 'system') { $project['link'] = $app_url . '/projects/' . $project['slug']; } else { if ($project['type'] == 'user') { $project['link'] = $app_url . '/users/' . $project['owner'] . '/projects/' . $project['slug']; } } $projectInfo[$project['slug']] = $project; } // Blank slate condition if there are no items and no projects $proofing['blankslate'] = count($proofing['items']) == 0 && count($proofing['projects']) == 0 ? true : false; $reviewing['blankslate'] = count($reviewing['items']) == 0 && count($reviewing['projects']) == 0 ? true : false; // Get the user's history and the top proofers information $history = $user->getHistory(); $topusers = User::getTopUsers(); // Prepare user history foreach ($history as &$event) { if ($event['project_type'] == 'system') { $event['editlink'] = "{$app_url}/projects/" . $event['project_slug'] . '/items/' . $event['item_id'] . '/proof'; } else { if ($project['type'] == 'user') { $event['editlink'] = "{$app_url}/users/" . $event['project_owner'] . '/projects/' . $event['project_slug'] . '/items/' . $event['item_id'] . '/proof'; } } $event['title'] = $event['item_title']; } $response = array('page_title' => 'Dashboard', 'user' => $user->getResponse(), 'projects' => $projectInfo, 'proofing' => array('items' => $proofing['items'], 'projects' => $proofing['projects'], 'blankslate' => $proofing['blankslate']), 'reviewing' => array('items' => $reviewing['items'], 'projects' => $reviewing['projects'], 'blankslate' => $reviewing['blankslate']), 'history' => $history, 'history_count' => count($history), 'registered_methods' => array('/users/' . $user->username), 'topusers' => $topusers); switch ($params['method']) { // GET: Get user dashboard case 'GET': switch ($format) { case 'json': echo json_encode($response); break; case 'html': Template::render('dashboard', $response); break; } break; } }
public static function getNewItem($params) { $format = Utils::getFormat($params['args'], 0, 2); $projectPage = Utils::getProjectType($params['args']); $projectSlugIndex = $projectPage == 'system' ? 0 : 2; $projectSlug = $params['args'][$projectSlugIndex]; $user = User::getAuthenticatedUser(); switch ($params['method']) { // POST: Get next available item case 'POST': $type = Utils::POST('type'); // proof or review $dispatch = Settings::getProtected('dispatch'); $dispatch->init(array('username' => $user->username, 'projectSlug' => $projectSlug, 'type' => $type)); $response = $dispatch->next(); if ($response['status'] == true) { $itemId = $response['code']; // Load the item to make sure it's real $item = new Item('', $itemId, $projectSlug, $user->username, $type); // Verification check if ($item->status == 'available') { // Put it in the user's queue $queue = new Queue("user.{$type}:{$user->username}", true); $queue->add($item); $queue->save(); } } echo json_encode($response); break; } }
public static function import($params) { $appUrl = Settings::getProtected('app_url'); $themeRoot = Settings::getProtected('theme_root'); $format = Utils::getFormat($params['args'], 1, 3); $projectType = Utils::getProjectType($params['args']); $projectSlug = $projectType == 'system' ? $params['args'][0] : $params['args'][2]; $user = User::getAuthenticatedUser(); // Load the project $project = new Project($projectSlug); RoleController::forceClearance(array('project.admin', 'project.owner', 'system.admin'), $user, array('project' => $project)); if ($project->title == '') { Utils::redirectToDashboard('', 'Error loading project.'); } if ($project->type == 'system') { $projectUrl = "projects/" . $project->slug; } else { if ($project->type == 'user') { $projectUrl = "users/" . $project->owner . "/projects/" . $project->slug; } } $project->getItems(); $projectArray = $project->getResponse(); $projectArray['items'] = $project->items; $projectArray['url'] = "{$appUrl}/{$projectUrl}"; switch ($params['method']) { // GET: Get transcript import page case 'GET': $response = array('page_title' => 'Import Transcript', 'user' => $user->getResponse(), 'project' => $projectArray); switch ($format) { case 'json': echo json_encode(array('status' => 'success', 'response' => $response)); break; case 'html': Template::render('import', $response); break; } break; // POST: Update transcripts for items // POST: Update transcripts for items case 'POST': $template = Utils::POST('template'); $transcript = Utils::POST('transcript'); $items = Utils::POST('items'); $projectSlug = Utils::POST('projectSlug'); $status = 'success'; // Split the transcript $splitTranscripts = TranscriptController::splitTranscript($transcript, $template); // Make sure the number of items still matches, otherwise return error if (count($splitTranscripts) != count($items)) { $status = 'error'; } // Update each item's transcript for ($i = 0; $i < count($items); $i++) { $item = new Item($items[$i], $projectSlug); $item->transcript = $splitTranscripts[$i]; if (!$item->save()) { $status = 'error'; break; } } echo json_encode(array('status' => $status)); break; } }