Skip to content

Commit

Permalink
Merge pull request #3365 from drshawnkwang/drupal_feature-flagabusere…
Browse files Browse the repository at this point in the history
…ason2

Drupal: Adds drop-down functionality to flagging of forum posts, comments, user profiles.
  • Loading branch information
tristanolive committed Nov 8, 2019
2 parents e7a545e + a060c2f commit e1164f2
Show file tree
Hide file tree
Showing 14 changed files with 2,815 additions and 193 deletions.
1,698 changes: 1,511 additions & 187 deletions drupal/sites/all/features/boinc_standard/boinc_standard.features.inc

Large diffs are not rendered by default.

22 changes: 18 additions & 4 deletions drupal/sites/all/features/boinc_standard/boinc_standard.info
Expand Up @@ -20,7 +20,7 @@ dependencies[] = "fe_block"
dependencies[] = "features"
dependencies[] = "fieldgroup"
dependencies[] = "flag"
dependencies[] = "flag_abuse"
dependencies[] = "flag_abuse_reason"
dependencies[] = "flag_comment_notify"
dependencies[] = "htmlpurifier"
dependencies[] = "ignore_user"
Expand Down Expand Up @@ -75,9 +75,23 @@ features[fieldgroup][] = "page-group_boinctranslate_opts"
features[filter_formats][] = "php_code"
features[filter_formats][] = "plain_text"
features[filter_formats][] = "rich_text"
features[flag][] = "abuse_comment"
features[flag][] = "abuse_node"
features[flag][] = "abuse_user"
features[flag][] = "abuse_comment_1"
features[flag][] = "abuse_comment_2"
features[flag][] = "abuse_comment_3"
features[flag][] = "abuse_comment_4"
features[flag][] = "abuse_comment_5"
features[flag][] = "abuse_comment_meta"
features[flag][] = "abuse_node_1"
features[flag][] = "abuse_node_2"
features[flag][] = "abuse_node_3"
features[flag][] = "abuse_node_4"
features[flag][] = "abuse_node_5"
features[flag][] = "abuse_node_meta"
features[flag][] = "abuse_user_1"
features[flag][] = "abuse_user_2"
features[flag][] = "abuse_user_3"
features[flag][] = "abuse_user_4"
features[flag][] = "abuse_user_meta"
features[flag][] = "subscriptions"
features[menu_custom][] = "menu-footer-links"
features[menu_links][] = "menu-footer-links:https://boinc.berkeley.edu/"
Expand Down
Expand Up @@ -2311,7 +2311,7 @@ function boincuser_get_profile_links($uid) {
$output .= '</li>';
$count++;
}
$output .= '<li class="' . (($count) ? '' : 'first ') . 'last tab">' . flag_create_link('abuse_user', $account->uid) . '</li>';
$output .= '<li class="' . (($count) ? '' : 'first ') . 'last tab">' . flag_create_link('abuse_user_meta', $account->uid) . '</li>';
$output .= '</ul>';
}
return $output;
Expand Down
Expand Up @@ -432,6 +432,14 @@ function forum_access_link_alter(&$links, $node, $comment = NULL) {
'update' => 'comment_edit',
'delete' => 'comment_delete',
);

// If node/forum thread is locked, then use an empty array and set
// link_is_missing to false.
if (node_load($node->nid, NULL, TRUE)->comment < 2) {
$required_keys = array();
$link_is_missing = FALSE;
}

foreach ($required_keys as $access => $key) {
if (!forum_access_access($tid, $access) && !($access == 'update' && comment_access('edit', $comment)) && !($access == 'comment_create' && forum_access_access($tid, 'create') && ($node->uid==$user->uid)) ) {
unset($links[$required_keys[$access]]);
Expand Down
@@ -0,0 +1,46 @@
/* $Id$ */

/**
* @file
*
* CSS-style for flag-abuse-reason content
*/

.dropbtn {
background-color: #3498DB;
color: white;
padding: 16px;
font-size: 16px;
border: none;
cursor: pointer;
}

.dropbtn:hover, .dropbtn:focus {
background-color: #2980B9;
}

.dropdown {
position: relative;
display: inline-block;
}

.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
overflow: auto;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}

.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}

.dropdown a:hover {background-color: #ddd;}

.show {display: block;}
@@ -0,0 +1,13 @@
; $Id$
name = Flag Abuse Reason
description = Allow users to give a reason for flagged content
core = 6.x
package = Flags
dependencies[] = comment
dependencies[] = flag
dependencies[] = node
dependencies[] = user
project = "flag_abuse_reason"
datestamp = "1557420000"
version = "6.x-1.x"

@@ -0,0 +1,177 @@
<?php
// $Id$

/**
* @file
* Create a flag link with a JS dropdown with reasons why content has
* been flagged for abuse.
*/

/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Hooks into flag module
* * * * * * * * * * * * * * * * * * * * * * * * * * * */

/**
* Implementation of hook_flag_default_flags()
*/

function flag_abuse_reason_flag_default_flags() {
$flags = array();
module_load_include('inc', 'flag_abuse_reason', 'includes/flag_abuse_reason.flag_default');
_flag_abuse_reason_abuse_node_flags($flags);
_flag_abuse_reason_abuse_comment_flags($flags);
_flag_abuse_reason_abuse_user_flags($flags);
return $flags;
}

/**
* Implementation of hook_views_api().
*/
function flag_abuse_reason_views_api() {
return array(
'api' => 2.0,
'path' => drupal_get_path('module', 'flag_abuse_reason') . '/includes',
);
}

/**
* Implementation of hook_perm().
*/
function flag_abuse_reason_perm() {
return array('reset abuse flags');
}

/**
* Implementation of hook_preprocess_flag().
*
* Here we change our flag event/action to 'reset'.
*/
function flag_abuse_reason_preprocess_flag(&$vars) {
drupal_add_js(drupal_get_path('module', 'flag_abuse_reason') . "/includes/flag_abuse_reason.js");
drupal_add_css(drupal_get_path('module', 'flag_abuse_reason') . "/css/flag_abuse_reason.css");
$myuser = $vars['user'];
$metaflags = array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta');

// permmission check instead of a role
// Is this one of our abuse flags?
if (in_array($vars['flag']->name, $metaflags)) {

// count the number of flags on this content
$count = db_result(db_query("SELECT COUNT(*) FROM {flag_content} WHERE content_id=%d AND fid=%d", $vars['content_id'], $vars['flag']->fid));

// If the variable <flagname>-<contentid> is set, then Reset
// completely.
if (variable_get($vars['flag']->name.'-'.$vars['content_id'], FALSE)) {
if (user_access('reset abuse flags', $myuser)) {
$vars['action'] = 'none';
$vars['link_text'] = t('Reset Completely');
$vars['link_title'] = t('Reset everying, allows users to re-flag content.');
}
else {
$vars['action'] = 'none';
$vars['link_text'] = t('Locked');
$vars['link_title'] = t('Reporting locked by moderator.');
$vars['link'] = array();
$vars['link_href'] = '';
$vars['flag_classes'] = 'flag style-like-link';
}
}
else {
// If there are flags on this content, clear the flags and
// lock the content.
if (user_access('reset abuse flags', $myuser)) {
if ($count>0) {
$vars['action'] = 'reset';
$vars['link_text'] = t('Clear Reports and Lock');
$vars['link_title'] = t('Remove all flags on this content and prevent any new flagging.');
}
// Otherwise the link is shown but has no effect.
else {
$vars['action'] = 'none';
$vars['link_text'] = t('No abuse reports');
$vars['link_title'] = t('This content has no abuse reports. Link does nothing.');
$vars['link'] = array();
$vars['link_href'] = '';
$vars['flag_classes'] = 'flag style-like-link';
}
}
}
}
}

/**
* Implementation of hook_flag().
*
* If a user with appropriate permission/role flags this content from our view
* we want to remove all flags. http://drupal.org/node/327901#comment-1085685
*/
function flag_abuse_reason_flag($event, $flag, $content_id, $account) {
$metaflags = array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta');

// For privileged users, check permissions and reset flags
// permission check instead of a role.
if (user_access('reset abuse flags', $account)) {
// Is this one of our abuse flags?
if (in_array($flag->name, $metaflags)) {

// Reset the flags completely.
if (variable_get($flag->name.'-'.$content_id, FALSE)) {
// Since the user flags the content again, we need to unflag it.
flag_reset_flag($flag, $content_id);
drupal_set_message(bts('INFO: Reset everything. Users may reflag this content.', array(), NULL, 'boinc:flag-abuse-reset'), 'info');
// unlock flag; effectively resets flags for this content
variable_del($flag->name.'-'.$content_id);
}
else {
// Clear and Lock all flags on this content.
$dbresult = db_query("SELECT DISTINCT fid FROM {flag_content} WHERE content_id = %d", $content_id);
$rows = 0;
while ($myfid = db_fetch_array($dbresult)) {
$myflag = flag_get_flag(NULL, array_pop($myfid));
$rows += flag_reset_flag($myflag, $content_id);
}
if ($rows) {
// This user actually flags the content as well, so it may
// confuse the user if they reset what they thought was one
// flag and we report two.
$rows--;
drupal_set_message(bts('INFO: Cleared !rows flags. Content is now locked and may not be reflagged.', array('!rows' => $rows), NULL, 'boinc:flag-abuse-reset'), 'info');

// This is the line which sets a Drupal variable which
// prevents the flag link from showing again for all
// users. Effectively preventing the content from being
// flagged again.
variable_set($flag->name.'-'.$content_id, TRUE);
}
}

}
}
// Normal users may cancel their all their reported flags on this
// content.
else {
if ( ($event=='unflag') && (in_array($flag->name, $metaflags)) ) {
$allflags = flag_get_user_flags($flag->content_type, $content_id, $account->uid);
foreach ($allflags as $subflag) {
$myflag = flag_get_flag(NULL, $subflag->fid);
$rc = $myflag->flag('unflag', $content_id, $account);
}
}
}
}

/**
* Implementation of hook_form_FORM_ID_alter().
*/
function flag_abuse_reason_form_flag_confirm_alter(&$form, &$form_state) {
// Permmission check instead of a role.
if (user_access('reset abuse flags', $account)) {
$flag_name = $form['flag_name']['#value'];
// Is this one of our abuse flags?
if (in_array($flag_name, array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta'))) {
drupal_set_title(t('Flag reset'));
$form['description']['#value'] = t('Are you sure you want to reset all offensive flag on this content? Once doing so, users will not be able to flag this content again.');
$form['actions']['submit']['#value'] = t('Reset flags');
}
}
}

0 comments on commit e1164f2

Please sign in to comment.