Index: modules/views_user.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/modules/views_user.inc,v
retrieving revision 1.11.2.2
diff -u -r1.11.2.2 views_user.inc
--- modules/views_user.inc	18 Jan 2007 05:49:04 -0000	1.11.2.2
+++ modules/views_user.inc	29 Jan 2007 20:42:54 -0000
@@ -68,6 +68,7 @@
         'name' => t('Role: Author Role'),
         'operator' => 'views_handler_operator_andor',
         'list' => 'views_handler_filter_role',
+        'handler' => 'views_handler_filter_role_custom',
         'value-type' => 'array',
         'help' => t('Include the node only if the author is a member of the selected role.'),
       ),
@@ -326,15 +327,6 @@
 }
 
 /*
- * Custom filter for current user.
- */
-function views_handler_filter_usercurrent_custom($op, $filter, $filterinfo, &$query) {
-  global $user;
-  $query->ensure_table('users');
-  $query->add_where("users.uid $filter[operator] '$user->uid'");
-}
-
-/*
  * Add special info to see if a user either authored OR commented on a post
  */
 function views_handler_filter_uid_touched($op, $filter, $filterinfo, &$query) {
@@ -352,3 +344,63 @@
   $query->set_distinct(); // once you do this, there's just one node.
   $query->add_where("node.uid = '%s' OR $table.uid = '%s'", $filter['value'], $filter['value']);
 }
+
+/*
+ * Create a list of roles.
+ */
+function views_handler_filter_role() {
+  $rids = array();
+  $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name");
+  while ($obj = db_fetch_object($result)) {
+    $rids[$obj->rid] = $obj->name;
+  }
+  return $rids;
+}
+
+/*
+ * Custom filter for roles
+ */
+function views_handler_filter_role_custom($op, $filter, $filterinfo, &$query) {
+  $table = $filterinfo['table'];
+  $field = $filterinfo['field'];
+
+  //filter for role authenticated users
+  if (in_array(2, $filter['value'])) {
+    if ($filter['operator'] == 'OR') {
+      //filter for anonymous users too -> return all
+      if (in_array(1, $filter['value'])) {
+        return;
+      }
+      $query->ensure_table($table);
+      $query->add_where("(%s.%s != '1' OR %s.%s IS NULL)", $table, $field, $table, $field);
+      return;
+    }
+    else if ($filter['operator'] == 'NOR') {
+      //filter for anonymous users too?
+      if (in_array(1, $filter['value'])) {
+        $query->ensure_table($table);
+        $query->add_where("%s.%s = '0'", $table, $field); //this will get no results
+        return;
+      }
+      else {
+        $query->ensure_table($table);
+        $query->add_where("%s.%s = '1'", $table, $field);
+        return;
+      }
+    }
+    else if ($filter['operator'] == 'AND' && !in_array(1, $filter['value'])) {
+      $key = array_search('2', $filter['value']);
+      unset($filter['value'][$key]);
+      //if there are other roles left the default filter handling is ok, if not
+      //we need to exclude anonymous users
+      if (count($filter['value']) == 0) {
+        $query->ensure_table($table);
+        $query->add_where("%s.%s != '1'", $table, $field);
+        return;
+      }
+    }
+  }
+  if ($filter['value']) {
+    views_handler_filter_default($op, $filter, $filterinfo, $query);
+  }
+}
\ No newline at end of file
Index: modules/views_node.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/modules/views_node.inc,v
retrieving revision 1.24.2.17
diff -u -r1.24.2.17 views_node.inc
--- modules/views_node.inc	21 Jan 2007 23:17:29 -0000	1.24.2.17
+++ modules/views_node.inc	29 Jan 2007 20:42:54 -0000
@@ -694,18 +694,6 @@
 }
 
 /*
- * Create a list of roles.
- */
-function views_handler_filter_role() {
-  $rids = array();
-  $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name");
-  while ($obj = db_fetch_object($result)) {
-    $rids[$obj->rid] = $obj->name;
-  }
-  return $rids;
-}
-
-/*
  * Create a list of node types.
  */
 function views_handler_filter_nodetype($op) {
