From a873bbd5d8d9efd6d3d713db2999484c5c90846c Mon Sep 17 00:00:00 2001 From: Fran Garcia-Linares <fjgarlin@gmail.com> Date: Thu, 27 Mar 2025 17:45:59 +0100 Subject: [PATCH 1/2] Replicate MR273. --- drupalorg/drupalorg.drush.inc | 157 +- drupalorg/drupalorg.module | 941 +++++++- drupalorg/drupalorg.pages.inc | 578 ++++- drupalorg_metrics/drupalorg_metrics.module | 77 +- drupalorg_project/drupalorg_project.module | 14 + .../drupalorg_user.views_default.inc | 2025 ++--------------- 6 files changed, 1869 insertions(+), 1923 deletions(-) diff --git a/drupalorg/drupalorg.drush.inc b/drupalorg/drupalorg.drush.inc index 6fe6024a3..c03297b88 100644 --- a/drupalorg/drupalorg.drush.inc +++ b/drupalorg/drupalorg.drush.inc @@ -31,6 +31,14 @@ function drupalorg_drush_command() { 'arguments' => [ 'event_nid' => 'Event node ID.', 'csv_file' => 'CSV file containing the list.', + ] + ], + 'drupalorg-contribution-records-sync' => [ + 'description' => 'Sync data from the current credits to the new system', + 'options' => [ + 'days-ago' => 'Number of days since the record was updated or created. Empty to process them all', + 'nids' => 'Comma separated list of nids to process', + 'raw-import' => 'Use the raw import functionality from the new system, which does not query back to this site. 0 = No raw import // 1 = Direct raw import // 2 = Queued raw import', ], ], 'drupalorg-integrity' => [ @@ -299,6 +307,102 @@ function drush_drupalorg_uid_salesforce_push() { } } +/** + * Callback function to create/update contribution records from this site to + * the new system. The new site will make a query to this site to get the + * issue metadata and get additional information about the contributors. + */ +function drush_drupalorg_contribution_records_sync() { + $validate_ids = FALSE; + $raw_import = (int) drush_get_option('raw-import', 0); + $nids = drush_get_option('nids', ''); + if (!empty($nids)) { + $nids = explode(',', $nids); + + // We need to validate nids here as they are entered as a param. + _drush_drupalorg_sync_contribution_records($nids, TRUE, $raw_import); + } + else { + // IMPORTANT: If we query all records, it could potentially be +1 million. + $days_ago = (int) drush_get_option('days-ago', 0); + + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'node') + ->entityCondition('bundle', 'project_issue') + ->propertyCondition('status', NODE_PUBLISHED) + ->addMetaData('account', user_load(1)) + ->propertyOrderBy('nid', 'DESC'); + if ($days_ago > 0) { + $query->propertyCondition('changed', strtotime($days_ago . ' days ago'), '>'); + } + + $count_query = clone $query; + $total = $count_query->count()->execute(); + $offset = 0; + $limit = 50; + $results_found = TRUE; + while ($results_found) { + $range_query = clone $query; + $range_query->range($offset, $limit); + + $result = $range_query->execute(); + if (!empty($result['node'])) { + $nids = array_keys($result['node']); + + // We don't need to revalidate the nid's as they come from the DB query. + _drush_drupalorg_sync_contribution_records($nids, FALSE, $raw_import, FALSE); + $offset += $limit; + drush_print('* Queued: ' . $offset . '/' . $total); + } + else { + $results_found = FALSE; + } + } + } +} + +/** + * Helper function to send a chunk of nids to the new contrib records system. + */ +function _drush_drupalorg_sync_contribution_records($nids, $validate_ids, $raw_import, $output = TRUE) { + $max = count($nids); + if (!$max) { + return; + } + + $progress = 0; + foreach ($nids as $nid) { + $valid = !$validate_ids; + if ( + $validate_ids && + ($node = node_load($nid)) && + project_issue_node_is_issue($node) + ) { + $valid = TRUE; + } + + if ($valid) { + $data = [ + 'event_type' => 'issue', + 'url' => url('node/' . $nid, ['absolute' => TRUE, 'alias' => TRUE]), + // Triggering an update will create the record in the new system if it + // doesn't exist or update the info if it does. + 'action' => 'update' + ]; + if ($raw_import) { + $data['raw-import'] = $raw_import; + } + + DrupalQueue::get('drupalorg_issue_events')->createItem($data); + } + + $progress++; + if ($output) { + drush_print("* " . $progress . "/" . $max . " queued... " . ($valid ? '' : '(invalid issue)')); + } + } +} + /** * @param $origin_organization_nid * @param $target_organization_nid @@ -344,7 +448,6 @@ function drush_drupalorg_migrate_org_credits($origin_organization_nid, $target_o */ function drush_drupalorg_org_credit() { $weights = variable_get('drupalorg_org_credit_weights'); - $credits = []; $usage_weights = []; $contrib_roles_weighted_score = 0; //field_drupalorg_rank_components list @@ -425,31 +528,6 @@ function drush_drupalorg_org_credit() { } } - // Organization attribution. - $result = db_query("SELECT fdfact.field_attribute_contribution_to_target_id AS organization, n.nid, fdf_p.field_project_target_id AS project, fdf_ilsc.field_issue_last_status_change_value > UNIX_TIMESTAMP(NOW() - INTERVAL 3 MONTH) AS recent FROM {node} n INNER JOIN {field_data_field_issue_credit} fdfic ON fdfic.entity_id = n.nid INNER JOIN {comment} c ON c.cid = fdfic.field_issue_credit_target_id AND c.status = 1 INNER JOIN {field_data_field_issue_status} fdfis ON fdfis.entity_id = n.nid AND fdfis.field_issue_status_value IN (:credited_issue_statuses) INNER JOIN {field_data_field_attribute_as_volunteer} fdf_av ON fdf_av.entity_id = c.cid AND fdf_av.field_attribute_as_volunteer_value = 0 INNER JOIN {field_data_field_attribute_contribution_to} fdfact ON fdfact.entity_id = c.cid INNER JOIN {field_data_field_project} fdf_p ON fdf_p.entity_id = n.nid LEFT JOIN {field_data_field_project_type} fdf_pt ON fdf_pt.entity_id = fdf_p.field_project_target_id INNER JOIN {field_data_field_issue_last_status_change} fdf_ilsc ON fdf_ilsc.entity_id = n.nid WHERE n.type IN (:project_issue_types) AND n.status = 1 AND (fdf_pt.field_project_type_value = 'full' OR fdf_pt.field_project_type_value IS NULL) AND fdf_ilsc.field_issue_last_status_change_value > UNIX_TIMESTAMP(NOW() - INTERVAL 1 YEAR)", [ - ':credited_issue_statuses' => drupalorg_credited_issue_statuses(), - ':project_issue_types' => project_issue_issue_node_types(), - ]); - foreach ($result as $row) { - if ($row->recent){ - $credits[$row->organization][$row->nid] = $row->project; - } - $year_credits[$row->organization][$row->nid] = $row->project; - } - - // Customer attribution. - $result = db_query("SELECT fdf_fc.field_for_customer_target_id AS organization, n.nid, fdf_p.field_project_target_id AS project, fdf_ilsc.field_issue_last_status_change_value > UNIX_TIMESTAMP(NOW() - INTERVAL 3 MONTH) AS recent FROM {node} n INNER JOIN {field_data_field_issue_credit} fdfic ON fdfic.entity_id = n.nid INNER JOIN {comment} c ON c.cid = fdfic.field_issue_credit_target_id AND c.status = 1 INNER JOIN {field_data_field_issue_status} fdfis ON fdfis.entity_id = n.nid AND fdfis.field_issue_status_value IN (:credited_issue_statuses) INNER JOIN {field_data_field_attribute_as_volunteer} fdf_av ON fdf_av.entity_id = c.cid AND fdf_av.field_attribute_as_volunteer_value = 0 INNER JOIN {field_data_field_for_customer} fdf_fc ON fdf_fc.entity_id = c.cid INNER JOIN {field_data_field_project} fdf_p ON fdf_p.entity_id = n.nid LEFT JOIN {field_data_field_project_type} fdf_pt ON fdf_pt.entity_id = fdf_p.field_project_target_id INNER JOIN {field_data_field_issue_last_status_change} fdf_ilsc ON fdf_ilsc.entity_id = n.nid WHERE n.type IN (:project_issue_types) AND n.status = 1 AND (fdf_pt.field_project_type_value = 'full' OR fdf_pt.field_project_type_value IS NULL) AND fdf_ilsc.field_issue_last_status_change_value > UNIX_TIMESTAMP(NOW() - INTERVAL 1 YEAR)", [ - ':credited_issue_statuses' => drupalorg_credited_issue_statuses(), - ':project_issue_types' => project_issue_issue_node_types(), - ]); - // De-dupe by issue nid. - foreach ($result as $row) { - if ($row->recent) { - $credits[$row->organization][$row->nid] = $row->project; - } - $year_credits[$row->organization][$row->nid] = $row->project; - } - $maxval = array_fill(0, 8, 0) + ['total' => 0]; // Update all organizations. $query = new EntityFieldQuery(); @@ -457,35 +535,42 @@ function drush_drupalorg_org_credit() { ->propertyCondition('type', 'organization') ->execute(); $org_nodes = node_load_multiple(array_keys($result['node'])); + $nodes = []; foreach ($org_nodes as $keyed) { $nodes[$keyed->title] = $keyed; } ksort($nodes); + + $months = (int) variable_get('drupalorg_contribution_records_marketplace_interval_months', 12); + $recent_months = (int) variable_get('drupalorg_contribution_records_marketplace_recent_months', 3); foreach ($nodes as $node) { $contribution_rank = 0; $wrapper = entity_metadata_wrapper('node', $node); $updated = FALSE; + $interval_credits_data = drupalorg_get_contribution_record_organization_credits($node, $months); + $recent_credits_data = drupalorg_filter_recent_contribution_record_organization($interval_credits_data, $recent_months); - $issue_credits = isset($credits[$node->nid]) ? count($credits[$node->nid]) : 0; + $issue_credits = $recent_credits_data['total']; if ($wrapper->field_org_issue_credit_count->value() != $issue_credits) { $wrapper->field_org_issue_credit_count = $issue_credits; $updated = TRUE; } - if (array_key_exists($node->nid, $year_credits) && ($wrapper->field_org_issue_credit_year->value() != count($year_credits[$node->nid]))) { - drush_log('Updating year credit: ' . $node->title . ' from ' . $wrapper->field_org_issue_credit_year->value() . ' to ' . count($year_credits[$node->nid])); - $wrapper->field_org_issue_credit_year = count($year_credits[$node->nid]); + $year_issue_credits = $interval_credits_data['total']; + if (($wrapper->field_org_issue_credit_year->value() != $year_issue_credits)) { + drush_log('Updating year credit: ' . $node->title . ' from ' . $wrapper->field_org_issue_credit_year->value() . ' to ' . $year_issue_credits); + $wrapper->field_org_issue_credit_year = $year_issue_credits; $updated = TRUE; } // Add issue credit, weighted by project usage for 12 months worth of credits. $year_issue_credit_weighted = 0; - if (isset($year_credits[$node->nid])) { - foreach ($year_credits[$node->nid] as $project_nid) { + if (!empty($interval_credits_data['data'])) { + foreach ($interval_credits_data['data'] as $project_nid => $info) { if (!isset($usage_weights[$project_nid])) { $usage_weights[$project_nid] = _drupalorg_weight_project($project_nid); } - $year_issue_credit_weighted += $usage_weights[$project_nid]; + $year_issue_credit_weighted += ( $usage_weights[$project_nid] * count($info['issues']) ); } $updated = TRUE; } @@ -493,12 +578,12 @@ function drush_drupalorg_org_credit() { // Add issue credit, weighted by project usage. $issue_credit_weighted = 0; - if (isset($credits[$node->nid])) { - foreach ($credits[$node->nid] as $project_nid) { + if (!empty($recent_credits_data['data'])) { + foreach ($recent_credits_data['data'] as $project_nid => $info) { if (!isset($usage_weights[$project_nid])) { $usage_weights[$project_nid] = _drupalorg_weight_project($project_nid); } - $issue_credit_weighted += $usage_weights[$project_nid]; + $issue_credit_weighted += ( $usage_weights[$project_nid] * count($info['issues'])); } } $wrapper->field_drupalorg_rank_components[0] = $weights['issue credit'] * $issue_credit_weighted; diff --git a/drupalorg/drupalorg.module b/drupalorg/drupalorg.module index 19c5b5677..c0903360a 100644 --- a/drupalorg/drupalorg.module +++ b/drupalorg/drupalorg.module @@ -500,6 +500,54 @@ function drupalorg_menu() { 'page arguments' => array('drupalorg_notice_settings_form'), ); + $items['u/%/issue-credits/%'] = [ + 'page callback' => '_drupalorg_user_contribution_records_by_project', + 'page arguments' => [1, 3], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + + $items['u/%/issue-credits'] = [ + 'page callback' => '_drupalorg_user_contribution_records', + 'page arguments' => [1], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + + $items['node/%node/issue-credits/%'] = [ + 'page callback' => '_drupalorg_organization_contribution_records_by_project', + 'page arguments' => [1, 3], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + + $items['node/%node/issue-credits'] = [ + 'page callback' => '_drupalorg_organization_contribution_records', + 'page arguments' => [1], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + + $items['node/%node/org-issue-credit-user'] = [ + 'page callback' => '_drupalorg_organization_contribution_records_by_user', + 'page arguments' => [1], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + + $items['node/%node/org-issue-credit-user-export'] = [ + 'page callback' => '_drupalorg_organization_contribution_records_by_user_export', + 'page arguments' => [1], + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + $items['drupalorg-issue-fork-tugboat-previews/%drupalorg_issue_fork'] = [ 'page callback' => 'drupalorg_issue_fork_tugboat_previews', 'page arguments' => [1], @@ -3872,7 +3920,7 @@ function _drupalorg_gitlab_markdown_to_html($project, $branch) { // Remove whitespace between tags. $html = preg_replace('~>\s+<~', '><', $html); - + // This code block replaces remaining linebreaks with spaces, except within // code or pre elements, where we need to keep the linebreaks. $html = str_replace("\n", '###TEMP###', $html); @@ -5139,6 +5187,17 @@ function drupalorg_node_view($node, $view_mode = 'full') { '#markup' => '<div class="description">' . l('About issue forks', 'node/3172805') . '</div>', ]; } + + // Show link after the last comment on the page. + if (!empty($node->comment_count) && $node->comment_count > 1) { + $node->content['comments']['comments'][] = [ + '#markup' => '<div id="contribution_record_link">' . + '<hr>' . + drupalorg_get_contribution_record_credits() . + drupalorg_get_link_to_contribution_record() . + '</div>' + ]; + } } } elseif ($node->type === 'event') { @@ -5219,21 +5278,12 @@ function _drupalorg_organization_credit_summary(stdClass $node) { $output['sa']['#prefix'] = '<div class="view accordion"><h3 id="org-page-sa-credit">' . format_plural($issues, 'Credited on 1 security advisory in the past @time', 'Credited on @count security advisories in the past @time', ['@time' => ltrim($filter['value']['value'], '-')]) . '</h3>'; $output['sa']['#suffix'] = '</div>'; } - // Issue credits. - $cloned = $view->clone_view(); - $cloned->set_item_option('organization_recent', 'filter', 'field_attribute_contribution_to_target_id', 'value', ['value' => $node->nid]); - $cloned->set_item_option('organization_recent', 'filter', 'field_for_customer_target_id', 'value', ['value' => $node->nid]); - $output['issue'] = [ - '#markup' => $cloned->preview('organization_recent'), - ]; - $issues = 0; - foreach ($cloned->result as $row) { - $issues += $row->nid; - } - if ($issues > 0) { - $filter = $cloned->get_item('organization_recent', 'filter', 'field_issue_last_status_change_value'); - $output['issue']['#prefix'] = '<div class="accordion"><h3 id="org-page-issue-credit">' . format_plural($issues, 'Credited on 1 issue in the past @time', 'Credited on @count issues in the past @time', ['@time' => ltrim($filter['value']['value'], '-')]) . '</h3>'; - $output['issue']['#suffix'] = '</div>'; + // Issue credits from the new system. + $organization_credits = drupalorg_get_recent_contribution_record_organization_credits($node); + if ($organization_credits) { + $output['issue'] = [ + '#markup' => $organization_credits, + ]; } cache_set('drupalorg_org_issues:' . $node->nid, $output, 'cache', REQUEST_TIME + variable_get('drupalorg_organization_credit_summary_cache', 24 * 60 * 60)); @@ -5569,6 +5619,14 @@ function drupalorg_node_insert($node) { if (empty($node->skip_comment_for_credit)) { // Save initial issue comment. drupalorg_post_issue_comment_for_credit($node->nid, $GLOBALS['user'], '!name created an issue.'); + + // Queue job to post to the contribution credits system when the issue + // is created. + DrupalQueue::get('drupalorg_issue_events')->createItem([ + 'event_type' => 'issue', + 'url' => url('node/' . $node->nid, ['absolute' => TRUE]), + 'action' => 'open' + ]); } } elseif (project_release_node_is_release($node)) { @@ -5686,24 +5744,67 @@ function drupalorg_node_update($node) { drupal_register_shutdown_function('drupalorg_create_packaging_job_for_project', $node->nid); drupal_register_shutdown_function('project_release_download_table', $node->nid, TRUE); } - elseif (project_issue_node_is_issue($node) && isset($node->nodechanges_cid) && isset($node->nodechanges_comment->uid)) { - // Check if the commenter has previously received credit. - foreach ($wrapper->field_issue_credit as $comment) { - if ($comment->value()->uid == $node->nodechanges_comment->uid) { - // Add credit for their new comment, in case there is new attribution. + elseif (project_issue_node_is_issue($node)) { + if (isset($node->nodechanges_cid) && isset($node->nodechanges_comment->uid)) { + // Check if the commenter has previously received credit. + foreach ($wrapper->field_issue_credit as $comment) { + if ($comment->value()->uid == $node->nodechanges_comment->uid) { + // Add credit for their new comment, in case there is new attribution. + $wrapper->field_issue_credit[] = $node->nodechanges_cid; + field_attach_presave('node', $node); + field_attach_update('node', $node); + break; + } + } + + // Commenting user is being credited for the first time, save that credit. + if (!empty($node->drupalorg_credit_self)) { $wrapper->field_issue_credit[] = $node->nodechanges_cid; field_attach_presave('node', $node); field_attach_update('node', $node); - break; } } - // Commenting user is being credited for the first time, save that credit. - if (!empty($node->drupalorg_credit_self)) { - $wrapper->field_issue_credit[] = $node->nodechanges_cid; - field_attach_presave('node', $node); - field_attach_update('node', $node); + // Queue job to post to the contribution credits system if the issue + // was closed or re-opened. + $action = 'update'; + $original_status = $node->original->field_issue_status[LANGUAGE_NONE][0]['value']; + $current_status = $node->field_issue_status[LANGUAGE_NONE][0]['value']; + $fixed_status = variable_get('project_issue_state_fixed', PROJECT_ISSUE_STATE_FIXED); + if ($original_status !== $current_status) { + if ( + in_array($original_status, project_issue_open_states()) && + in_array($current_status, project_issue_closed_states()) + ) { + $action = 'close'; + } + elseif ( + in_array($original_status, project_issue_closed_states()) && + in_array($current_status, project_issue_open_states()) + ) { + $action = 'reopen'; + } + + // Special case for "Fixed". + if ( + $fixed_status == $original_status && + in_array($current_status, project_issue_open_states()) + ) { + $action = 'reopen'; + } + elseif ( + $fixed_status == $current_status && + in_array($original_status, project_issue_open_states()) + ) { + $action = 'close'; + } } + + DrupalQueue::get('drupalorg_issue_events')->createItem([ + 'event_type' => 'issue', + 'url' => url('node/' . $node->nid, ['absolute' => TRUE, 'alias' => TRUE]), + 'action' => $action + ]); } // Keep OG Menu titles matching the node title. @@ -5953,6 +6054,14 @@ function drupalorg_comment_insert($comment) { } } + // Queue job to post to the contribution credits system every time there is a comment. + if ($comment->node_type === 'comment_node_project_issue') { + DrupalQueue::get('drupalorg_issue_events')->createItem([ + 'event_type' => 'comment', + 'url' => url('node/' . $comment->nid, ['absolute' => TRUE, 'alias' => TRUE]) + ]); + } + if ($comment->status === COMMENT_NOT_PUBLISHED && $comment->uid === $GLOBALS['user']->uid) { _drupalorg_spam_message(); } @@ -6492,17 +6601,13 @@ function drupalorg_user_view($account, $view_mode) { $filter = $view->get_item('user_sa_recent', 'filter', 'field_issue_last_status_change_value'); $account->content['drupalorg_user_issue_credit']['sa']['#prefix'] = '<h4>' . format_plural($issues, 'Credited on 1 security advisory', 'Credited on @count security advisories') . '</h4>'; } - // Issue credits. - $cloned = $view->clone_view(); - $account->content['drupalorg_user_issue_credit']['issue'] = array( - '#markup' => $cloned->preview('user_recent', array($account->uid)), - ); - $issues = 0; - foreach ($cloned->result as $row) { - $issues += $row->nid; - } - if ($issues > 0) { - $account->content['drupalorg_user_issue_credit']['issue']['#prefix'] = '<h4>' . format_plural($issues, 'Credited on 1 issue', 'Credited on @count issues') . '</h4>'; + // Issue credits from the new system. + $user_credits = drupalorg_get_contribution_record_user_credits($account); + if ($user_credits) { + $view_all_link = l(t('View all credits'), 'u/' . $account->name . '/issue-credits'); + $account->content['drupalorg_user_issue_credit']['issue'] = [ + '#markup' => $user_credits . $view_all_link, + ]; } // User's maintained projects @@ -6750,7 +6855,188 @@ function drupalorg_cron_queue_info() { 'worker callback' => 'drupalorg_commits_comments_process', 'skip on cron' => TRUE, ], + 'drupalorg_issue_events' => [ + 'worker callback' => 'drupalorg_issue_events_process', + 'skip on cron' => TRUE, + ], + ]; +} + +/** + * Queue worker callback. + */ +function drupalorg_issue_events_process($item) { + if ( + empty($item['event_type']) || + empty($item['url']) + ) { + return FALSE; + } + + // We are using the drupalorg token on both systems for communication. + $token = variable_get('drupalorg_token'); + if (!$token) { + watchdog('drupalorg', 'DrupalOrg token (drupalorg_token) needs to be set up to process issue events.', [], WATCHDOG_ERROR); + return FALSE; + } + + $item['url'] = _drupalorg_format_url($item['url']); + + $data = $item; + $post_url_path = '/drupalorg/webhook/contribution-activity'; + + // Special case for importing contribution records from the D7 system. + if (!empty($item['raw-import']) && in_array($item['raw-import'], [1, 2])) { + $post_url_path = '/contribution-record-import'; + + // We need to include all credits information as well as all direct information. + $data = _drupalorg_get_contribution_record_data_from_issue($item['url']); + if (empty($data)) { + watchdog('drupalorg', 'Could not get the issue data from @url.', [ + '@url' => $item['url'], + ], WATCHDOG_ERROR); + return FALSE; + } + + if ($item['raw-import'] === 2) { + $data['queue'] = TRUE; + } + } + + // Send a post request to the contribution records webhook. + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + // @todo Remove below. Try to avoid "429: Too Many Requests". + if (strpos($contribution_records_base_url, 'ngrok') !== FALSE) { + sleep(1); + } + + try { + $client = new GuzzleHttp\Client([ + 'base_uri' => $contribution_records_base_url, + 'timeout' => 30.0, + 'headers' => [ + 'Drupalorg-Webhook-Token' => $token, + 'Content-Type' => 'application/x-www-form-urlencoded' + ], + ]); + $response = $client->request('POST', $post_url_path, [ + 'form_params' => $data, + ]); + $data = json_decode($response->getBody()->getContents(), TRUE); + if ($data['status'] !== 'success') { + // Most likely duplicated or invalid url. We should not re-queue in either case. + watchdog('drupalorg', 'Error after sending webhook to contribution record system. @error', [ + '@error' => $data['message'], + ], ($data['status'] === 'warning' ? WATCHDOG_WARNING : WATCHDOG_ERROR)); + } + } + catch (Exception $e) { + watchdog('drupalorg', 'Request @url returned code "@code" and message: @message.', [ + '@url' => $contribution_records_base_url . $post_url_path, + '@code' => $e->getCode(), + '@message' => $e->getMessage(), + ], WATCHDOG_ERROR); + + $item['attempts'] = isset($item['attempts']) ? $item['attempts'] + 1 : 0; + if ($item['attempts'] < 3) { + $queue = DrupalQueue::get('drupalorg_issue_events'); + if ($queue instanceof BeanstalkdQueue) { + $queue->beanstalkd_params['delay'] = 60; + } + $queue->createItem($item); + } + } +} + +/** + * Populates an array with the information needed to create a contribution record. + */ +function _drupalorg_get_contribution_record_data_from_issue($url) { + $url_info = parse_url($url); + $path = trim($url_info['path'], '/'); + if (strpos($path, 'node/') === FALSE) { + $path = drupal_lookup_path('source', $path); + } + $issue = menu_get_object('node', 1, $path); + if (!$issue || !project_issue_node_is_issue($issue)) { + return FALSE; + } + + $status_value = $issue->field_issue_status[LANGUAGE_NONE][0]['value']; + $closed = (int) in_array($status_value, project_issue_closed_states()); + if ($status_value == variable_get('project_issue_state_fixed', PROJECT_ISSUE_STATE_FIXED)) { + $closed = 1; + } + $comments = drupalorg_get_comments($issue); + $credits = $issue->field_issue_credit; + if ($credits) { + // Flatten array. + $cids = []; + foreach ($credits[LANGUAGE_NONE] as $credit) { + $cids[] = (int) $credit['target_id']; + } + $credits = $cids; + } + + $project = !empty($issue->field_project) ? node_load($issue->field_project[LANGUAGE_NONE][0]['target_id']) : NULL; + $machine_name = !empty($project) ? $project->field_project_machine_name[LANGUAGE_NONE][0]['value'] : NULL; + // We need to include all credits information as well as all direct information. + $data = [ + 'title' => $issue->title, + 'url' => $url, + 'closed' => $closed, + 'machine_name' => $machine_name, + 'credits' => [], + 'created' => $issue->created, + 'changed' => $issue->changed, + 'status_last_changed' => !empty($issue->field_issue_last_status_change) ? $issue->field_issue_last_status_change[LANGUAGE_NONE][0]['value'] : $issue->changed, ]; + foreach ($comments as $cid => $comment) { + // Calculate values. + $volunteer = 0; + if ( + (!empty($comment->field_attribute_as_volunteer[LANGUAGE_NONE][0]) && $comment->field_attribute_as_volunteer[LANGUAGE_NONE][0]['value'] == 1) || + (!empty($comment->field_attribute_as_volunteer[LANGUAGE_NONE][1]) && $comment->field_attribute_as_volunteer[LANGUAGE_NONE][1]['value'] == 1) + ) { + $volunteer = 1; + } + + $organizations = NULL; + $customers = NULL; + if ( + (!empty($comment->field_attribute_as_volunteer[LANGUAGE_NONE][0]) && $comment->field_attribute_as_volunteer[LANGUAGE_NONE][0]['value'] == 0) || + (!empty($comment->field_attribute_as_volunteer[LANGUAGE_NONE][1]) && $comment->field_attribute_as_volunteer[LANGUAGE_NONE][1]['value'] == 0) + ) { + if (!empty($comment->field_attribute_contribution_to[LANGUAGE_NONE])) { + $companies = []; + foreach ($comment->field_attribute_contribution_to[LANGUAGE_NONE] as $company) { + $company_node = node_load($company['target_id']); + $companies[] = $company_node->title; + } + $organizations = !empty($companies) ? implode(',', $companies) : NULL; + } + + if (!empty($comment->field_for_customer[LANGUAGE_NONE])) { + $companies = []; + foreach ($comment->field_for_customer[LANGUAGE_NONE] as $company) { + $company_node = node_load($company['target_id']); + $companies[] = $company_node->title; + } + $customers = !empty($companies) ? implode(',', $companies) : NULL; + } + } + + // And add them to the credit information. + $data['credits'][$comment->name] = [ + 'volunteer' => $volunteer, + 'credit' => (int) in_array($cid, $credits), + 'username' => $comment->name, + 'organizations' => $organizations, + 'customers' => $customers, + ]; + } + + return $data; } /** @@ -7141,6 +7427,570 @@ function drupalorg_preprocess_comment_author(&$v) { $v['author'] .= $author_fields[$v['comment']->uid]; } +/** + * Add basic auth to the URL. + */ +function _drupalorg_format_url($url) { + // Include the basic auth in the URL for dev copies. + if (variable_get('drupalorg_site_status', FALSE)) { + $username = variable_get('drupalorg_devsite_username', 'drupal'); + $password = variable_get('drupalorg_devsite_password', 'drupal'); + $user_pass = ''; + if ($username && $password) { + $user_pass = $username . ':' . $password . '@'; + } + $url_info = parse_url($url); + $url = $url_info['scheme'] . '://' . $user_pass . $url_info['host'] . $url_info['path']; + } + + return $url; +} + +/** + * Get the project that a contribution record belongs to. + */ +function _drupalorg_get_project_from_contribution_record_source($source) { + $project = NULL; + $this_server = parse_url($GLOBALS['base_url']); + + // Retrieve project. Source could be a d.o link or a gitlab link. + $url_info = parse_url($source); + if (in_array($url_info['host'], [$this_server['host'], 'www.drupal.org'])) { + $path = trim($url_info['path'], '/'); + if (strpos($path, 'node/') === FALSE) { + $path = drupal_lookup_path('source', $path); + } + $issue = menu_get_object('node', 1, $path); + if ($issue && project_issue_node_is_issue($issue)) { + $project = node_load($issue->field_project[LANGUAGE_NONE][0]['target_id']); + } + } + elseif (in_array($url_info['host'], ['git.drupalcode.org', 'gitlab1.code-dev.devdrupal.org'])) { + $path_parts = explode('/', trim($url_info['path'], '/')); + if (!empty($path_parts[1])) { + $namespace = $path_parts[0] . '/' . $path_parts[1]; + $gitlab_project = FALSE; + + $cache_id = 'drupalorg_contribution_record_gitdrupalcode_namespace:' . md5($namespace); + if (($cache = cache_get($cache_id))) { + $project = $cache->data; + } + else { + try { + $gitlab_project = versioncontrol_gitlab_get_client()->projects()->show($namespace); + if ($gitlab_project && !empty($gitlab_project['id'])) { + $project = versioncontrol_project_project_load($gitlab_project['id']); + } + + // Last attempt by machine_name. + if (!$project) { + $project = project_load($path_parts[1]); + } + } + catch (Exception $e) { + watchdog('drupalorg', '@namespace project was not found in Gitlab.', ['@namespace' => $namespace], 'error'); + } + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $project, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + } + } + + return $project; +} + +/** + * Basic get request to the contribution records endpoint. + */ +function drupalorg_contribution_records_api_request($url, $key = 'data') { + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + try { + $client = new GuzzleHttp\Client([ + 'base_uri' => $contribution_records_base_url, + 'timeout' => 30.0 + ]); + $response = $client->request('GET', $url); + $output = json_decode($response->getBody()->getContents(), TRUE); + } + catch (Exception $e) { + $output = NULL; + watchdog('drupalorg', 'Exception for @url with message @message.', [ + '@url' => $contribution_records_base_url . $url, + '@message' => $e->getMessage() + ], WATCHDOG_ERROR); + } + + if (is_null($output)) { + watchdog('drupalorg', 'Could not get data from @url.', ['@url' => $contribution_records_base_url . $url], WATCHDOG_ERROR); + } + elseif (!empty($output['status']) && $output['status'] !== 'success') { + watchdog('drupalorg', 'Unsucessful request to @url: @message.', [ + '@url' => $contribution_records_base_url . $url, + '@message' => !empty($output['message']) ? $output['message'] : 'Unknown' + ], $output['status']); + } + + return isset($output[$key]) ? $output[$key] : $output; +} + +/** + * Make a jsonapi request to the contribution records system. + */ +function drupalorg_make_contribution_records_jsonapi_request($url, $full_data = FALSE) { + $client = new GuzzleHttp\Client(); + // Failsafe to avoid timeouts or memory issues. + // 50 results per page x 10 iterations = 500 results. + $iteration_limit = variable_get('contribution_records_jsonapi_iteration_limit', 10); + $data = []; + $included = []; + $total = 0; + $message = ''; + + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + $jsonapi_url = $contribution_records_base_url . $url; + + // @todo Remove below. Try to avoid "429: Too Many Requests". + if (strpos($contribution_records_base_url, 'ngrok') !== FALSE) { + sleep(1); + } + + try { + $response = $client->request('GET', $jsonapi_url); + $jsonapi_output = json_decode($response->getBody()->getContents(), TRUE); + $data = !empty($jsonapi_output['data']) ? $jsonapi_output['data'] : NULL; + $included = !empty($jsonapi_output['included']) ? $jsonapi_output['included'] : NULL; + $total = !empty($jsonapi_output['meta']['count']) ? $jsonapi_output['meta']['count'] : 0; + + if ($full_data) { + // Start querying the "next" pages until there are no more of them, or + // we reach the iteration max limit. + $iterations = 0; + while (!empty($jsonapi_output['links']['next']) && $iterations < $iteration_limit) { + // Params are already in the URL for the "next" request. + $url = $jsonapi_output['links']['next']['href']; + + $response = $client->request('GET', $url); + $jsonapi_output = json_decode($response->getBody()->getContents(), TRUE); + if ($jsonapi_output && !empty($jsonapi_output['data'])) { + $data = array_merge($data, $jsonapi_output['data']); + if (!empty($jsonapi_output['included'])) { + $included = array_merge($included, $jsonapi_output['included']); + } + } + + $iterations++; + } + + if ($iterations >= $iteration_limit) { + $message = t('Max limit reached: Result data has been truncated to %limit records.', [ + '%limit' => ($iteration_limit * 50) + 50, + ]); + } + } + + if (!empty($included)) { + // Organize included data. + $included_by_type = []; + foreach ($included as $item) { + $included_by_type[$item['type']][$item['id']] = $item; + } + + $included = $included_by_type; + } + } + catch (Exception $e) { + $message = t('Could not get data from @url.', [ + '@url' => $jsonapi_url, + ]); + watchdog('drupalorg', '[Contribution Records] Could not get data from @url. Message: @message.', [ + '@url' => $jsonapi_url, + '@message' => $e->getMessage(), + ], WATCHDOG_ERROR); + } + + return [ + 'total' => $total ? $total : count($data), + 'data' => $data, + 'included' => $included, + 'message' => $message, + ]; +} + +/** + * Organize contribution records by user. + */ +function _drupalorg_contribution_records_organized_by_user($data) { + $contribution_records = $data['data']; + + $contributors_map = []; + $contributors_data = !empty($data['included']['paragraph--contributor']) ? $data['included']['paragraph--contributor'] : []; + if (!empty($contributors_data)) { + foreach ($contributors_data as $contributor) { + $contributors_map[$contributor['id']] = []; + if (!empty($contributor['relationships']['field_contributor_user'])) { + $contributors_map[$contributor['id']]['user_id'] = $contributor['relationships']['field_contributor_user']['data']['meta']['drupal_internal__target_id']; + } + } + } + + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + $rows = []; + foreach ($contribution_records as $contribution_record) { + $source = $contribution_record['attributes']['field_source_link']['uri']; + $project = _drupalorg_get_project_from_contribution_record_source($source); + + // Many users can be credited in a contribution record. + $contributors = !empty($contribution_record['relationships']['field_contributors']['data']) ? + $contribution_record['relationships']['field_contributors']['data'] : + NULL; + if (!is_null($contributors)) { + foreach ($contributors as $contributor_paragraph) { + + if (isset($contributors_map[$contributor_paragraph['id']])) { + $user_id = $contributors_map[$contributor_paragraph['id']]['user_id']; + $rows[$user_id][] = [ + 'title' => $contribution_record['attributes']['title'], + 'url' => $contribution_records_base_url . $contribution_record['attributes']['path']['alias'], + 'source' => $source, + 'datetime' => $contribution_record['attributes']['changed'], + 'project_name' => $project ? $project->field_project_machine_name[LANGUAGE_NONE][0]['value'] : '', + 'project_link' => $project ? url('node/' . $project->nid, ['absolute' => TRUE]) : '', + ]; + } + } + } + } + + return $rows; +} + +/** + * Organize contribution records by project. + */ +function _drupalorg_contribution_records_organized_by_project($data) { + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + $rows = []; + foreach ($data as $contribution_record) { + $source = $contribution_record['attributes']['field_source_link']['uri']; + + $project = _drupalorg_get_project_from_contribution_record_source($source); + if ($project) { + if (empty($rows[$project->nid])) { + $rows[$project->nid] = [ + 'title' => $project->title, + 'url' => url('node/' . $project->nid, ['absolute' => TRUE]), + 'issues' => [], + ]; + } + + $rows[$project->nid]['issues'][] = [ + 'title' => $contribution_record['attributes']['title'], + 'url' => $contribution_records_base_url . $contribution_record['attributes']['path']['alias'], + 'source' => $source, + 'datetime' => $contribution_record['attributes']['changed'], + ]; + } + } + + return $rows; +} + +/** + * Get recent credits per organization. + */ +function drupalorg_get_recent_contribution_record_organization_credits($organization, $limit = FALSE) { + if (is_null($organization)) { + return ''; + } + + if (empty($organization->type) || $organization->type != 'organization') { + return ''; + } + + if ($limit && $limit > 50) { + $limit = 50; + } + + $cache_id = 'drupalorg_contribution_record_recent_credits_by_organization:' . md5($organization->title) . ':' . (int) $limit; + if (($cache = cache_get($cache_id))) { + return $cache->data; + } + + $months = variable_get('drupalorg_months_for_recent_organization_credits', 3); + $url = '/contribution-records-by-organization?organization=' + . urlencode($organization->title) + . '&months=' . $months; + $all_data = ($limit === FALSE); + $result = drupalorg_make_contribution_records_jsonapi_request($url, $all_data); + $markup = ''; + if (empty($result['message']) && $result['data']) { + $data = $result['data']; + $total_count = !empty($result['total']) ? $result['total'] : count($data); + if ($limit && $limit > 0) { + // jsonapi only support 50 items per page, so limit the data here. + $data = array_slice($data, 0, $limit); + } + + $rows = _drupalorg_contribution_records_organized_by_project($data); + $links = []; + foreach ($rows as $project_nid => $project) { + $links[] = l($project['title'], $project['url']) . ', ' . + l(format_plural(count($project['issues']), '1 issue', '@count issues'), 'node/' . $organization->nid . '/issue-credits/' . $project_nid); + } + + // Mirror the markup from the accordion and the old view so all styling kicks in. + $markup = '<div class="accordion"><h3 id="org-page-issue-credit">' + . format_plural($total_count, 'Credited on 1 fixed issue in the past @months months', 'Credited on @count fixed issues in the past @months months', ['@months' => $months]) + . '</h3>'; + $markup .= '<div id="org-page-issue-credit-content"><div class="view-content">'; + // theme('item_list'...) adds classes that break the styling, so build the list manually. + $markup .= !empty($links) ? '<ul><li>' . implode('</li><li>', $links) . '</li></ul>' : t('No contribution records were found.'); + $markup .= '</div><p>' . l(t('View all issue credits'), 'node/' . $organization->nid . '/issue-credits') . '</p>'; + $markup .= '</div></div>'; + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $markup, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + else { + watchdog('drupalorg', 'Could not retrieve contribution record by organization from @url. @message', [ + '@url' => $url, + '@message' => !empty($result['message']) ? $result['message'] : '' + ], WATCHDOG_ERROR); + } + + return $markup; +} + +/** + * Get credits per user. + */ +function drupalorg_get_contribution_record_user_credits($user, $limit = FALSE) { + if (is_null($user)) { + return ''; + } + + if ($limit && $limit > 50) { + $limit = 50; + } + + $cache_id = 'drupalorg_contribution_record_credits_by_user:' . md5($user->name) . ':' . (int) $limit; + if (($cache = cache_get($cache_id))) { + return $cache->data; + } + + $username = urlencode($user->name); + $url = '/contribution-records-by-user?username=' . $username; + $all_data = ($limit === FALSE); + $result = drupalorg_make_contribution_records_jsonapi_request($url, $all_data); + $markup = ''; + if (empty($result['message']) && $result['data']) { + $data = $result['data']; + $total_count = !empty($result['total']) ? $result['total'] : count($data); + if ($limit && $limit > 0) { + // jsonapi only support 50 items per page, so limit the data here. + $data = array_slice($data, 0, $limit); + } + + $rows = _drupalorg_contribution_records_organized_by_project($data); + $links = []; + foreach ($rows as $project_nid => $project) { + $links[] = l($project['title'], $project['url']) . ', ' . + l(format_plural(count($project['issues']), '1 issue', '@count issues'), 'u/' . $user->name . '/issue-credits/' . $project_nid); + } + + $markup = '<h4>' . format_plural($total_count, 'Credited on 1 fixed issue', 'Credited on @count fixed issues') . '</h4>'; + $markup .= theme('item_list', ['items' => $links]); + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $markup, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + else { + watchdog('drupalorg', 'Could not retrieve contribution record by user from @url. @message', [ + '@url' => $url, + '@message' => !empty($result['message']) ? $result['message'] : '' + ], WATCHDOG_ERROR); + } + + return $markup; +} + +/** + * Get contribution record credits table. + */ +function drupalorg_get_contribution_record_credits($path = NULL) { + drupal_add_library('system', 'drupal.collapse'); + + if (is_null($path)) { + $path = current_path(); + } + + $cache_id = 'drupalorg_contribution_record_credits:' . md5($path); + if (($cache = cache_get($cache_id))) { + return $cache->data; + } + + $full_url = _drupalorg_format_url($GLOBALS['base_url'] . '/' . $path); + $url = '/contribution-record?source_link=' . $full_url . '&format=jsonapi'; + $result = drupalorg_make_contribution_records_jsonapi_request($url, TRUE); + $markup = ''; + + if (empty($result['message']) && $result['data']) { + $data = $result['data']; + $included = !empty($result['included']) ? $result['included'] : NULL; + if ($data && $included && !empty($data['relationships']['field_contributors'])) { + $users = []; + $table_rows = []; + foreach ($data['relationships']['field_contributors']['data'] as $contributor_info) { + $id = $contributor_info['id']; + $type = $contributor_info['type']; + $contributor = $included[$type][$id]; + $credit = $contributor['attributes']['field_credit_this_contributor']; + + $user = $contributor['relationships']['field_contributor_user']; + $user = $included[$user['data']['type']][$user['data']['id']]; + $users[$user['id']] = [ + 'user' => $user['attributes']['name'], + 'credit' => $credit ? '✔' : '', + 'organizations' => [], + 'customers' => [], + ]; + + $organizations = $contributor['relationships']['field_contributor_organisation']['data']; + foreach ($organizations as $organization) { + $organization = $included[$organization['type']][$organization['id']]; + $users[$user['id']]['organizations'][$organization['id']] = $organization['attributes']['title']; + } + + $customers = $contributor['relationships']['field_contributor_customer']['data']; + foreach ($customers as $customer) { + $customer = $included[$customer['type']][$customer['id']]; + $users[$user['id']]['customers'][$customer['id']] = $customer['attributes']['title']; + } + + $table_rows[] = [ + $users[$user['id']]['credit'], + $users[$user['id']]['user'], + implode(', ', $users[$user['id']]['organizations']), + implode(', ', $users[$user['id']]['customers']), + ]; + } + + $table_element = [ + '#theme' => 'table', + '#header' => [t('Credit'), t('Username'), t('Organizations'), t('Customers')], + '#rows' => $table_rows, + '#empty' => t('No contributors were found.'), + ]; + $table_markup = drupal_render($table_element); + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + $fieldset_element = [ + '#theme' => 'fieldset', + '#title' => t('See contributions'), + '#description' => t('The following list is cached and might take up to @minutes minute(s) to udpate with the latest changes. Click the link to see real-time data.', [ + '@minutes' => $cache_minutes, + ]), + '#children' => $table_markup, + '#attributes' => ['class' => ['collapsible']], + ]; + $markup = drupal_render($fieldset_element); + + cache_set($cache_id, $markup, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + } + else { + watchdog('drupalorg', 'Could not retrieve contribution record from @url. @message', [ + '@url' => $url, + '@message' => !empty($result['message']) ? $result['message'] : '' + ], WATCHDOG_ERROR); + } + + return $markup; +} + +/** + * Generates a link to the contribution record of the given (or current) path. + */ +function drupalorg_get_link_to_contribution_record($path = NULL) { + if (is_null($path)) { + $path = current_path(); + } + + $full_url = _drupalorg_format_url($GLOBALS['base_url'] . '/' . $path); + $contribution_records_base_url = variable_get('contribution_records_base_url', 'https://www.drupal.org'); + return l( + t('Attribute this contribution'), + $contribution_records_base_url . '/contribution-record', + [ + 'query' => ['source_link' => $full_url], + 'attributes' => [ + 'class' => 'primary-button', + 'target' => '_blank' + ] + ] + ); +} + + +/** + * Get raw credit data for an organization. + */ +function drupalorg_get_contribution_record_organization_credits($organization, $months = 12) { + $credits_data = [ + 'total' => 0, + 'data' => NULL, + ]; + + $cache_id = 'drupalorg_contribution_record_year_credits_by_organization:' . md5($organization->title) . ':' . $months; + if (($cache = cache_get($cache_id))) { + $credits_data = $cache->data; + } + else { + $url = '/contribution-records-by-organization?organization=' . urlencode($organization->title) . '&months=' . $months; + $result = drupalorg_make_contribution_records_jsonapi_request($url, TRUE); + + if (empty($result['message']) && $result['data']) { + $credits_data = [ + 'data' => _drupalorg_contribution_records_organized_by_project($result['data']), + 'total' => $result['total'] + ]; + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $credits_data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + + return $credits_data; +} + +/** + * Filter credits which happened within the last $months months. + */ +function drupalorg_filter_recent_contribution_record_organization($credits_data, $months) { + $recent_threshold = strtotime($months . ' months ago'); + $recent_credits_data = [ + 'total' => 0, + 'data' => NULL, + ]; + + if (!empty($credits_data['data'])) { + foreach ($credits_data['data'] as $project => $credits) { + foreach ($credits['issues'] as $credit) { + if (strtotime($credit['datetime']) > $recent_threshold) { + if (!isset($recent_credits_data['data'][$project])) { + $recent_credits_data['data'][$project] = ['issues' => []]; + } + + $recent_credits_data['data'][$project]['issues'][] = $credit; + $recent_credits_data['total']++; + } + } + } + } + + return $recent_credits_data; +} + /** * Implements hook_preprocess_comment(). */ @@ -7177,6 +8027,17 @@ function drupalorg_preprocess_comment(&$v) { '!created_date' => format_date($v['comment']->created, 'custom', 'j F Y \a\t H:i'), )); + // Show a link to the contribution record on the very first comment. + if ( + $v['comment']->uid == $v['node']->uid && + isset($v['comment']->thread) && + $v['comment']->thread == int2vancode(1) . '/' && + isset($v['comment']->comment_body[LANGUAGE_NONE][0]) && + preg_match('|^<a.*class="username">.*</a> created an issue.( See <a.*>original summary</a>.)?$|', $v['comment']->comment_body[LANGUAGE_NONE][0]['value']) + ) { + $v['content']['comment_body'][0]['#markup'] .= '<hr>' . drupalorg_get_link_to_contribution_record(); + } + // Add extra classes. $v['classes_array'][] = 'system-message'; if (isset($v['comment']->comment_body[LANGUAGE_NONE]) && preg_match('/^The last submitted patch, .*, failed testing./', $v['comment']->comment_body[LANGUAGE_NONE][0]['value'])) { @@ -8369,8 +9230,8 @@ function drupalorg_riskcal_form($form, &$form_state) { '#required' => empty($form_state['node']), '#type' => 'select', '#options' => ['' => t('- Select -')], - ]; - } + ]; + } $form['riskcalc'][$group]['#options'][$value['key']] = $description[1]; } } diff --git a/drupalorg/drupalorg.pages.inc b/drupalorg/drupalorg.pages.inc index 6ac1b0835..b82674651 100644 --- a/drupalorg/drupalorg.pages.inc +++ b/drupalorg/drupalorg.pages.inc @@ -1341,15 +1341,7 @@ function drupalorg_org_owner_tools(stdClass $node) { ]; // Display issues fixed. - - $credit_view = views_get_view('issue_credit'); - $credit_view->set_display('organization_issue_credit_page'); - $credit_view->set_arguments([$node->nid]); - $credit_view->pre_execute(); - $credit_view->execute(); - - $year_credit_count = $credit_view->total_rows; - + $year_credit_count = !empty($node->field_org_issue_credit_year) ? $node->field_org_issue_credit_year[LANGUAGE_NONE][0]['value'] : 0; if ($year_credit_count > 0) { $content['issues_fixed'] = [ '#markup' => t('<div class="partner-tier-content"><div>' . format_plural(ceil($year_credit_count), '<strong>@count</strong> issue (closed/fixed) <br>in the last 12 months<br><strong>→ @year_issue_cred_weighted weighted credit</strong></div><div><br>You have @ninety-day-weighted-credits weighted credits over the past 90 days.<p><br>Issue credits are granted by project maintainers. Contributors should follow <a href="@con-guidelines-url">org contribution guidelines</a>, <a href="@issue-ettiquette-url">issue ettiquette</a>, and the <a href="@standards-of-conduct-url">standards of conduct for the marketplace</a>. <a href="@credit-abuse-policy">Abuse of the credit system</a> can have a negative impact.</p></div></div>', '<strong>@count</strong> issues (closed/fixed) <br>in the last 12 months <br><strong>→ @year_issue_cred_weighted weighted credits</strong></div><div><br>You have @ninety-day-weighted-credits weighted credits over the past 90 days.<p><br>Issue credits are granted by project maintainers. Contributors should follow <a href="@con-guidelines-url">org contribution guidelines</a>, <a href="@issue-ettiquette-url">issue ettiquette</a>, and the <a href="@standards-of-conduct-url">standards of conduct for the marketplace</a>. <a href="@credit-abuse-policy">Abuse of the credit system</a> can have a negative impact.</p></div></div>', [ @@ -1440,16 +1432,16 @@ function drupalorg_org_owner_tools(stdClass $node) { if ($events_sponsored_count > 0) { $events_sponsored_credits = empty($node->field_drupalorg_rank_components[LANGUAGE_NONE][10]['value']) ? 0 : $node->field_drupalorg_rank_components[LANGUAGE_NONE][10]['value']; $content['drupalorg_organization_sponsored_events'] = [ - '#markup' => '<div class="partner-tier-content"><div>' . + '#markup' => '<div class="partner-tier-content"><div>' . format_plural($events_sponsored_count, '<strong>@count </strong> sponsored Drupal event in the past year', '<strong>@count </strong> sponsored Drupal events in the past year' - ) + ) . '<br>' . t('<strong>→ @events_sponsored_credits weighted credits</strong>', [ '@events_sponsored_credits' => $events_sponsored_credits, - ]) - . '</div><div>' - . t('Sponsoring Drupal events helps keep the Drupal ecosystem healthy.') + ]) + . '</div><div>' + . t('Sponsoring Drupal events helps keep the Drupal ecosystem healthy.') . '</div></div>' ]; } @@ -1478,11 +1470,8 @@ function drupalorg_org_owner_tools(stdClass $node) { ]; } - $view = views_get_view('issue_credit'); $content['user_credit_view'] = [ - '#prefix' => '<div class="accordion"><h3 id="org-issue-page-issue-credit-user">Organization issue credits by contributor</h3>', - '#markup' => '<div>' . $view->preview('organization_user_issue_credit_page', [$node->nid]) . '</div>', - '#suffix' => '</div>', + '#markup' => '<div><a class="primary-button" href="/node/' . $node->nid . '/org-issue-credit-user">' . t('View this in a full page') . '</a></div>', ]; $content['note'] = [ @@ -1512,7 +1501,7 @@ function _drupalorg_toggle_branch_visibility($gitlab_project_id, $branch_name, $ drupal_goto(); } - // Set the visibility of the branch. + // Set the visibility of the branch. db_merge('drupalorg_issue_fork_branches') ->key([ 'gitlab_project_id' => $gitlab_project_id, @@ -1524,14 +1513,14 @@ function _drupalorg_toggle_branch_visibility($gitlab_project_id, $branch_name, $ // Create a comment in the issue to keep track of who changed it. if ($fork = entity_load_single('drupalorg_issue_fork', $gitlab_project_id)) { drupalorg_post_issue_comment_for_credit( - $fork->nid, - user_load($GLOBALS['user']->uid), + $fork->nid, + user_load($GLOBALS['user']->uid), '!name changed the visibility of the branch %branch to %status.', [ '%branch' => $branch_name, '%status' => $status, ] - ); + ); } drupal_set_message(t('Branch visibility has been toggled.')); @@ -1888,3 +1877,548 @@ function _drupalorg_keycloak_event_handle_generic($event) { 'keycloak_event_type' => $event_type, ]); } + +/** + * Menu callback. + */ +function _drupalorg_user_contribution_records_by_project($username, $project_id) { + $project = node_load($project_id); + if (!$project || !project_node_is_project($project)) { + drupal_set_message(t('Project not found.')); + return drupal_not_found(); + } + + $user = user_load_by_name($username); + if (!$user) { + drupal_set_message(t('User not found.')); + return drupal_not_found(); + } + + $data = []; + $cache_id = 'drupalorg_contribution_record_credits_by_user_organized_by_project:' . md5($user->name) . ':' . $project_id; + if (($cache = cache_get($cache_id))) { + $data = $cache->data; + } + else { + // Machine name in the endpoint is the one where the code is. + $wrapper = entity_metadata_wrapper('node', $project); + $repo = versioncontrol_project_repository_load($project->nid); + $machine_name = !empty($repo->name) ? $repo->name : $wrapper->field_project_machine_name->value(); + + $username = urlencode($username); + $url = '/contribution-records-by-user?username=' . $username . '&machine_name=' . $machine_name; + $result = drupalorg_make_contribution_records_jsonapi_request($url, TRUE); + if (empty($result['message']) && $result['data']) { + $data = _drupalorg_contribution_records_organized_by_project($result['data']); + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + + $issue_list = !empty($data[$project_id]) ? $data[$project_id]['issues'] : []; + $issue_list_links = []; + foreach ($issue_list as $issue_info) { + $issue_list_links[] = + l($issue_info['title'], $issue_info['url']) . ' ' . + t('updated @date', ['@date' => format_date(strtotime($issue_info['datetime']), 'medium')]); + } + + // Build the page. + drupal_set_title(t('@project issues credited to @user', [ + '@project' => $project->title, + '@user' => $username, + ])); + $back_link = '<p>◀︎ ' . l(t('Back to @user\'s profile', ['@user' => $username]), 'u/' . $username) . '</p>'; + // theme('item_list'...) adds classes that break the styling, so build the list manually. + $issues_markup = !empty($issue_list_links) ? '<ul><li>' . implode('</li><li>', $issue_list_links) . '</li></ul>' : t('No contribution records were found.'); + + return [ + 'back_link' => ['#markup' => $back_link], + 'content' => ['#markup' => $issues_markup], + ]; +} + +/** + * Menu callback. + */ +function _drupalorg_user_contribution_records($username) { + $user = user_load_by_name($username); + if (!$user) { + drupal_set_message(t('User not found.')); + return drupal_not_found(); + } + + $params = drupal_get_query_parameters(); + $months = !empty($params['months']) ? (int) $params['months'] : 0; + $page = !empty($params['page']) ? (int) $params['page'] : 0; + $data = []; + + $cache_id = 'drupalorg_contribution_record_credits_by_user_last_months:' . md5($user->name) . ':' . $months . ':' . $page; + if (($cache = cache_get($cache_id))) { + $data = $cache->data; + } + else { + $username = urlencode($username); + $url = '/contribution-records-by-user?username=' . $username . '&months=' . $months . '&page=' . $page; + $result = drupalorg_make_contribution_records_jsonapi_request($url); + if (empty($result['message']) && $result['data']) { + $data = [ + 'data' => _drupalorg_contribution_records_organized_by_project($result['data']), + 'total' => $result['total'] + ]; + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + if (empty($data['data'])) { + $data['data'] = []; + } + + // Build the page. + drupal_set_title(t('Issues credited to @user', [ + '@user' => $username, + ])); + $back_link = '<p>◀︎ ' . l(t('Back to @user\'s profile', ['@user' => $username]), 'u/' . $username) . '</p>'; + + $issue_counter = 0; + $issues_markup = []; + foreach ($data['data'] as $project_id => $project_contribution_records) { + $issue_list_links = []; + foreach ($project_contribution_records['issues'] as $issue_info) { + $issue_counter++; + $issue_list_links[] = + l($issue_info['title'], $issue_info['url']) . ' ' . + t('updated @date', ['@date' => format_date(strtotime($issue_info['datetime']), 'medium')]); + } + $issues_markup[$project_contribution_records['title']] = '<h3>' . l($project_contribution_records['title'], $project_contribution_records['url']) . '</h3>'; + // theme('item_list'...) adds classes that break the styling, so build the list manually. + $issues_markup[$project_contribution_records['title']] .= !empty($issue_list_links) ? '<ul><li>' . implode('</li><li>', $issue_list_links) . '</li></ul>' : ''; + } + + if (empty($issues_markup)) { + $issues_markup = t('No credited issues found'); + } + else { + ksort($issues_markup); + $issues_markup = implode(PHP_EOL, $issues_markup); + } + + $range_form = drupal_get_form('_drupalorg_date_range_options_form'); + // As we are using method='get' we don't want/need the following params to show up. + unset($range_form['form_id']); + unset($range_form['form_token']); + unset($range_form['form_build_id']); + + $page_size = variable_get('drupalorg_contribution_record_credits_page_size', 50); + $from = $page * $page_size + 1; + $to = $from + ($issue_counter - 1); + $total = !empty($data['total']) ? $data['total'] : 0; + $summary = $total ? t('<p>Displaying @from - @to of @total - sorted by last updated</p>', [ + '@total' => $total, + '@from' => $from, + '@to' => $to, + ]) : ''; + pager_default_initialize($total, $page_size); + + return [ + 'back_link' => ['#markup' => $back_link], + 'summary' => ['#markup' => $summary], + 'range_form' => $range_form, + 'content' => ['#markup' => $issues_markup], + 'pager' => ['#markup' => theme('pager')] + ]; +} + +/** + * Date range form. + */ +function _drupalorg_date_range_options_form($form, &$form_state, $hide_submit = TRUE, $inline_elements = FALSE, $months = TRUE, $username = FALSE, $machine_name = FALSE) { + $form['#method'] = 'get'; + + $params = drupal_get_query_parameters(); + if ($months) { + $form['months'] = [ + '#title' => t('Date range'), + '#type' => 'select', + '#default_value' => !empty($params['months']) ? (int) $params['months'] : 0, + '#options' => [ + 0 => t('- Any -'), + 12 => t('Past year'), + 3 => t('Past 90 days'), + 2 => t('Past 60 days'), + 1 => t('Past 30 days'), + ], + ]; + if ($hide_submit) { + $form['months']['#attributes'] = [ + 'onChange' => 'this.form.submit();', + ]; + } + } + if ($username) { + $form['username'] = [ + '#title' => t('Contributor'), + '#type' => 'textfield', + '#description' => t('Use the username'), + '#attributes' => [ + 'size' => 20, + ], + '#default_value' => !empty($params['username']) ? $params['username'] : '', + ]; + if ($hide_submit) { + $form['username']['#attributes']['onChange'] = 'this.form.submit();'; + } + } + if ($machine_name) { + $form['machine_name'] = [ + '#title' => t('Repository name'), + '#type' => 'textfield', + '#description' => t('eg: admin_toolbar'), + '#attributes' => [ + 'size' => 20, + ], + '#default_value' => !empty($params['machine_name']) ? $params['machine_name'] : '', + ]; + if ($hide_submit) { + $form['machine_name']['#attributes']['onChange'] = 'this.form.submit();'; + } + } + + $form['submit'] = [ + '#type' => 'submit', + '#value' => t('Apply'), + '#attributes' => [ + 'class' => [($hide_submit ? 'js-hide': '')], + ], + ]; + + if ($inline_elements) { + $form['#attributes'] = [ + 'class' => ['views-exposed-form', 'clearfix'], + ]; + if ($months) { + $form['months']['#prefix'] = '<div class="views-exposed-widget">'; + $form['months']['#suffix'] = '</div>'; + } + if ($username) { + $form['username']['#prefix'] = '<div class="views-exposed-widget">'; + $form['username']['#suffix'] = '</div>'; + } + if ($machine_name) { + $form['machine_name']['#prefix'] = '<div class="views-exposed-widget">'; + $form['machine_name']['#suffix'] = '</div>'; + } + $form['submit']['#prefix'] = '<div class="views-exposed-widget">'; + $form['submit']['#suffix'] = '</div>'; + } + + return $form; +} + +/** + * Menu callback. + */ +function _drupalorg_organization_contribution_records_by_project($organization, $project_id) { + $project = node_load($project_id); + if (!$project || !project_node_is_project($project)) { + drupal_set_message(t('Project not found.')); + return drupal_not_found(); + } + + $data = []; + $cache_id = 'drupalorg_contribution_record_credits_by_organization_organized_by_project:' . $organization->nid . ':' . $project_id; + if (($cache = cache_get($cache_id))) { + $data = $cache->data; + } + else { + // Machine name in the endpoint is the one where the code is. + $wrapper = entity_metadata_wrapper('node', $project); + $repo = versioncontrol_project_repository_load($project->nid); + $machine_name = !empty($repo->name) ? $repo->name : $wrapper->field_project_machine_name->value(); + + $url = '/contribution-records-by-organization?organization=' . urlencode($organization->title) . '&machine_name=' . $machine_name; + $result = drupalorg_make_contribution_records_jsonapi_request($url, TRUE); + if (empty($result['message']) && $result['data']) { + $data = _drupalorg_contribution_records_organized_by_project($result['data']); + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + + $issue_list = !empty($data[$project_id]) ? $data[$project_id]['issues'] : []; + $issue_list_links = []; + foreach ($issue_list as $issue_info) { + $issue_list_links[] = + l($issue_info['title'], $issue_info['url']) . ' ' . + t('updated @date', ['@date' => format_date(strtotime($issue_info['datetime']), 'medium')]); + } + + // Build the page. + drupal_set_title(t('@project issues credited to @organization', [ + '@project' => $project->title, + '@organization' => $organization->title, + ])); + $back_link = '<p>◀︎ ' . l(t('Back to @organization\'s profile', ['@organization' => $organization->title]), 'node/' . $organization->nid) . '</p>'; + // theme('item_list'...) adds classes that break the styling, so build the list manually. + $issues_markup = !empty($issue_list_links) ? '<ul><li>' . implode('</li><li>', $issue_list_links) . '</li></ul>' : t('No contribution records were found.'); + + return [ + 'back_link' => ['#markup' => $back_link], + 'content' => ['#markup' => $issues_markup], + ]; +} + +/** + * Menu callback. + */ +function _drupalorg_organization_contribution_records_by_user_export($organization) { + return _drupalorg_organization_contribution_records_by_user($organization, 'csv'); +} + +/** + * Menu callback. + */ +function _drupalorg_organization_contribution_records_by_user($organization, $output_as = 'page') { + if ( + empty($organization) || + !in_array($output_as, ['csv', 'page']) || + $organization->type !== 'organization' + ) { + return drupal_not_found(); + } + + $parameters = drupal_get_query_parameters(); + $parameters_md5 = !empty($parameters) ? md5(json_encode($parameters)) : 'empty'; + $query = [ + 'organization' => urlencode($organization->title), + 'username' => !empty($parameters['username']) ? $parameters['username'] : NULL, + 'machine_name' => !empty($parameters['machine_name']) ? $parameters['machine_name'] : NULL, + 'months' => !empty($parameters['months']) ? (int) $parameters['months'] : NULL, + 'page' => !empty($parameters['page']) ? (int) $parameters['page'] : 0, + ]; + + $data = []; + $cache_id = 'drupalorg_contribution_record_credits_by_organization_organized_by_users:' . $organization->nid . ':' . $parameters_md5 . ':' . $output_as; + if (($cache = cache_get($cache_id))) { + $data = $cache->data; + } + else { + $url = '/contribution-records-by-organization-by-user?' . http_build_query($query); + $result = drupalorg_make_contribution_records_jsonapi_request($url); + if (empty($result['message']) && $result['data']) { + $data = _drupalorg_contribution_records_organized_by_user($result); + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + + if ($output_as === 'csv') { + drupal_add_http_header('Content-Type', 'text/csv; utf-8'); + drupal_add_http_header('Content-Disposition', 'attachment;filename=org-credits-export.csv'); + + $output = ''; + $keys = [ + // t('Username'), + t('User link'), + t('Issue title'), + t('Issue link'), + t('Date'), + t('Project link'), + ]; + $output .= implode("\t", $keys) . "\n"; + if (!empty($data)) { + foreach ($data as $user_id => $issue_list) { + // $user = user_load($user_id); + $user_link = url('user/' . $user_id, ['absolute' => TRUE]); + foreach ($issue_list as $issue_info) { + $row = [ + // $user->name, + $user_link, + $issue_info['title'], + $issue_info['url'], + format_date(strtotime($issue_info['datetime']), 'medium'), + !empty($issue_info['project_link']) ? $issue_info['project_link'] : '', + ]; + $output .= implode("\t", $row) . "\n"; + } + } + } + ob_clean(); + print $output; + exit; + } + + $issue_counter = 0; + $issue_list_links = []; + if (!empty($data)) { + foreach ($data as $user_id => $issue_list) { + foreach ($issue_list as $issue_info) { + $issue_counter++; + $title = $issue_info['title']; + $issue_link = l($issue_info['title'], $issue_info['url']) . ' ' . t('updated @date', ['@date' => format_date(strtotime($issue_info['datetime']), 'medium')]); + if (!empty($issue_info['project_name'])) { + $project_link = !empty($issue_info['project_link']) ? l($issue_info['project_name'], $issue_info['project_link']) : $issue_info['project_name']; + $issue_link = $project_link . ': ' . $issue_link; + } + + $issue_list_links[$user_id][] = $issue_link; + } + } + } + + // Filter form. + $filter_form = drupal_get_form('_drupalorg_date_range_options_form', FALSE, TRUE, TRUE, TRUE, TRUE); + // As we are using method='get' we don't want/need the following params to show up. + unset($filter_form['form_id']); + unset($filter_form['form_token']); + unset($filter_form['form_build_id']); + + // Pagination. + $page_size = variable_get('drupalorg_contribution_record_credits_page_size', 50); + $from = $query['page'] * $page_size + 1; + $to = $from + ($issue_counter - 1); + $total = !empty($data['total']) ? $data['total'] : 0; + $summary = $total ? t('<p>Displaying @from - @to of @total - sorted by contributor and then last updated</p>', [ + '@total' => $total, + '@from' => $from, + '@to' => $to, + ]) : ''; + pager_default_initialize($total, $page_size); + + $notice = '<div>' . t('<b>Please note:</b> this view organizes the projects and issues which people have attributed to your organization for credit. You may see duplicate issues in this list when multiple people at your organization worked on the issue. Each issue is only counted once for organization credit, regardless of how many people contributed to it.') . '</div><br>'; + + $issues_markup = ''; + if (empty($issue_list_links)) { + $issues_markup = '<div>' . t('No contribution records were found.') . '</div>'; + } + else { + foreach ($issue_list_links as $user_id => $links) { + $user = user_load($user_id); + $user_link = l($user->name, 'user/' . $user->uid); + $issues_markup .= '<div class="user-credits"><h3>' . $user_link . '</h3>'; + $issues_markup .= '<ul><li>' . implode('</li><li>', $links) . '</li></ul>'; + $issues_markup .= '</div>'; + } + } + + $query = http_build_query($parameters); + $csv_button = '<div class="feed-icon"> + <a href="/node/' . $organization->nid . '/org-issue-credit-user-export?' . $query . '"> + <img src="/sites/all/modules/views_data_export/images/csv.png" alt="CSV Export" title="CSV Export"> + </a> + </div>'; + $issues_markup .= $csv_button; + + // Build the page. + drupal_set_title(t('Issues credited to @organization', [ + '@organization' => $organization->title, + ])); + if (drupalorg_organization_manage_access($organization)) { + $back_link = '<p>◀︎ ' . l(t('Back to @organization\'s owner tools', ['@organization' => $organization->title]), 'node/' . $organization->nid . '/tools') . '</p>'; + } + else { + $back_link = '<p>◀︎ ' . l(t('Back to @organization\'s profile', ['@organization' => $organization->title]), 'node/' . $organization->nid) . '</p>'; + } + return [ + 'back_link' => ['#markup' => $back_link], + 'summary' => ['#markup' => $summary], + 'notice' => ['#markup' => $notice], + 'filter_form' => $filter_form, + 'content' => ['#markup' => $issues_markup], + 'pager' => ['#markup' => theme('pager')] + ]; +} + +/** + * Menu callback. + */ +function _drupalorg_organization_contribution_records($organization) { + if ($organization->type != 'organization') { + drupal_set_message(t('Not an organization.')); + return drupal_not_found(); + } + + $params = drupal_get_query_parameters(); + $months = !empty($params['months']) ? (int) $params['months'] : 0; + $page = !empty($params['page']) ? (int) $params['page'] : 0; + $data = []; + + $cache_id = 'drupalorg_contribution_record_credits_by_organization_last_months:' . md5($organization->title) . ':' . $months . ':' . $page; + if (($cache = cache_get($cache_id))) { + $data = $cache->data; + } + else { + $url = '/contribution-records-by-organization?organization=' . urlencode($organization->title) . '&months=' . $months . '&page=' . $page; + $result = drupalorg_make_contribution_records_jsonapi_request($url); + if (empty($result['message']) && $result['data']) { + $data = [ + 'data' => _drupalorg_contribution_records_organized_by_project($result['data']), + 'total' => $result['total'] + ]; + } + + $cache_minutes = variable_get('drupalorg_contribution_record_credits_cache_minutes', 60); + cache_set($cache_id, $data, 'cache', REQUEST_TIME + $cache_minutes * 60); + } + if (empty($data['data'])) { + $data['data'] = []; + } + + // Build the page. + drupal_set_title(t('Issues credited to @organization', [ + '@organization' => $organization->title, + ])); + $back_link = '<p>◀︎ ' . l(t('Back to @organization\'s profile', ['@organization' => $organization->title]), 'node/' . $organization->nid) . '</p>'; + + $issue_counter = 0; + $issues_markup = []; + foreach ($data['data'] as $project_id => $project_contribution_records) { + $issue_list_links = []; + foreach ($project_contribution_records['issues'] as $issue_info) { + $issue_counter++; + $issue_list_links[] = + l($issue_info['title'], $issue_info['url']) . ' ' . + t('updated @date', ['@date' => format_date(strtotime($issue_info['datetime']), 'medium')]); + } + $issues_markup[$project_contribution_records['title']] = '<h3>' . l($project_contribution_records['title'], $project_contribution_records['url']) . '</h3>'; + // theme('item_list'...) adds classes that break the styling, so build the list manually. + $issues_markup[$project_contribution_records['title']] .= !empty($issue_list_links) ? '<ul><li>' . implode('</li><li>', $issue_list_links) . '</li></ul>' : ''; + } + + if (empty($issues_markup)) { + $issues_markup = t('No credited issues found'); + } + else { + ksort($issues_markup); + $issues_markup = implode(PHP_EOL, $issues_markup); + } + + $range_form = drupal_get_form('_drupalorg_date_range_options_form'); + // As we are using method='get' we don't want/need the following params to show up. + unset($range_form['form_id']); + unset($range_form['form_token']); + unset($range_form['form_build_id']); + + $page_size = variable_get('drupalorg_contribution_record_credits_page_size', 50); + $from = $page * $page_size + 1; + $to = $from + ($issue_counter - 1); + $total = !empty($data['total']) ? $data['total'] : 0; + $summary = $total ? t('<p>Displaying @from - @to of @total - sorted by last updated</p>', [ + '@total' => $total, + '@from' => $from, + '@to' => $to, + ]) : ''; + pager_default_initialize($total, $page_size); + + return [ + 'back_link' => ['#markup' => $back_link], + 'summary' => ['#markup' => $summary], + 'range_form' => $range_form, + 'content' => ['#markup' => $issues_markup], + 'pager' => ['#markup' => theme('pager')] + ]; +} diff --git a/drupalorg_metrics/drupalorg_metrics.module b/drupalorg_metrics/drupalorg_metrics.module index a9400c565..d8e1703d3 100644 --- a/drupalorg_metrics/drupalorg_metrics.module +++ b/drupalorg_metrics/drupalorg_metrics.module @@ -165,34 +165,31 @@ function drupalorg_metrics_record_stats($start_year, $end_year) { $counts['nodes'][] = [$start_js, db_query("SELECT COUNT(*) FROM {node} WHERE created >= :created1 AND created < :created2", [':created1' => $start, ':created2' => $end])->fetchField()]; $counts['users'][] = array_merge([$start_js], array_values(db_query("SELECT sum(ur.rid IS NOT NULL) confirmed, sum(ur.rid IS NULL) not_confirmed FROM {users} u LEFT JOIN {users_roles} ur ON ur.uid = u.uid AND ur.rid = :role_id WHERE status = :status AND created >= :created1 AND created < :created2", [':role_id' => variable_get('drupalorg_crosssite_trusted_role'), ':status' => 1, ':created1' => $start, ':created2' => $end])->fetchAssoc())); $counts['comments'][] = [$start_js, db_query("SELECT COUNT(*) FROM {comment} WHERE status = :status AND created >= :timestamp1 AND created < :timestamp2", [':status' => COMMENT_PUBLISHED, ':timestamp1' => $start, ':timestamp2' => $end])->fetchField()]; - $counts['credited'][] = array_merge([$start_js], array_values(db_query("SELECT sum(q.as_volunteer AND q.for_organizations), sum(q.as_volunteer AND NOT q.for_organizations), sum(q.for_organizations AND NOT q.as_volunteer), sum(NOT q.as_volunteer AND NOT q.for_organizations) FROM (SELECT c.uid, coalesce(sum(fdf_aav.field_attribute_as_volunteer_value = 1) > 0, 0) as_volunteer, coalesce(sum(fdf_aav.field_attribute_as_volunteer_value = 0) > 0, 0) for_organizations FROM {search_api_db_project_issues} pi INNER JOIN {field_data_field_issue_credit} fdf_ic ON fdf_ic.entity_id = pi.item_id INNER JOIN {comment} c ON c.cid = fdf_ic.field_issue_credit_target_id AND c.status = :comment_published LEFT JOIN {field_data_field_attribute_as_volunteer} fdf_aav ON fdf_aav.entity_id = c.cid WHERE pi.field_issue_status IN (:fixed_statuses) AND pi.field_issue_last_status_change >= :start AND pi.field_issue_last_status_change < :end GROUP BY c.uid ORDER BY NULL) q", [ - ':comment_published' => COMMENT_PUBLISHED, - ':fixed_statuses' => drupalorg_credited_issue_statuses(), - ':start' => $start, - ':end' => $end, - ])->fetchAssoc())); + $monthly_numbers = _drupalorg_metrics_contribution_records_get_monthly_numbers('credits', $year, $month, ['volunteer|organization', 'volunteer|no_organization', 'no_volunteer|organization', 'no_volunteer|no_organization']); + $counts['credited'][] = [ + $start_js, + $monthly_numbers['volunteer|organization'], + $monthly_numbers['volunteer|no_organization'], + $monthly_numbers['no_volunteer|organization'], + $monthly_numbers['no_volunteer|no_organization'], + ]; // To preserve anonymity, do not show demographics data before issue - // credits have significant data, add some random noise, and round to the - // nearest multiple of 10. + // credits have significant data. if (($year == 2015 && $month >= 4) || $year > 2015) { - $counts['credited-demographics'][] = array_merge([$start_js], array_values(db_query("SELECT coalesce(round(sum(q.underrepresented AND NOT (q.prefer_not OR q.none))/10+rand()-0.5)*10, 0) underrepresented, coalesce(round(sum(q.none AND NOT q.prefer_not)/10+rand()-0.5)*10, 0) none, coalesce(round(sum(q.prefer_not)/10+rand()-0.5)*10, 0) prefer_not, coalesce(round(sum(NOT q.prefer_not AND NOT q.none AND NOT q.underrepresented)/10+rand()-0.5)*10, 0) not_reported FROM (SELECT c.uid, coalesce(sum(fdf_d.field_demographics_value = 'prefer not to answer') > 0, 0) prefer_not, coalesce(sum(fdf_d.field_demographics_value = 'none') > 0, 0) none, coalesce(sum(fdf_d.field_demographics_value NOT IN ('prefer not to answer', 'none')) > 0, 0) underrepresented FROM search_api_db_project_issues pi INNER JOIN field_data_field_issue_credit fdf_ic ON fdf_ic.entity_id = pi.item_id INNER JOIN comment c ON c.cid = fdf_ic.field_issue_credit_target_id AND c.status = :comment_published LEFT JOIN field_data_field_demographics fdf_d ON fdf_d.entity_id = c.uid WHERE pi.field_issue_status IN (:fixed_statuses) AND pi.field_issue_last_status_change >= :start AND pi.field_issue_last_status_change < :end GROUP BY c.uid ORDER BY NULL) q", [ - ':comment_published' => COMMENT_PUBLISHED, - ':fixed_statuses' => drupalorg_credited_issue_statuses(), - ':start' => $start, - ':end' => $end, - ])->fetchAssoc())); + $monthly_numbers = _drupalorg_metrics_contribution_records_get_monthly_numbers('demographics', $year, $month, ['underrepresented', 'none', 'prefer_not', 'not_reported']); + $counts['credited-demographics'][] = [ + $start_js, + $monthly_numbers['underrepresented'], + $monthly_numbers['none'], + $monthly_numbers['prefer_not'], + $monthly_numbers['not_reported'], + ]; } else { $counts['credited-demographics'][] = [$start_js, 0, 0, 0, 0]; } // By region. - $query = db_query('SELECT fdf_c.field_country_value country, count(DISTINCT c.uid) count FROM {search_api_db_project_issues} pi INNER JOIN {field_data_field_issue_credit} fdf_ic ON fdf_ic.entity_id = pi.item_id INNER JOIN {comment} c ON c.cid = fdf_ic.field_issue_credit_target_id AND c.status = :comment_published LEFT JOIN {field_data_field_country} fdf_c ON fdf_c.entity_id = c.uid WHERE pi.field_issue_status IN (:fixed_statuses) AND pi.field_issue_last_status_change >= :start AND pi.field_issue_last_status_change < :end GROUP BY fdf_c.field_country_value ORDER BY NULL', [ - ':comment_published' => COMMENT_PUBLISHED, - ':fixed_statuses' => drupalorg_credited_issue_statuses(), - ':start' => $start, - ':end' => $end, - ]); $by_continent = [ 'Europe' => 0, 'Northern America' => 0, @@ -202,22 +199,40 @@ function drupalorg_metrics_record_stats($start_year, $end_year) { 'Africa' => 0, 'na' => 0, ]; - foreach ($query as $row) { - $region = drupalorg_map_country_to_region($row->country); - $by_continent[isset($region_to_continent[$region]) ? $region_to_continent[$region] : 'na'] += $row->count; + $monthly_numbers = _drupalorg_metrics_contribution_records_get_monthly_numbers('region', $year, $month); + if (!empty($monthly_numbers)) { + foreach ($monthly_numbers as $country => $count) { + $region = drupalorg_map_country_to_region($country); + $by_continent[isset($region_to_continent[$region]) ? $region_to_continent[$region] : 'na'] += $count; + } } $counts['credited-region'][] = array_merge([$start_js], array_values($by_continent)); // By account age. - $result = db_query('SELECT greatest(0, timestampdiff(YEAR, from_unixtime(u.created), from_unixtime(:end))) years_ago, count(DISTINCT c.uid) count FROM {search_api_db_project_issues} pi INNER JOIN {field_data_field_issue_credit} fdf_ic ON fdf_ic.entity_id = pi.item_id INNER JOIN {comment} c ON c.cid = fdf_ic.field_issue_credit_target_id AND c.status = :comment_published INNER JOIN {users} u ON u.uid = c.uid WHERE pi.field_issue_status IN (:fixed_statuses) AND pi.field_issue_last_status_change >= :start AND pi.field_issue_last_status_change < :end GROUP BY years_ago ORDER BY NULL', [ - ':comment_published' => COMMENT_PUBLISHED, - ':fixed_statuses' => drupalorg_credited_issue_statuses(), - ':start' => $start, - ':end' => $end, - ])->fetchAllKeyed() + $counts['#account_ages']; - ksort($result, SORT_NUMERIC); - $counts['credited-account-age'][] = array_merge([$start_js], $result); + $monthly_numbers = _drupalorg_metrics_contribution_records_get_monthly_numbers('account_age', $year, $month); + $monthly_numbers += $counts['#account_ages']; + ksort($monthly_numbers, SORT_NUMERIC); + $counts['credited-account-age'][] = array_merge([$start_js], $monthly_numbers); } } cache_set('drupalorg_metrics_counts', $counts, 'drupalorg'); } + +/** + * Get monthly numbers with prefilled information when no data is present. + */ +function _drupalorg_metrics_contribution_records_get_monthly_numbers($display, $year, $month, array $keys = []) { + $monthly_numbers = []; + foreach ($keys as $key) { + $monthly_numbers[$key] = 0; + } + + $monthly_credit_stats = drupalorg_contribution_records_api_request('/contribution-records-metrics?display=' . $display . '&year=' . $year . '&month=' . $month, 'data'); + if (!empty($monthly_credit_stats)) { + $key = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT); + $monthly_credit_stats[$key] += $monthly_numbers; + $monthly_numbers = $monthly_credit_stats[$key]; + } + + return $monthly_numbers; +} diff --git a/drupalorg_project/drupalorg_project.module b/drupalorg_project/drupalorg_project.module index 063b3cc28..3c33bb130 100644 --- a/drupalorg_project/drupalorg_project.module +++ b/drupalorg_project/drupalorg_project.module @@ -667,6 +667,20 @@ function drupalorg_project_form_node_form_alter(&$form, &$form_state) { ]; } } + + // Hide blocks in favour of the new contribution records system. + if (!empty($form['nodechanges_comment']['field_attribute_as_volunteer'])) { + $form['nodechanges_comment']['field_attribute_as_volunteer']['#access'] = FALSE; + } + if (!empty($form['drupalorg_credit_wrapper'])) { + $form['drupalorg_credit_wrapper']['#access'] = FALSE; + + // Remove submit handler. + $pos = array_search('drupalorg_project_issue_credit_submit', $form['actions']['submit']['#submit']); + if ($pos !== FALSE) { + unset($form['actions']['submit']['#submit'][$pos]); + } + } } elseif (project_release_node_is_release($form_state['node'])) { // See if this is a release for a translation project, and if so, deny. diff --git a/features/drupalorg_user/drupalorg_user.views_default.inc b/features/drupalorg_user/drupalorg_user.views_default.inc index 947f5bc04..3b4ff696f 100644 --- a/features/drupalorg_user/drupalorg_user.views_default.inc +++ b/features/drupalorg_user/drupalorg_user.views_default.inc @@ -459,8 +459,8 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['field_issue_status_value_1']['operator'] = 'empty'; $handler->display->display_options['filters']['field_issue_status_value_1']['group'] = 2; - /* Display: User recent */ - $handler = $view->new_display('block', 'User recent', 'user_recent'); + /* Display: Organization Sec Adv recent */ + $handler = $view->new_display('block', 'Organization Sec Adv recent', 'org_sa_recent'); $handler->display->display_options['defaults']['pager'] = FALSE; $handler->display->display_options['pager']['type'] = 'none'; $handler->display->display_options['pager']['options']['offset'] = '0'; @@ -473,7 +473,6 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['defaults']['row_plugin'] = FALSE; $handler->display->display_options['row_plugin'] = 'fields'; $handler->display->display_options['row_options']['inline'] = array( - 'title_1' => 'title_1', 'drupalorg_project_subtitle' => 'drupalorg_project_subtitle', 'nid' => 'nid', ); @@ -483,7 +482,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['footer']['area']['id'] = 'area'; $handler->display->display_options['footer']['area']['table'] = 'views'; $handler->display->display_options['footer']['area']['field'] = 'area'; - $handler->display->display_options['footer']['area']['content'] = '<a href="/u/%1/issue-credits">View all issue credits</a>'; + $handler->display->display_options['footer']['area']['content'] = '<a href="/node/%organization-nid/sa">View all security advisory credits</a>'; $handler->display->display_options['footer']['area']['format'] = '1'; $handler->display->display_options['footer']['area']['tokenize'] = TRUE; $handler->display->display_options['defaults']['fields'] = FALSE; @@ -522,147 +521,18 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['fields']['nid']['field'] = 'nid'; $handler->display->display_options['fields']['nid']['group_type'] = 'count_distinct'; $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['nid']['alter']['path'] = 'u/%1/issue-credits/[nid_1]'; + $handler->display->display_options['fields']['nid']['alter']['path'] = 'node/%organization-nid/sa/[nid_1]'; $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['nid']['separator'] = ''; $handler->display->display_options['fields']['nid']['format_plural'] = TRUE; - $handler->display->display_options['fields']['nid']['format_plural_singular'] = '1 issue'; - $handler->display->display_options['fields']['nid']['format_plural_plural'] = '@count issues'; + $handler->display->display_options['fields']['nid']['format_plural_singular'] = '1 advisory'; + $handler->display->display_options['fields']['nid']['format_plural_plural'] = '@count advisories'; $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Comment: Author uid */ - $handler->display->display_options['arguments']['uid']['id'] = 'uid'; - $handler->display->display_options['arguments']['uid']['table'] = 'comment'; - $handler->display->display_options['arguments']['uid']['field'] = 'uid'; - $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - - /* Display: User recent page */ - $handler = $view->new_display('page', 'User recent page', 'user_recent_page'); - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'title' => 'title', - 'changed' => 'changed', + $handler->display->display_options['filter_groups']['groups'] = array( + 1 => 'AND', + 2 => 'OR', ); - $handler->display->display_options['row_options']['separator'] = 'updated'; - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['header'] = FALSE; - /* Header: Global: Text area */ - $handler->display->display_options['header']['area']['id'] = 'area'; - $handler->display->display_options['header']['area']['table'] = 'views'; - $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['content'] = '◀︎ [uid]'; - $handler->display->display_options['header']['area']['format'] = '1'; - $handler->display->display_options['header']['area']['tokenize'] = TRUE; - $handler->display->display_options['defaults']['relationships'] = FALSE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['label'] = ''; - $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - $handler->display->display_options['fields']['changed']['label'] = ''; - $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; - $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - /* Field: Comment: Author uid */ - $handler->display->display_options['fields']['uid']['id'] = 'uid'; - $handler->display->display_options['fields']['uid']['table'] = 'comment'; - $handler->display->display_options['fields']['uid']['field'] = 'uid'; - $handler->display->display_options['fields']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['fields']['uid']['label'] = ''; - $handler->display->display_options['fields']['uid']['exclude'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['text'] = 'Back to %1’s profile'; - $handler->display->display_options['fields']['uid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['path'] = 'user/[uid]'; - $handler->display->display_options['fields']['uid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['uid']['link_to_user'] = FALSE; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Comment: Author uid */ - $handler->display->display_options['arguments']['uid']['id'] = 'uid'; - $handler->display->display_options['arguments']['uid']['table'] = 'comment'; - $handler->display->display_options['arguments']['uid']['field'] = 'uid'; - $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['uid']['exception']['value'] = ''; - $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; - $handler->display->display_options['arguments']['uid']['validate_options']['type'] = 'name'; - /* Contextual filter: Field: Project (field_project) */ - $handler->display->display_options['arguments']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['arguments']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['arguments']['field_project_target_id']['field'] = 'field_project_target_id'; - $handler->display->display_options['arguments']['field_project_target_id']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['field_project_target_id']['title_enable'] = TRUE; - $handler->display->display_options['arguments']['field_project_target_id']['title'] = '%2 issues credited to %1'; - $handler->display->display_options['arguments']['field_project_target_id']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['field_project_target_id']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['field_project_target_id']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['field_project_target_id']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['field_project_target_id']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['field_project_target_id']['validate']['type'] = 'project_nid'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; $handler->display->display_options['defaults']['filters'] = FALSE; /* Filter criterion: Content: Published */ $handler->display->display_options['filters']['status']['id'] = 'status'; @@ -676,7 +546,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', + 'sa' => 'sa', ); $handler->display->display_options['filters']['type']['group'] = 1; /* Filter criterion: Comment: Approved */ @@ -686,25 +556,78 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; $handler->display->display_options['filters']['status_1']['value'] = '1'; $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', + /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( + 0 => '0', ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - $handler->display->display_options['path'] = 'u/%/issue-credits/%'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; + /* Filter criterion: Content: Project type (field_project_type) */ + $handler->display->display_options['filters']['field_project_type_value']['id'] = 'field_project_type_value'; + $handler->display->display_options['filters']['field_project_type_value']['table'] = 'field_data_field_project_type'; + $handler->display->display_options['filters']['field_project_type_value']['field'] = 'field_project_type_value'; + $handler->display->display_options['filters']['field_project_type_value']['relationship'] = 'field_project_target_id'; + $handler->display->display_options['filters']['field_project_type_value']['value'] = array( + 'full' => 'full', + ); + $handler->display->display_options['filters']['field_project_type_value']['group'] = 1; + /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; + /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ + $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; + $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; + $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator_id'] = 'field_for_customer_target_id_op'; + $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['label'] = 'Attribute comment for customer (field_for_customer)'; + $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator'] = 'field_for_customer_target_id_op'; + $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['identifier'] = 'field_for_customer_target_id'; + /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ + $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['operator'] = '>='; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['value'] = '-12 months'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['type'] = 'offset'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['group'] = 1; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; + $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; + $handler->display->display_options['block_description'] = 'Org SA recent'; - /* Display: User issue credit page */ - $handler = $view->new_display('page', 'User issue credit page', 'page_1'); + /* Display: Organization sa credit page */ + $handler = $view->new_display('page', 'Organization sa credit page', 'org_sa_credit_page'); + $handler->display->display_options['defaults']['title'] = FALSE; + $handler->display->display_options['title'] = 'Security advisories credited to %1'; + $handler->display->display_options['defaults']['cache'] = FALSE; + $handler->display->display_options['cache']['type'] = 'time'; + $handler->display->display_options['cache']['results_lifespan'] = '3600'; + $handler->display->display_options['cache']['results_lifespan_custom'] = '0'; + $handler->display->display_options['cache']['output_lifespan'] = '3600'; + $handler->display->display_options['cache']['output_lifespan_custom'] = '0'; + $handler->display->display_options['defaults']['exposed_form'] = FALSE; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['defaults']['pager'] = FALSE; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '100'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; $handler->display->display_options['defaults']['style_plugin'] = FALSE; $handler->display->display_options['style_plugin'] = 'list'; $handler->display->display_options['style_options']['grouping'] = array( 0 => array( 'field' => 'field_project_machine_name', - 'rendered' => 0, + 'rendered' => 1, 'rendered_strip' => 0, ), ); @@ -725,23 +648,10 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['header']['area']['id'] = 'area'; $handler->display->display_options['header']['area']['table'] = 'views'; $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['content'] = '◀︎ [uid]'; + $handler->display->display_options['header']['area']['empty'] = TRUE; + $handler->display->display_options['header']['area']['content'] = '◀︎ <a href="!url-1">Back to %1</a>'; $handler->display->display_options['header']['area']['format'] = '1'; $handler->display->display_options['header']['area']['tokenize'] = TRUE; - /* Header: Global: Result summary */ - $handler->display->display_options['header']['result']['id'] = 'result'; - $handler->display->display_options['header']['result']['table'] = 'views'; - $handler->display->display_options['header']['result']['field'] = 'result'; - $handler->display->display_options['defaults']['relationships'] = FALSE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['relationships']['field_project_target_id']['field'] = 'field_project_target_id'; $handler->display->display_options['defaults']['fields'] = FALSE; /* Field: Content: Title */ $handler->display->display_options['fields']['title']['id'] = 'title'; @@ -757,19 +667,6 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - /* Field: Comment: Author uid */ - $handler->display->display_options['fields']['uid']['id'] = 'uid'; - $handler->display->display_options['fields']['uid']['table'] = 'comment'; - $handler->display->display_options['fields']['uid']['field'] = 'uid'; - $handler->display->display_options['fields']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['fields']['uid']['label'] = ''; - $handler->display->display_options['fields']['uid']['exclude'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['text'] = 'Back to %1’s profile'; - $handler->display->display_options['fields']['uid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['path'] = 'user/[uid]'; - $handler->display->display_options['fields']['uid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['uid']['link_to_user'] = FALSE; /* Field: Content: Nid */ $handler->display->display_options['fields']['nid']['id'] = 'nid'; $handler->display->display_options['fields']['nid']['table'] = 'node'; @@ -800,6 +697,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = ' [drupalorg_project_subtitle]'; $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['field_project_machine_name']['group_column'] = 'entity_id'; $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( 'value' => 'value', ); @@ -816,26 +714,25 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Comment: Author uid */ - $handler->display->display_options['arguments']['uid']['id'] = 'uid'; - $handler->display->display_options['arguments']['uid']['table'] = 'comment'; - $handler->display->display_options['arguments']['uid']['field'] = 'uid'; - $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['uid']['exception']['value'] = ''; - $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; - $handler->display->display_options['arguments']['uid']['validate_options']['type'] = 'name'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; + /* Contextual filter: Global: Null */ + $handler->display->display_options['arguments']['null']['id'] = 'null'; + $handler->display->display_options['arguments']['null']['table'] = 'views'; + $handler->display->display_options['arguments']['null']['field'] = 'null'; + $handler->display->display_options['arguments']['null']['default_action'] = 'not found'; + $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['null']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['null']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['defaults']['filter_groups'] = FALSE; + $handler->display->display_options['filter_groups']['groups'] = array( + 1 => 'AND', + 2 => 'OR', + ); + $handler->display->display_options['defaults']['filters'] = FALSE; + /* Filter criterion: Content: Published */ + $handler->display->display_options['filters']['status']['id'] = 'status'; + $handler->display->display_options['filters']['status']['table'] = 'node'; + $handler->display->display_options['filters']['status']['field'] = 'status'; $handler->display->display_options['filters']['status']['value'] = 1; $handler->display->display_options['filters']['status']['group'] = 1; $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; @@ -844,7 +741,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', + 'sa' => 'sa', ); $handler->display->display_options['filters']['type']['group'] = 1; /* Filter criterion: Comment: Approved */ @@ -854,74 +751,33 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; $handler->display->display_options['filters']['status_1']['value'] = '1'; $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group'] = 1; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['exposed'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['is_grouped'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['label'] = 'Date range'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['group_items'] = array( - 1 => array( - 'title' => 'Past 12 months', - 'operator' => '>=', - 'value' => array( - 'type' => 'offset', - 'value' => '-1 year', - 'min' => '', - 'max' => '', - ), - ), - 2 => array( - 'title' => 'Past 90 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'offset', - 'value' => '-90 days', - 'min' => '', - 'max' => '', - ), - ), - 3 => array( - 'title' => 'Past 60 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'offset', - 'value' => '-60 days', - 'min' => '', - 'max' => '', - ), - ), - 4 => array( - 'title' => 'Past 30 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'offset', - 'value' => '-30 days', - 'min' => '', - 'max' => '', - ), - ), - ); - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', + /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( + 0 => '0', ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - $handler->display->display_options['path'] = 'u/%/issue-credits'; + $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; + /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; + $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; + /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ + $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; + $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; + $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; + $handler->display->display_options['path'] = 'node/%/sa'; - /* Display: Organization recent */ - $handler = $view->new_display('block', 'Organization recent', 'organization_recent'); + /* Display: User SA */ + $handler = $view->new_display('block', 'User SA', 'user_sa_recent'); $handler->display->display_options['defaults']['pager'] = FALSE; $handler->display->display_options['pager']['type'] = 'none'; $handler->display->display_options['pager']['options']['offset'] = '0'; @@ -934,18 +790,12 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['defaults']['row_plugin'] = FALSE; $handler->display->display_options['row_plugin'] = 'fields'; $handler->display->display_options['row_options']['inline'] = array( + 'title_1' => 'title_1', 'drupalorg_project_subtitle' => 'drupalorg_project_subtitle', 'nid' => 'nid', ); $handler->display->display_options['defaults']['row_options'] = FALSE; $handler->display->display_options['defaults']['footer'] = FALSE; - /* Footer: Global: Text area */ - $handler->display->display_options['footer']['area']['id'] = 'area'; - $handler->display->display_options['footer']['area']['table'] = 'views'; - $handler->display->display_options['footer']['area']['field'] = 'area'; - $handler->display->display_options['footer']['area']['content'] = '<a href="/node/%organization-nid/issue-credits">View all issue credits</a>'; - $handler->display->display_options['footer']['area']['format'] = '1'; - $handler->display->display_options['footer']['area']['tokenize'] = TRUE; $handler->display->display_options['defaults']['fields'] = FALSE; /* Field: Content: Nid */ $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1'; @@ -983,18 +833,26 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['fields']['nid']['group_type'] = 'count_distinct'; $handler->display->display_options['fields']['nid']['label'] = ''; $handler->display->display_options['fields']['nid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['nid']['alter']['path'] = 'node/%organization-nid/issue-credits/[nid_1]'; + $handler->display->display_options['fields']['nid']['alter']['path'] = 'u/%1/sa-credits'; $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['nid']['separator'] = ''; $handler->display->display_options['fields']['nid']['format_plural'] = TRUE; $handler->display->display_options['fields']['nid']['format_plural_singular'] = '1 issue'; $handler->display->display_options['fields']['nid']['format_plural_plural'] = '@count issues'; $handler->display->display_options['defaults']['arguments'] = FALSE; + /* Contextual filter: Comment: Author uid */ + $handler->display->display_options['arguments']['uid']['id'] = 'uid'; + $handler->display->display_options['arguments']['uid']['table'] = 'comment'; + $handler->display->display_options['arguments']['uid']['field'] = 'uid'; + $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; + $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; + $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); $handler->display->display_options['defaults']['filters'] = FALSE; /* Filter criterion: Content: Published */ $handler->display->display_options['filters']['status']['id'] = 'status'; @@ -1008,7 +866,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', + 'sa' => 'sa', ); $handler->display->display_options['filters']['type']['group'] = 1; /* Filter criterion: Comment: Approved */ @@ -1018,78 +876,15 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; $handler->display->display_options['filters']['status_1']['value'] = '1'; $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Content: Project type (field_project_type) */ - $handler->display->display_options['filters']['field_project_type_value']['id'] = 'field_project_type_value'; - $handler->display->display_options['filters']['field_project_type_value']['table'] = 'field_data_field_project_type'; - $handler->display->display_options['filters']['field_project_type_value']['field'] = 'field_project_type_value'; - $handler->display->display_options['filters']['field_project_type_value']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['filters']['field_project_type_value']['value'] = array( - 'full' => 'full', - ); - $handler->display->display_options['filters']['field_project_type_value']['group'] = 1; - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['operator'] = '>='; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['value'] = '-3 months'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['type'] = 'offset'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group'] = 1; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator_id'] = 'field_for_customer_target_id_op'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['label'] = 'Attribute comment for customer (field_for_customer)'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator'] = 'field_for_customer_target_id_op'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['identifier'] = 'field_for_customer_target_id'; - /* Display: Organization recent page */ - $handler = $view->new_display('page', 'Organization recent page', 'organization_recent_page'); - $handler->display->display_options['defaults']['cache'] = FALSE; - $handler->display->display_options['cache']['type'] = 'time'; - $handler->display->display_options['cache']['results_lifespan'] = '21600'; - $handler->display->display_options['cache']['results_lifespan_custom'] = '0'; - $handler->display->display_options['cache']['output_lifespan'] = '21600'; - $handler->display->display_options['cache']['output_lifespan_custom'] = '0'; - $handler->display->display_options['defaults']['exposed_form'] = FALSE; - $handler->display->display_options['exposed_form']['type'] = 'basic'; + /* Display: User SA credit page */ + $handler = $view->new_display('page', 'User SA credit page', 'page_2'); $handler->display->display_options['defaults']['style_plugin'] = FALSE; $handler->display->display_options['style_plugin'] = 'list'; $handler->display->display_options['style_options']['grouping'] = array( 0 => array( - 'field' => 'type', - 'rendered' => 1, + 'field' => 'field_project_machine_name', + 'rendered' => 0, 'rendered_strip' => 0, ), ); @@ -1110,9 +905,23 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['header']['area']['id'] = 'area'; $handler->display->display_options['header']['area']['table'] = 'views'; $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['content'] = '◀︎ <a href="!url-1">Back to %1</a>'; + $handler->display->display_options['header']['area']['content'] = '◀︎ [uid]'; $handler->display->display_options['header']['area']['format'] = '1'; $handler->display->display_options['header']['area']['tokenize'] = TRUE; + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + $handler->display->display_options['defaults']['relationships'] = FALSE; + /* Relationship: Entity Reference: Referenced Entity */ + $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; + $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; + $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; + $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; + /* Relationship: Entity Reference: Referenced Entity */ + $handler->display->display_options['relationships']['field_project_target_id']['id'] = 'field_project_target_id'; + $handler->display->display_options['relationships']['field_project_target_id']['table'] = 'field_data_field_project'; + $handler->display->display_options['relationships']['field_project_target_id']['field'] = 'field_project_target_id'; $handler->display->display_options['defaults']['fields'] = FALSE; /* Field: Content: Title */ $handler->display->display_options['fields']['title']['id'] = 'title'; @@ -1128,1409 +937,80 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; + /* Field: Comment: Author uid */ + $handler->display->display_options['fields']['uid']['id'] = 'uid'; + $handler->display->display_options['fields']['uid']['table'] = 'comment'; + $handler->display->display_options['fields']['uid']['field'] = 'uid'; + $handler->display->display_options['fields']['uid']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['fields']['uid']['label'] = ''; + $handler->display->display_options['fields']['uid']['exclude'] = TRUE; + $handler->display->display_options['fields']['uid']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['uid']['alter']['text'] = 'Back to %1’s profile'; + $handler->display->display_options['fields']['uid']['alter']['make_link'] = TRUE; + $handler->display->display_options['fields']['uid']['alter']['path'] = 'user/[uid]'; + $handler->display->display_options['fields']['uid']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['uid']['link_to_user'] = FALSE; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; + $handler->display->display_options['fields']['nid']['label'] = ''; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; + /* Field: Content: Project subtitle */ + $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['exclude'] = TRUE; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '<small>[drupalorg_project_subtitle]</small>'; + $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; + /* Field: Content: Short name */ + $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; + $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; + $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; + $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; + $handler->display->display_options['fields']['field_project_machine_name']['label'] = ''; + $handler->display->display_options['fields']['field_project_machine_name']['exclude'] = TRUE; + $handler->display->display_options['fields']['field_project_machine_name']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['field_project_machine_name']['alter']['make_link'] = TRUE; + $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; + $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = ' [drupalorg_project_subtitle]'; + $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( + 'value' => 'value', + ); + $handler->display->display_options['defaults']['sorts'] = FALSE; + /* Sort criterion: Content: Short name (field_project_machine_name) */ + $handler->display->display_options['sorts']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; + $handler->display->display_options['sorts']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; + $handler->display->display_options['sorts']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; + $handler->display->display_options['sorts']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; + /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ + $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; + $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; + $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; + $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; + $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Global: Null */ - $handler->display->display_options['arguments']['null']['id'] = 'null'; - $handler->display->display_options['arguments']['null']['table'] = 'views'; - $handler->display->display_options['arguments']['null']['field'] = 'null'; - $handler->display->display_options['arguments']['null']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['null']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['null']['summary_options']['items_per_page'] = '25'; - /* Contextual filter: Field: Project (field_project) */ - $handler->display->display_options['arguments']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['arguments']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['arguments']['field_project_target_id']['field'] = 'field_project_target_id'; - $handler->display->display_options['arguments']['field_project_target_id']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['field_project_target_id']['exception']['value'] = ''; - $handler->display->display_options['arguments']['field_project_target_id']['title_enable'] = TRUE; - $handler->display->display_options['arguments']['field_project_target_id']['title'] = '%2 issues credited to %1'; - $handler->display->display_options['arguments']['field_project_target_id']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['field_project_target_id']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['field_project_target_id']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['field_project_target_id']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['field_project_target_id']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['field_project_target_id']['validate']['type'] = 'project_nid'; + /* Contextual filter: Comment: Author uid */ + $handler->display->display_options['arguments']['uid']['id'] = 'uid'; + $handler->display->display_options['arguments']['uid']['table'] = 'comment'; + $handler->display->display_options['arguments']['uid']['field'] = 'uid'; + $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; + $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; + $handler->display->display_options['arguments']['uid']['exception']['value'] = ''; + $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; + $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; + $handler->display->display_options['arguments']['uid']['validate_options']['type'] = 'name'; $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - $handler->display->display_options['path'] = 'node/%/issue-credits/%'; - - /* Display: Organization issue credit page */ - $handler = $view->new_display('page', 'Organization issue credit page', 'organization_issue_credit_page'); - $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['title'] = 'Issues credited to %1'; - $handler->display->display_options['defaults']['cache'] = FALSE; - $handler->display->display_options['cache']['type'] = 'time'; - $handler->display->display_options['cache']['results_lifespan'] = '21600'; - $handler->display->display_options['cache']['results_lifespan_custom'] = '0'; - $handler->display->display_options['cache']['output_lifespan'] = '21600'; - $handler->display->display_options['cache']['output_lifespan_custom'] = '0'; - $handler->display->display_options['defaults']['exposed_form'] = FALSE; - $handler->display->display_options['exposed_form']['type'] = 'basic'; - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'full'; - $handler->display->display_options['pager']['options']['items_per_page'] = '100'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['pager']['options']['id'] = '0'; - $handler->display->display_options['pager']['options']['quantity'] = '9'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['grouping'] = array( - 0 => array( - 'field' => 'field_project_machine_name', - 'rendered' => 1, - 'rendered_strip' => 0, - ), - ); - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'title' => 'title', - 'changed' => 'changed', - ); - $handler->display->display_options['row_options']['separator'] = 'updated'; - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['header'] = FALSE; - /* Header: Global: Text area */ - $handler->display->display_options['header']['area']['id'] = 'area'; - $handler->display->display_options['header']['area']['table'] = 'views'; - $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['empty'] = TRUE; - $handler->display->display_options['header']['area']['content'] = '◀︎ <a href="!url-1">Back to %1</a>'; - $handler->display->display_options['header']['area']['format'] = '1'; - $handler->display->display_options['header']['area']['tokenize'] = TRUE; - /* Header: Global: Result summary */ - $handler->display->display_options['header']['result']['id'] = 'result'; - $handler->display->display_options['header']['result']['table'] = 'views'; - $handler->display->display_options['header']['result']['field'] = 'result'; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['label'] = ''; - $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - $handler->display->display_options['fields']['changed']['label'] = ''; - $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; - $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['exclude'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '<small>[drupalorg_project_subtitle]</small>'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - /* Field: Content: Short name */ - $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['field_project_machine_name']['label'] = ''; - $handler->display->display_options['fields']['field_project_machine_name']['exclude'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = ' [drupalorg_project_subtitle]'; - $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['field_project_machine_name']['group_column'] = 'entity_id'; - $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( - 'value' => 'value', - ); - $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Sort criterion: Content: Short name (field_project_machine_name) */ - $handler->display->display_options['sorts']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; - /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Global: Null */ - $handler->display->display_options['arguments']['null']['id'] = 'null'; - $handler->display->display_options['arguments']['null']['table'] = 'views'; - $handler->display->display_options['arguments']['null']['field'] = 'null'; - $handler->display->display_options['arguments']['null']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['null']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['null']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['exposed'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['is_grouped'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['label'] = 'Date range'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['default_group'] = '1'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['group_items'] = array( - 1 => array( - 'title' => 'Past year', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-1 year', - 'min' => '', - 'max' => '', - ), - ), - 2 => array( - 'title' => 'Past 90 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-90 days', - 'min' => '', - 'max' => '', - ), - ), - 3 => array( - 'title' => 'Past 60 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-60 days', - 'min' => '', - 'max' => '', - ), - ), - 4 => array( - 'title' => 'Past 30 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-30 days', - 'min' => '', - 'max' => '', - ), - ), - ); - $handler->display->display_options['path'] = 'node/%/issue-credits'; - - /* Display: Organization Sec Adv recent */ - $handler = $view->new_display('block', 'Organization Sec Adv recent', 'org_sa_recent'); - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'none'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'drupalorg_project_subtitle' => 'drupalorg_project_subtitle', - 'nid' => 'nid', - ); - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['footer'] = FALSE; - /* Footer: Global: Text area */ - $handler->display->display_options['footer']['area']['id'] = 'area'; - $handler->display->display_options['footer']['area']['table'] = 'views'; - $handler->display->display_options['footer']['area']['field'] = 'area'; - $handler->display->display_options['footer']['area']['content'] = '<a href="/node/%organization-nid/sa">View all security advisory credits</a>'; - $handler->display->display_options['footer']['area']['format'] = '1'; - $handler->display->display_options['footer']['area']['tokenize'] = TRUE; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1'; - $handler->display->display_options['fields']['nid_1']['table'] = 'node'; - $handler->display->display_options['fields']['nid_1']['field'] = 'nid'; - $handler->display->display_options['fields']['nid_1']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid_1']['label'] = ''; - $handler->display->display_options['fields']['nid_1']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid_1']['element_label_colon'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title_1']['id'] = 'title_1'; - $handler->display->display_options['fields']['title_1']['table'] = 'node'; - $handler->display->display_options['fields']['title_1']['field'] = 'title'; - $handler->display->display_options['fields']['title_1']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['title_1']['label'] = ''; - $handler->display->display_options['fields']['title_1']['exclude'] = TRUE; - $handler->display->display_options['fields']['title_1']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['title_1']['alter']['path'] = 'node/[nid_1]'; - $handler->display->display_options['fields']['title_1']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['title_1']['link_to_node'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '[title_1] [drupalorg_project_subtitle],'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['empty'] = '[title_1],'; - /* Field: COUNT(DISTINCT Content: Nid) */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['group_type'] = 'count_distinct'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['alter']['path'] = 'node/%organization-nid/sa/[nid_1]'; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['nid']['separator'] = ''; - $handler->display->display_options['fields']['nid']['format_plural'] = TRUE; - $handler->display->display_options['fields']['nid']['format_plural_singular'] = '1 advisory'; - $handler->display->display_options['fields']['nid']['format_plural_plural'] = '@count advisories'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'sa' => 'sa', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Content: Project type (field_project_type) */ - $handler->display->display_options['filters']['field_project_type_value']['id'] = 'field_project_type_value'; - $handler->display->display_options['filters']['field_project_type_value']['table'] = 'field_data_field_project_type'; - $handler->display->display_options['filters']['field_project_type_value']['field'] = 'field_project_type_value'; - $handler->display->display_options['filters']['field_project_type_value']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['filters']['field_project_type_value']['value'] = array( - 'full' => 'full', - ); - $handler->display->display_options['filters']['field_project_type_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator_id'] = 'field_for_customer_target_id_op'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['label'] = 'Attribute comment for customer (field_for_customer)'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['operator'] = 'field_for_customer_target_id_op'; - $handler->display->display_options['filters']['field_for_customer_target_id']['expose']['identifier'] = 'field_for_customer_target_id'; - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['operator'] = '>='; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['value'] = '-12 months'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['type'] = 'offset'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group'] = 1; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['block_description'] = 'Org SA recent'; - - /* Display: Organization sa credit page */ - $handler = $view->new_display('page', 'Organization sa credit page', 'org_sa_credit_page'); - $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['title'] = 'Security advisories credited to %1'; - $handler->display->display_options['defaults']['cache'] = FALSE; - $handler->display->display_options['cache']['type'] = 'time'; - $handler->display->display_options['cache']['results_lifespan'] = '3600'; - $handler->display->display_options['cache']['results_lifespan_custom'] = '0'; - $handler->display->display_options['cache']['output_lifespan'] = '3600'; - $handler->display->display_options['cache']['output_lifespan_custom'] = '0'; - $handler->display->display_options['defaults']['exposed_form'] = FALSE; - $handler->display->display_options['exposed_form']['type'] = 'basic'; - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'full'; - $handler->display->display_options['pager']['options']['items_per_page'] = '100'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['pager']['options']['id'] = '0'; - $handler->display->display_options['pager']['options']['quantity'] = '9'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['grouping'] = array( - 0 => array( - 'field' => 'field_project_machine_name', - 'rendered' => 1, - 'rendered_strip' => 0, - ), - ); - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'title' => 'title', - 'changed' => 'changed', - ); - $handler->display->display_options['row_options']['separator'] = 'updated'; - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['header'] = FALSE; - /* Header: Global: Text area */ - $handler->display->display_options['header']['area']['id'] = 'area'; - $handler->display->display_options['header']['area']['table'] = 'views'; - $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['empty'] = TRUE; - $handler->display->display_options['header']['area']['content'] = '◀︎ <a href="!url-1">Back to %1</a>'; - $handler->display->display_options['header']['area']['format'] = '1'; - $handler->display->display_options['header']['area']['tokenize'] = TRUE; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['label'] = ''; - $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - $handler->display->display_options['fields']['changed']['label'] = ''; - $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; - $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['exclude'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '<small>[drupalorg_project_subtitle]</small>'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - /* Field: Content: Short name */ - $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['field_project_machine_name']['label'] = ''; - $handler->display->display_options['fields']['field_project_machine_name']['exclude'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = ' [drupalorg_project_subtitle]'; - $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['field_project_machine_name']['group_column'] = 'entity_id'; - $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( - 'value' => 'value', - ); - $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Sort criterion: Content: Short name (field_project_machine_name) */ - $handler->display->display_options['sorts']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; - /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Global: Null */ - $handler->display->display_options['arguments']['null']['id'] = 'null'; - $handler->display->display_options['arguments']['null']['table'] = 'views'; - $handler->display->display_options['arguments']['null']['field'] = 'null'; - $handler->display->display_options['arguments']['null']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['null']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['null']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'sa' => 'sa', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - $handler->display->display_options['path'] = 'node/%/sa'; - - /* Display: User SA */ - $handler = $view->new_display('block', 'User SA', 'user_sa_recent'); - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'none'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'title_1' => 'title_1', - 'drupalorg_project_subtitle' => 'drupalorg_project_subtitle', - 'nid' => 'nid', - ); - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['footer'] = FALSE; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1'; - $handler->display->display_options['fields']['nid_1']['table'] = 'node'; - $handler->display->display_options['fields']['nid_1']['field'] = 'nid'; - $handler->display->display_options['fields']['nid_1']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid_1']['label'] = ''; - $handler->display->display_options['fields']['nid_1']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid_1']['element_label_colon'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title_1']['id'] = 'title_1'; - $handler->display->display_options['fields']['title_1']['table'] = 'node'; - $handler->display->display_options['fields']['title_1']['field'] = 'title'; - $handler->display->display_options['fields']['title_1']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['title_1']['label'] = ''; - $handler->display->display_options['fields']['title_1']['exclude'] = TRUE; - $handler->display->display_options['fields']['title_1']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['title_1']['alter']['path'] = 'node/[nid_1]'; - $handler->display->display_options['fields']['title_1']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['title_1']['link_to_node'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '[title_1] [drupalorg_project_subtitle],'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['empty'] = '[title_1],'; - /* Field: COUNT(DISTINCT Content: Nid) */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['group_type'] = 'count_distinct'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['nid']['alter']['path'] = 'u/%1/sa-credits'; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['nid']['separator'] = ''; - $handler->display->display_options['fields']['nid']['format_plural'] = TRUE; - $handler->display->display_options['fields']['nid']['format_plural_singular'] = '1 issue'; - $handler->display->display_options['fields']['nid']['format_plural_plural'] = '@count issues'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Comment: Author uid */ - $handler->display->display_options['arguments']['uid']['id'] = 'uid'; - $handler->display->display_options['arguments']['uid']['table'] = 'comment'; - $handler->display->display_options['arguments']['uid']['field'] = 'uid'; - $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'sa' => 'sa', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - - /* Display: User SA credit page */ - $handler = $view->new_display('page', 'User SA credit page', 'page_2'); - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['grouping'] = array( - 0 => array( - 'field' => 'field_project_machine_name', - 'rendered' => 0, - 'rendered_strip' => 0, - ), - ); - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'title' => 'title', - 'changed' => 'changed', - ); - $handler->display->display_options['row_options']['separator'] = 'updated'; - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['header'] = FALSE; - /* Header: Global: Text area */ - $handler->display->display_options['header']['area']['id'] = 'area'; - $handler->display->display_options['header']['area']['table'] = 'views'; - $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['content'] = '◀︎ [uid]'; - $handler->display->display_options['header']['area']['format'] = '1'; - $handler->display->display_options['header']['area']['tokenize'] = TRUE; - /* Header: Global: Result summary */ - $handler->display->display_options['header']['result']['id'] = 'result'; - $handler->display->display_options['header']['result']['table'] = 'views'; - $handler->display->display_options['header']['result']['field'] = 'result'; - $handler->display->display_options['defaults']['relationships'] = FALSE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['relationships']['field_project_target_id']['field'] = 'field_project_target_id'; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['label'] = ''; - $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - $handler->display->display_options['fields']['changed']['label'] = ''; - $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; - $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - /* Field: Comment: Author uid */ - $handler->display->display_options['fields']['uid']['id'] = 'uid'; - $handler->display->display_options['fields']['uid']['table'] = 'comment'; - $handler->display->display_options['fields']['uid']['field'] = 'uid'; - $handler->display->display_options['fields']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['fields']['uid']['label'] = ''; - $handler->display->display_options['fields']['uid']['exclude'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['text'] = 'Back to %1’s profile'; - $handler->display->display_options['fields']['uid']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['uid']['alter']['path'] = 'user/[uid]'; - $handler->display->display_options['fields']['uid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['uid']['link_to_user'] = FALSE; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['exclude'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = '<small>[drupalorg_project_subtitle]</small>'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - /* Field: Content: Short name */ - $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['field_project_machine_name']['label'] = ''; - $handler->display->display_options['fields']['field_project_machine_name']['exclude'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = ' [drupalorg_project_subtitle]'; - $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( - 'value' => 'value', - ); - $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Sort criterion: Content: Short name (field_project_machine_name) */ - $handler->display->display_options['sorts']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; - /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Comment: Author uid */ - $handler->display->display_options['arguments']['uid']['id'] = 'uid'; - $handler->display->display_options['arguments']['uid']['table'] = 'comment'; - $handler->display->display_options['arguments']['uid']['field'] = 'uid'; - $handler->display->display_options['arguments']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['arguments']['uid']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['uid']['exception']['value'] = ''; - $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE; - $handler->display->display_options['arguments']['uid']['validate']['type'] = 'user'; - $handler->display->display_options['arguments']['uid']['validate_options']['type'] = 'name'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'sa' => 'sa', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - $handler->display->display_options['path'] = 'u/%/sa-credits'; - - /* Display: Organization user issue credit page */ - $handler = $view->new_display('page', 'Organization user issue credit page', 'organization_user_issue_credit_page'); - $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['defaults']['use_ajax'] = FALSE; - $handler->display->display_options['use_ajax'] = TRUE; - $handler->display->display_options['defaults']['access'] = FALSE; - $handler->display->display_options['access']['type'] = 'none'; - $handler->display->display_options['defaults']['cache'] = FALSE; - $handler->display->display_options['cache']['type'] = 'time'; - $handler->display->display_options['cache']['results_lifespan'] = '21600'; - $handler->display->display_options['cache']['results_lifespan_custom'] = '0'; - $handler->display->display_options['cache']['output_lifespan'] = '21600'; - $handler->display->display_options['cache']['output_lifespan_custom'] = '0'; - $handler->display->display_options['defaults']['exposed_form'] = FALSE; - $handler->display->display_options['exposed_form']['type'] = 'better_exposed_filters'; - $handler->display->display_options['exposed_form']['options']['bef'] = array( - 'general' => array( - 'input_required' => 0, - 'text_input_required' => array( - 'text_input_required' => array( - 'value' => 'Select any filter and click on Apply to see results', - 'format' => '1', - ), - ), - 'allow_secondary' => 0, - 'secondary_label' => 'Advanced options', - 'secondary_collapse_override' => '0', - ), - 'field_issue_last_status_change_value' => array( - 'bef_format' => 'default', - 'more_options' => array( - 'bef_select_all_none' => FALSE, - 'bef_collapsible' => 0, - 'autosubmit' => 0, - 'is_secondary' => 0, - 'any_label' => '', - 'bef_filter_description' => '', - 'tokens' => array( - 'available' => array( - 0 => 'global_types', - ), - ), - 'rewrite' => array( - 'filter_rewrite_values' => '', - ), - 'datepicker_options' => '', - ), - ), - 'name' => array( - 'bef_format' => 'default', - 'more_options' => array( - 'autosubmit' => 0, - 'is_secondary' => 0, - 'any_label' => '', - 'bef_filter_description' => '', - 'tokens' => array( - 'available' => array( - 0 => 'global_types', - ), - ), - 'rewrite' => array( - 'filter_rewrite_values' => '', - ), - ), - ), - 'field_project_machine_name_value' => array( - 'bef_format' => 'default', - 'more_options' => array( - 'autosubmit' => 0, - 'is_secondary' => 0, - 'any_label' => '', - 'bef_filter_description' => '', - 'tokens' => array( - 'available' => array( - 0 => 'global_types', - ), - ), - 'rewrite' => array( - 'filter_rewrite_values' => '', - ), - ), - ), - ); - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'full'; - $handler->display->display_options['pager']['options']['items_per_page'] = '100'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['pager']['options']['id'] = '0'; - $handler->display->display_options['pager']['options']['quantity'] = '9'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['grouping'] = array( - 0 => array( - 'field' => 'name', - 'rendered' => 1, - 'rendered_strip' => 0, - ), - ); - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['style_options']['wrapper_class'] = ''; - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'field_project_machine_name' => 'field_project_machine_name', - 'title' => 'title', - 'changed' => 'changed', - ); - $handler->display->display_options['row_options']['separator'] = ' '; - $handler->display->display_options['defaults']['row_options'] = FALSE; - $handler->display->display_options['defaults']['header'] = FALSE; - /* Header: Global: Result summary */ - $handler->display->display_options['header']['result']['id'] = 'result'; - $handler->display->display_options['header']['result']['table'] = 'views'; - $handler->display->display_options['header']['result']['field'] = 'result'; - /* Header: Global: Text area */ - $handler->display->display_options['header']['area']['id'] = 'area'; - $handler->display->display_options['header']['area']['table'] = 'views'; - $handler->display->display_options['header']['area']['field'] = 'area'; - $handler->display->display_options['header']['area']['content'] = '<p><strong>Please note:</strong> This view organizes the projects and issues which people have attributed to your organization for credit. You may see duplicate issues in this list when multiple people at your organization worked on the issue. Each issue is only counted once for organization credit, regardless of how many people contributed to it.</p>'; - $handler->display->display_options['header']['area']['format'] = '1'; - $handler->display->display_options['defaults']['relationships'] = FALSE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['relationships']['field_project_target_id']['field'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['required'] = TRUE; - /* Relationship: Comment: Author */ - $handler->display->display_options['relationships']['uid']['id'] = 'uid'; - $handler->display->display_options['relationships']['uid']['table'] = 'comment'; - $handler->display->display_options['relationships']['uid']['field'] = 'uid'; - $handler->display->display_options['relationships']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Comment: Author */ - $handler->display->display_options['fields']['name']['id'] = 'name'; - $handler->display->display_options['fields']['name']['table'] = 'comment'; - $handler->display->display_options['fields']['name']['field'] = 'name'; - $handler->display->display_options['fields']['name']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['fields']['name']['label'] = ''; - $handler->display->display_options['fields']['name']['exclude'] = TRUE; - $handler->display->display_options['fields']['name']['alter']['text'] = '[name]'; - $handler->display->display_options['fields']['name']['element_label_colon'] = FALSE; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['nid']['label'] = ''; - $handler->display->display_options['fields']['nid']['exclude'] = TRUE; - $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['label'] = ''; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['exclude'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['alter']['text'] = ' <small>[drupalorg_project_subtitle]</small>'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['element_label_colon'] = FALSE; - /* Field: Content: Short name */ - $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['field_project_machine_name']['label'] = ''; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['make_link'] = TRUE; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['path'] = 'node/[nid]'; - $handler->display->display_options['fields']['field_project_machine_name']['alter']['suffix'] = '[drupalorg_project_subtitle]:'; - $handler->display->display_options['fields']['field_project_machine_name']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['field_project_machine_name']['group_column'] = 'entity_id'; - $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( - 'value' => 'value', - ); - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['label'] = ''; - $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - $handler->display->display_options['fields']['changed']['label'] = ''; - $handler->display->display_options['fields']['changed']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['changed']['alter']['text'] = 'updated [changed]'; - $handler->display->display_options['fields']['changed']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['changed']['date_format'] = 'today time ago'; - $handler->display->display_options['fields']['changed']['second_date_format'] = 'medium'; - $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Sort criterion: Comment: Author */ - $handler->display->display_options['sorts']['name']['id'] = 'name'; - $handler->display->display_options['sorts']['name']['table'] = 'comment'; - $handler->display->display_options['sorts']['name']['field'] = 'name'; - $handler->display->display_options['sorts']['name']['relationship'] = 'field_issue_credit_target_id'; - /* Sort criterion: Content: Short name (field_project_machine_name) */ - $handler->display->display_options['sorts']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; - $handler->display->display_options['sorts']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; - /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Global: Null */ - $handler->display->display_options['arguments']['null']['id'] = 'null'; - $handler->display->display_options['arguments']['null']['table'] = 'views'; - $handler->display->display_options['arguments']['null']['field'] = 'null'; - $handler->display->display_options['arguments']['null']['default_action'] = 'not found'; - $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['null']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['null']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); - $handler->display->display_options['defaults']['filters'] = FALSE; - /* Filter criterion: Content: Published */ - $handler->display->display_options['filters']['status']['id'] = 'status'; - $handler->display->display_options['filters']['status']['table'] = 'node'; - $handler->display->display_options['filters']['status']['field'] = 'status'; - $handler->display->display_options['filters']['status']['value'] = 1; - $handler->display->display_options['filters']['status']['group'] = 1; - $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', - ); - $handler->display->display_options['filters']['type']['group'] = 1; - /* Filter criterion: Comment: Approved */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'comment'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; - $handler->display->display_options['filters']['status_1']['group'] = 1; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['group'] = 1; - /* Filter criterion: Content: Status (field_issue_status) */ - $handler->display->display_options['filters']['field_issue_status_value']['id'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['table'] = 'field_data_field_issue_status'; - $handler->display->display_options['filters']['field_issue_status_value']['field'] = 'field_issue_status_value'; - $handler->display->display_options['filters']['field_issue_status_value']['value'] = array( - 'Closed' => 'Closed', - 2 => '2', - ); - $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['exposed'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator_id'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['label'] = 'Last status change (field_issue_last_status_change)'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['operator'] = 'field_issue_last_status_change_value_op'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['expose']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['is_grouped'] = TRUE; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['label'] = 'Date range'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['identifier'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['default_group'] = '1'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['group_info']['group_items'] = array( - 1 => array( - 'title' => 'Past year', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-1 year', - 'min' => '', - 'max' => '', - ), - ), - 2 => array( - 'title' => 'Past 90 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-90 days', - 'min' => '', - 'max' => '', - ), - ), - 3 => array( - 'title' => 'Past 60 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-60 days', - 'min' => '', - 'max' => '', - ), - ), - 4 => array( - 'title' => 'Past 30 days', - 'operator' => '>=', - 'value' => array( - 'type' => 'date', - 'value' => '-30 days', - 'min' => '', - 'max' => '', - ), - ), - ); - /* Filter criterion: Comment: Author */ - $handler->display->display_options['filters']['name']['id'] = 'name'; - $handler->display->display_options['filters']['name']['table'] = 'comment'; - $handler->display->display_options['filters']['name']['field'] = 'name'; - $handler->display->display_options['filters']['name']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['name']['operator'] = 'word'; - $handler->display->display_options['filters']['name']['exposed'] = TRUE; - $handler->display->display_options['filters']['name']['expose']['operator_id'] = 'name_op'; - $handler->display->display_options['filters']['name']['expose']['label'] = 'Contributor'; - $handler->display->display_options['filters']['name']['expose']['operator'] = 'name_op'; - $handler->display->display_options['filters']['name']['expose']['identifier'] = 'name'; - $handler->display->display_options['filters']['name']['expose']['remember_roles'] = array( - 2 => '2', - 3 => 0, - 1 => 0, - 39 => 0, - 36 => 0, - 7 => 0, - 34 => 0, - 32 => 0, - 22 => 0, - 20 => 0, - 24 => 0, - 41 => 0, - 26 => 0, - 38 => 0, - 4 => 0, - 42 => 0, - ); - /* Filter criterion: Content: Short name (field_project_machine_name) */ - $handler->display->display_options['filters']['field_project_machine_name_value']['id'] = 'field_project_machine_name_value'; - $handler->display->display_options['filters']['field_project_machine_name_value']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['filters']['field_project_machine_name_value']['field'] = 'field_project_machine_name_value'; - $handler->display->display_options['filters']['field_project_machine_name_value']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['filters']['field_project_machine_name_value']['operator'] = 'word'; - $handler->display->display_options['filters']['field_project_machine_name_value']['exposed'] = TRUE; - $handler->display->display_options['filters']['field_project_machine_name_value']['expose']['operator_id'] = 'field_project_machine_name_value_op'; - $handler->display->display_options['filters']['field_project_machine_name_value']['expose']['label'] = 'Project short name'; - $handler->display->display_options['filters']['field_project_machine_name_value']['expose']['operator'] = 'field_project_machine_name_value_op'; - $handler->display->display_options['filters']['field_project_machine_name_value']['expose']['identifier'] = 'field_project_machine_name_value'; - $handler->display->display_options['filters']['field_project_machine_name_value']['expose']['remember_roles'] = array( - 2 => '2', - 3 => 0, - 1 => 0, - 39 => 0, - 36 => 0, - 7 => 0, - 34 => 0, - 32 => 0, - 22 => 0, - 20 => 0, - 24 => 0, - 41 => 0, - 26 => 0, - 38 => 0, - 4 => 0, - 42 => 0, - ); - $handler->display->display_options['path'] = 'node/%/org-issue-credit-user'; - $handler->display->display_options['menu']['title'] = 'Org Issue credits'; - $handler->display->display_options['menu']['weight'] = '0'; - $handler->display->display_options['menu']['context'] = 0; - $handler->display->display_options['menu']['context_only_inline'] = 0; - - /* Display: Organization export */ - $handler = $view->new_display('views_data_export', 'Organization export', 'organization_user_issue_credit_page_data_export'); - $handler->display->display_options['pager']['type'] = 'none'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['style_plugin'] = 'views_data_export_csv'; - $handler->display->display_options['style_options']['attach_text'] = 'CSV Export'; - $handler->display->display_options['style_options']['provide_file'] = 1; - $handler->display->display_options['style_options']['filename'] = '%timestamp-full-%1-title.csv'; - $handler->display->display_options['style_options']['parent_sort'] = 0; - $handler->display->display_options['style_options']['quote'] = 1; - $handler->display->display_options['style_options']['trim'] = 0; - $handler->display->display_options['style_options']['replace_newlines'] = 0; - $handler->display->display_options['style_options']['newline_token'] = '1'; - $handler->display->display_options['style_options']['header'] = 1; - $handler->display->display_options['style_options']['keep_html'] = 0; - $handler->display->display_options['defaults']['relationships'] = FALSE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_issue_credit_target_id']['id'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['table'] = 'field_data_field_issue_credit'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['field'] = 'field_issue_credit_target_id'; - $handler->display->display_options['relationships']['field_issue_credit_target_id']['required'] = TRUE; - /* Relationship: Entity Reference: Referenced Entity */ - $handler->display->display_options['relationships']['field_project_target_id']['id'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['table'] = 'field_data_field_project'; - $handler->display->display_options['relationships']['field_project_target_id']['field'] = 'field_project_target_id'; - $handler->display->display_options['relationships']['field_project_target_id']['required'] = TRUE; - /* Relationship: Comment: Author */ - $handler->display->display_options['relationships']['uid']['id'] = 'uid'; - $handler->display->display_options['relationships']['uid']['table'] = 'comment'; - $handler->display->display_options['relationships']['uid']['field'] = 'uid'; - $handler->display->display_options['relationships']['uid']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['defaults']['fields'] = FALSE; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - /* Field: Content: Updated date */ - $handler->display->display_options['fields']['changed']['id'] = 'changed'; - $handler->display->display_options['fields']['changed']['table'] = 'node'; - $handler->display->display_options['fields']['changed']['field'] = 'changed'; - /* Field: Content: Nid */ - $handler->display->display_options['fields']['nid']['id'] = 'nid'; - $handler->display->display_options['fields']['nid']['table'] = 'node'; - $handler->display->display_options['fields']['nid']['field'] = 'nid'; - $handler->display->display_options['fields']['nid']['relationship'] = 'field_project_target_id'; - /* Field: Content: Project subtitle */ - $handler->display->display_options['fields']['drupalorg_project_subtitle']['id'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['field'] = 'drupalorg_project_subtitle'; - $handler->display->display_options['fields']['drupalorg_project_subtitle']['relationship'] = 'field_project_target_id'; - /* Field: Content: Short name */ - $handler->display->display_options['fields']['field_project_machine_name']['id'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['table'] = 'field_data_field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['field'] = 'field_project_machine_name'; - $handler->display->display_options['fields']['field_project_machine_name']['relationship'] = 'field_project_target_id'; - $handler->display->display_options['fields']['field_project_machine_name']['group_column'] = 'entity_id'; - $handler->display->display_options['fields']['field_project_machine_name']['group_columns'] = array( - 'value' => 'value', - ); - /* Field: Comment: Author */ - $handler->display->display_options['fields']['name']['id'] = 'name'; - $handler->display->display_options['fields']['name']['table'] = 'comment'; - $handler->display->display_options['fields']['name']['field'] = 'name'; - $handler->display->display_options['fields']['name']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Sort criterion: Comment: Author */ - $handler->display->display_options['sorts']['name']['id'] = 'name'; - $handler->display->display_options['sorts']['name']['table'] = 'comment'; - $handler->display->display_options['sorts']['name']['field'] = 'name'; - $handler->display->display_options['sorts']['name']['relationship'] = 'field_issue_credit_target_id'; - /* Sort criterion: MAX(Content: Last status change (field_issue_last_status_change)) */ - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['group_type'] = 'max'; - $handler->display->display_options['sorts']['field_issue_last_status_change_value']['order'] = 'DESC'; - $handler->display->display_options['defaults']['arguments'] = FALSE; - /* Contextual filter: Global: Null */ - $handler->display->display_options['arguments']['null']['id'] = 'null'; - $handler->display->display_options['arguments']['null']['table'] = 'views'; - $handler->display->display_options['arguments']['null']['field'] = 'null'; - $handler->display->display_options['arguments']['null']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['null']['summary']['format'] = 'default_summary'; - $handler->display->display_options['defaults']['filter_groups'] = FALSE; - $handler->display->display_options['filter_groups']['groups'] = array( - 1 => 'AND', - 2 => 'OR', - ); $handler->display->display_options['defaults']['filters'] = FALSE; /* Filter criterion: Content: Published */ $handler->display->display_options['filters']['status']['id'] = 'status'; @@ -2544,7 +1024,7 @@ function drupalorg_user_views_default_views() { $handler->display->display_options['filters']['type']['table'] = 'node'; $handler->display->display_options['filters']['type']['field'] = 'type'; $handler->display->display_options['filters']['type']['value'] = array( - 'project_issue' => 'project_issue', + 'sa' => 'sa', ); $handler->display->display_options['filters']['type']['group'] = 1; /* Filter criterion: Comment: Approved */ @@ -2563,50 +1043,7 @@ function drupalorg_user_views_default_views() { 2 => '2', ); $handler->display->display_options['filters']['field_issue_status_value']['group'] = 1; - /* Filter criterion: Comment: Attribute comment at organization (field_attribute_contribution_to) */ - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['id'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['table'] = 'field_data_field_attribute_contribution_to'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['field'] = 'field_attribute_contribution_to_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_attribute_contribution_to_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute comment for customer (field_for_customer) */ - $handler->display->display_options['filters']['field_for_customer_target_id']['id'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['table'] = 'field_data_field_for_customer'; - $handler->display->display_options['filters']['field_for_customer_target_id']['field'] = 'field_for_customer_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_for_customer_target_id']['value']['value'] = '***CURRENT_ORGANIZATION***'; - $handler->display->display_options['filters']['field_for_customer_target_id']['group'] = 2; - /* Filter criterion: Comment: Attribute this contribution (field_attribute_as_volunteer) */ - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['id'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['table'] = 'field_data_field_attribute_as_volunteer'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['field'] = 'field_attribute_as_volunteer_value'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['relationship'] = 'field_issue_credit_target_id'; - $handler->display->display_options['filters']['field_attribute_as_volunteer_value']['value'] = array( - 0 => '0', - ); - /* Filter criterion: Content: Last status change (field_issue_last_status_change) */ - $handler->display->display_options['filters']['field_issue_last_status_change_value']['id'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['table'] = 'field_data_field_issue_last_status_change'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['field'] = 'field_issue_last_status_change_value'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['operator'] = '>='; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['value'] = '-1year'; - $handler->display->display_options['filters']['field_issue_last_status_change_value']['value']['type'] = 'offset'; - $handler->display->display_options['path'] = 'node/%/org-issue-credit-user-export'; - $handler->display->display_options['displays'] = array( - 'organization_user_issue_credit_page' => 'organization_user_issue_credit_page', - 'default' => 0, - 'user_recent' => 0, - 'user_recent_page' => 0, - 'page_1' => 0, - 'organization_recent' => 0, - 'organization_recent_page' => 0, - 'organization_issue_credit_page' => 0, - 'org_sa_recent' => 0, - 'org_sa_credit_page' => 0, - 'user_sa_recent' => 0, - 'page_2' => 0, - ); + $handler->display->display_options['path'] = 'u/%/sa-credits'; $translatables['issue_credit'] = array( t('Master'), t('more'), -- GitLab From 0bd0824b29ac5b15b311685799cb33490a4daf4f Mon Sep 17 00:00:00 2001 From: Fran Garcia-Linares <fjgarlin@gmail.com> Date: Thu, 27 Mar 2025 17:46:55 +0100 Subject: [PATCH 2/2] JS leftover. --- drupalorg/js/general.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drupalorg/js/general.js b/drupalorg/js/general.js index c951a3152..bb17c26cd 100644 --- a/drupalorg/js/general.js +++ b/drupalorg/js/general.js @@ -202,11 +202,13 @@ } // If at organization… is checked, and no organizations are selected, // show a warning. - if ($notVolunteer.attr('checked') && !$organizations.length && !customers.length) { - $fieldset[0].querySelector('.empty-organizations').classList.remove('element-hidden'); - } - else { - $fieldset[0].querySelector('.empty-organizations').classList.add('element-hidden'); + if ($fieldset[0].querySelector('.empty-organizations') !== null) { + if ($notVolunteer.attr('checked') && !$organizations.length && !customers.length) { + $fieldset[0].querySelector('.empty-organizations').classList.remove('element-hidden'); + } + else { + $fieldset[0].querySelector('.empty-organizations').classList.add('element-hidden'); + } } }); }); -- GitLab