Index: project/project.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/project.module,v
retrieving revision 1.304
diff -u -p -r1.304 project.module
--- project/project.module	6 Oct 2007 19:42:32 -0000	1.304
+++ project/project.module	27 Nov 2007 12:20:23 -0000
@@ -408,6 +408,11 @@ function project_menu($may_cache) {
   }
   else {
     drupal_add_css(drupal_get_path('module', 'project') .'/project.css');
+    $project_path = drupal_get_path('module', 'project');
+    if (module_exists('views')) {
+      require './'. $project_path .'/project_views.inc';
+    }
+
     if (arg(0) == 'node' && is_numeric(arg(1))) {
       $node = node_load(arg(1));
       if ($node->type == 'project_project' && node_access('update', $node) &&
Index: project/project_views.inc
===================================================================
RCS file: project/project_views.inc
diff -N project/project_views.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ project/project_views.inc	27 Nov 2007 12:20:23 -0000
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * @file
+ * Provides support for Views integration.
+ */
+
+/**
+ * Implementation of hook_views_tables
+ */
+function project_views_tables() {
+  $tables['project_projects'] = array(
+    'name' => 'project_projects',
+    'join' => array(
+      'type' => 'inner',
+      'left' => array(
+        'table' => 'node',
+        'field' => 'nid'
+      ),
+      'right' => array(
+        'field' => 'nid'
+      ),
+    ),
+    'fields' => array(
+      'uri' => array(
+        'name' => t('Project project: Short name'),
+        'sortable' => true,
+        'help' => t('The project\'s short name.'),
+      ),
+      'homepage' => array(
+        'name' => t('Project project: homepage'),
+        'handler' => 'views_handler_field_project_project_url',
+        'sortable' => true,
+        'help' => t('The project\'s homepage.'),
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'changelog' => array(
+        'name' => t('Project project: changelog'),
+        'handler' => 'views_handler_field_project_project_url',
+        'sortable' => true,
+        'help' => t('The project\'s changelog.'),
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'cvs' => array(
+        'name' => t('Project project: cvs'),
+        'handler' => 'views_handler_field_project_project_url',
+        'sortable' => true,
+        'help' => t('The project\'s cvs directory.'),
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'demo' => array(
+        'name' => t('Project project: demo'),
+        'help' => t('The project\'s homepage.'),
+        'sortable' => true,
+        'handler' => 'views_handler_field_project_project_url',
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'release_directory' => array(
+        'name' => t('Project project: release directory'),
+        'help' => t('The project\'s release directory.'),
+        'sortable' => true,
+      ),
+      'version' => array(
+        'name' => t('Project project: version'),
+        'help' => t('The project\'s version.'),
+        'sortable' => true,
+      ),
+      'documentation' => array(
+        'name' => t('Project project: documentation'),
+        'help' => t('The project\'s documentation.'),
+        'sortable' => true,
+        'handler' => 'views_handler_field_project_project_url',
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'screenshort' => array(
+        'name' => t('Project project: screenshot'),
+        'help' => t('The project\'s screenshot.'),
+        'sortable' => true,
+        'handler' => 'views_handler_field_project_project_url',
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+      'license' => array(
+        'name' => t('Project project: license'),
+        'help' => t('The project\'s license.'),
+        'sortable' => true,
+        'handler' => 'views_handler_field_project_project_url',
+        'option' => array(
+           '#type' => 'select',
+           '#options' => array(
+             'link' => t('As link'),
+             'nolink' => t('Without link')
+            ),
+        ),
+      ),
+     ),
+  );
+
+  // Add data from the project_issue module
+  $tables['project_issue_projects'] = array(
+    'name' => 'project_issue_projects',
+    'join' => array(
+      'type' => 'inner',
+      'left' => array(
+        'table' => 'project_projects',
+        'field' => 'nid'
+      ),
+      'right' => array(
+        'field' => 'nid'
+      ),
+    ),
+    'fields' => array(
+      'issues' => array(
+        'name' => t('Project project: Issues'),
+        'sortable' => true,
+        'help' => t('Display whether the project node is associated with any issues.'),
+      ),
+    ),
+  );
+  return $tables;
+}
+
+/*
+ * Format a field as a link.
+ */
+function views_handler_field_project_project_url($fieldinfo, $fielddata, $value, $data) {
+  if ($fielddata['options'] == 'nolink') {
+    return check_plain($value);
+  }
+  return l($value, $value);
+}
+
+/**
+ * Implementation of hook_views_style_plugins
+ */
+function project_views_style_plugins() {
+  $items['project_overview'] = array(
+    'name' => t('Project overview'),
+    'theme' => 'project_overview_view',
+    'validate' => 'views_ui_plugin_validate_list',  // I'm not sure if I need this and if so what it should do
+    'needs_fields' => true,
+    'weight' => 1,
+  );
+  return $items;
+}
+
+function theme_project_overview_view($view, $nodes, $type) {
+$version = -1;    // this is set for testing purposes.  There isn't an actual version selector yet.
+  foreach ($nodes as $node) {
+    $project = node_load(array('nid' => $node->nid));
+
+    // Merge $node properties (from views) into $project object
+    $properties = get_object_vars($node);
+    foreach ($properties as $property => $property_value) {
+      $project->$property = $property_value;
+    }
+
+    $project->links = array();
+    if ($version != -1) {
+      if ($project->project_release_nodes_file_path) {
+        $project->links['project_download'] = theme('project_release_download_link', $project->file_path, t('Download'), 'array');
+      }
+    }
+    else {
+      $release_type = $project->snapshot_table ? 'all' : 'official';
+      $project->download_table = theme('project_release_table_overview', $project, 'defaults', $release_type, t('Version'), FALSE);
+    }
+
+    $project->links['project_more_info'] = array(
+      'title' => t('Find out more'),
+      'href' => "node/$project->nid",
+    );
+    if ($project->project_issue_projects_issues) {
+      $project->links['project_issues'] = array(
+        'title' => t('Bugs and feature requests'),
+        'href' => "project/issues/$project->nid",
+      );
+    }
+// The different sort methods pages should probably be handled by views and not directly by project.module now. 
+//    if (module_invoke($module, 'project_sort_methods', 'group by date', $sort_method) && $date = _project_date($project->changed)) {
+//      $projects .= "<h3>$date</h3>";
+//    }
+    $project->class = ($class == 'even') ? 'odd': 'even';
+    $projects .= theme('project_summary', $project);
+    $class = $project->class;
+  }
+
+  $output = '<div class="project" id="project-overview">' . $projects . '</div>';
+  return $output;
+}
Index: project/release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.55
diff -u -p -r1.55 project_release.module
--- project/release/project_release.module	21 Oct 2007 19:45:45 -0000	1.55
+++ project/release/project_release.module	27 Nov 2007 12:20:24 -0000
@@ -47,6 +47,11 @@ function project_release_menu($may_cache
       }
     }
     drupal_add_css(drupal_get_path('module', 'project_release') .'/project_release.css');
+    $project_release_path = drupal_get_path('module', 'project_release');
+    if (module_exists('views')) {
+      require './'. $project_release_path .'/project_release_views.inc';
+    }
+
     project_release_get_api_taxonomy();
   }
   else {    // $may_cache
Index: project/release/project_release_views.inc
===================================================================
RCS file: project/release/project_release_views.inc
diff -N project/release/project_release_views.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ project/release/project_release_views.inc	27 Nov 2007 12:20:24 -0000
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Provides support for Views integration.
+ */
+
+/**
+ * Implementation of hook_views_tables
+ */
+function project_release_views_tables() {
+  $tables['project_release_nodes'] = array(
+    'name' => 'project_release_nodes',
+    'join' => array(
+      'type' => 'inner',
+      'left' => array(
+        'table' => 'project_projects',
+        'field' => 'nid'
+      ),
+      'right' => array(
+        'field' => 'pid'
+      ),
+    ),
+    'fields' => array(
+      'version' => array(
+        'name' => t('Project release: version'),
+        'sortable' => true,
+        'help' => t('The project release\'s version.'),
+      ),
+      'tag' => array(
+        'name' => t('Project release: tag'),
+        'sortable' => true,
+        'help' => t('The project release\'s tag.'),
+      ),
+      'file_path' => array(
+        'name' => t('Project release: file path'),
+        'sortable' => true,
+        'help' => t('The project release\'s file path.'),
+      ),
+      'file_date' => array(
+        'name' => t('Project release: file date'),
+        'sortable' => true,
+        'help' => t('The project release\'s file date.'),
+      ),
+      'file_hash' => array(
+        'name' => t('Project release: file hash'),
+        'help' => t('The project release\'s hash.'),
+        'sortable' => true,
+      ),
+      'version_major' => array(
+        'name' => t('Project release: version (major)'),
+        'help' => t('The project release\'s release major version.'),
+        'sortable' => true,
+      ),
+      'version_minor' => array(
+        'name' => t('Project release: version (minor)'),
+        'help' => t('The project release\'s minor version.'),
+        'sortable' => true,
+      ),
+      'version_patch' => array(
+        'name' => t('Project release: version (patch)'),
+        'help' => t('The project release\'s patch version.'),
+        'sortable' => true,
+      ),
+      'version_extra' => array(
+        'name' => t('Project release: version (extra)'),
+        'help' => t('The project release\'s extra version.'),
+        'sortable' => true,
+      ),
+     ),
+    'filters' => array(
+      'version' => array(
+        'name' => t('Project release: Version'),
+        'field' => 'version',
+        'operator' => array('=' => t('Equals')),
+        'list' => 'views_handler_filter_project_release_version',
+        'list-type' => 'select',
+        'help' => t('Filter by project release version.'),
+      ),
+    ),
+  );
+  return $tables;
+}
+
+function views_handler_filter_project_release_version() {
+  $versions = project_release_compatibility_list();
+  // Remove 'all' from the array since Views will
+  // add that back on its own.
+  if (!empty($versions[-1])) {
+    unset($versions[-1]);
+  }
+  return $versions;
+}
+
+// @todo:  create view? that gets all releases for a project
+// and for a specific version.  As we're displaying each of
+// the project overviews, embed the view for each of the projects
+// that shows releases.
+
+// @todo:  The version filter above is filtering based on
+// project version (which isn't really defined) instead
+// of project_release version.  I'm not sure how to filter
+// on the presence of one or more releases associated with a certain
+// version and a certain project.
