From ffe419d1a188e6214f685da10b76cfba00056ecc Mon Sep 17 00:00:00 2001 From: Marton Kiss Date: Mon, 8 Aug 2016 18:26:37 +0200 Subject: [PATCH] Custom membership fields and reporting Until we don't have integration for other social media tools than meetup.com and cannot automate data fetching, this patch adds the ability to enter the data manually by group admins. Two fields has been added: - group_members_source: represents the data source of group size data - field_group_members: represents the size of the group The reports were also updated, so the regional membership report and membership report calculates with the aggregated membership data. Change-Id: Id1df05e4f7181c9109a7737da4fbb8ec60fa5053 --- .../groups_groups.features.field_base.inc | 45 +++++++- .../groups_groups.features.field_instance.inc | 107 ++++++++++++++++-- .../groups/groups_groups/groups_groups.info | 4 + .../groups/groups_groups/groups_groups.module | 6 + .../groups_reports/groups_reports.install | 10 +- .../groups_reports/groups_reports.module | 24 +++- 6 files changed, 182 insertions(+), 14 deletions(-) diff --git a/modules/groups/groups_groups/groups_groups.features.field_base.inc b/modules/groups/groups_groups/groups_groups.features.field_base.inc index 5e9c3f9..3f9aa5c 100644 --- a/modules/groups/groups_groups/groups_groups.features.field_base.inc +++ b/modules/groups/groups_groups/groups_groups.features.field_base.inc @@ -119,7 +119,50 @@ function groups_groups_field_default_field_bases() { 'type' => 'field_group_location', ); - // Exported field_base: 'field_group_status' + // Exported field_base: 'field_group_members'. + $field_bases['field_group_members'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_group_members', + 'indexes' => array(), + 'locked' => 0, + 'module' => 'number', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'number_integer', + ); + + // Exported field_base: 'field_group_members_source'. + $field_bases['field_group_members_source'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_group_members_source', + 'indexes' => array( + 'value' => array( + 0 => 'value', + ), + ), + 'locked' => 0, + 'module' => 'list', + 'settings' => array( + 'allowed_values' => array( + 1 => 'Linkedin', + 2 => 'Facebook', + 3 => 'Google Groups', + 4 => 'Weibo', + 5 => 'Other', + ), + 'allowed_values_function' => '', + ), + 'translatable' => 0, + 'type' => 'list_text', + ); + + // Exported field_base: 'field_group_status'. $field_bases['field_group_status'] = array( 'active' => 1, 'cardinality' => 1, diff --git a/modules/groups/groups_groups/groups_groups.features.field_instance.inc b/modules/groups/groups_groups/groups_groups.features.field_instance.inc index b20e0e0..f6d3e70 100644 --- a/modules/groups/groups_groups/groups_groups.features.field_instance.inc +++ b/modules/groups/groups_groups/groups_groups.features.field_instance.inc @@ -51,7 +51,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'options', 'settings' => array(), 'type' => 'options_buttons', - 'weight' => 50, + 'weight' => 13, ), ); @@ -90,7 +90,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'geofield', 'settings' => array(), 'type' => 'geofield_latlon', - 'weight' => 47, + 'weight' => 8, ), ); @@ -132,11 +132,98 @@ function groups_groups_field_default_field_instances() { 'module' => 'field_group_location', 'settings' => array(), 'type' => 'field_group_location', - 'weight' => 46, + 'weight' => 7, ), ); - // Exported field_instance: 'node-group-field_group_status' + // Exported field_instance: 'node-group-field_group_members'. + $field_instances['node-group-field_group_members'] = array( + 'bundle' => 'group', + 'default_value' => array( + 0 => array( + 'value' => 0, + ), + ), + 'deleted' => 0, + 'description' => 'Number of user group members from other source than meetup.com.', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'number', + 'settings' => array( + 'decimal_separator' => '.', + 'prefix_suffix' => TRUE, + 'scale' => 0, + 'thousand_separator' => '', + ), + 'type' => 'number_integer', + 'weight' => 22, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_group_members', + 'label' => 'group_members', + 'required' => 0, + 'settings' => array( + 'max' => '', + 'min' => '', + 'prefix' => '', + 'suffix' => '', + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 0, + 'module' => 'number', + 'settings' => array(), + 'type' => 'number', + 'weight' => 12, + ), + ); + + // Exported field_instance: 'node-group-field_group_members_source'. + $field_instances['node-group-field_group_members_source'] = array( + 'bundle' => 'group', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'list', + 'settings' => array(), + 'type' => 'list_default', + 'weight' => 23, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_group_members_source', + 'label' => 'group_members_source', + 'required' => 0, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_select', + 'weight' => 11, + ), + ); + + // Exported field_instance: 'node-group-field_group_status'. $field_instances['node-group-field_group_status'] = array( 'bundle' => 'group', 'default_value' => array( @@ -173,7 +260,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'options', 'settings' => array(), 'type' => 'options_select', - 'weight' => 48, + 'weight' => 9, ), ); @@ -223,7 +310,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'number', 'settings' => array(), 'type' => 'number', - 'weight' => 49, + 'weight' => 10, ), ); @@ -260,7 +347,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'field_property_list', 'settings' => array(), 'type' => 'field_property_list', - 'weight' => 45, + 'weight' => 5, ), ); @@ -301,7 +388,7 @@ function groups_groups_field_default_field_instances() { 'module' => 'options', 'settings' => array(), 'type' => 'options_select', - 'weight' => 51, + 'weight' => 14, ), ); @@ -310,8 +397,12 @@ function groups_groups_field_default_field_instances() { t('Ambassadors'); t('Group location'); t('Group status'); + t('Number of user group members from other source than meetup.com.'); t('Resource links'); + t('Timezone'); t('geofield'); + t('group_members'); + t('group_members_source'); t('meetup_members'); t('Timezone'); diff --git a/modules/groups/groups_groups/groups_groups.info b/modules/groups/groups_groups/groups_groups.info index 9a4e9e4..30ddc9f 100644 --- a/modules/groups/groups_groups/groups_groups.info +++ b/modules/groups/groups_groups/groups_groups.info @@ -28,6 +28,8 @@ features[features_api][] = api:2 features[field_base][] = field_ambassadors features[field_base][] = field_geofield features[field_base][] = field_group_location +features[field_base][] = field_group_members +features[field_base][] = field_group_members_source features[field_base][] = field_group_status features[field_base][] = field_meetup_members features[field_base][] = field_resource_links @@ -35,6 +37,8 @@ features[field_base][] = field_timezone features[field_instance][] = node-group-field_ambassadors features[field_instance][] = node-group-field_geofield features[field_instance][] = node-group-field_group_location +features[field_instance][] = node-group-field_group_members +features[field_instance][] = node-group-field_group_members_source features[field_instance][] = node-group-field_group_status features[field_instance][] = node-group-field_meetup_members features[field_instance][] = node-group-field_resource_links diff --git a/modules/groups/groups_groups/groups_groups.module b/modules/groups/groups_groups/groups_groups.module index c8589e8..ac03164 100644 --- a/modules/groups/groups_groups/groups_groups.module +++ b/modules/groups/groups_groups/groups_groups.module @@ -195,6 +195,12 @@ function groups_groups_form_alter(&$form, &$form_state, $form_id) { $form['field_timezone']['#access'] = $is_community_mgr || $is_group_admin || $is_administrator; + // allow group admins to manage group membership field + $form['field_group_members']['#access'] = $is_community_mgr || $is_group_admin + || $is_administrator; + $form['field_group_members_source']['#access'] = $is_community_mgr || $is_group_admin + || $is_administrator; + $form['field_group_location']['und'][0]['location']['#title'] = 'City (optional)'; // reorder resource links, group location $form['field_resource_links']['#weight'] = 21; diff --git a/modules/groups/groups_reports/groups_reports.install b/modules/groups/groups_reports/groups_reports.install index fef23b2..554bbe9 100644 --- a/modules/groups/groups_reports/groups_reports.install +++ b/modules/groups/groups_reports/groups_reports.install @@ -40,7 +40,15 @@ function groups_reports_schema() { 'default' => '', ), ), - 'primary key' => array('nid', 'timestamp'), + 'primary key' => array('nid', 'timestamp', 'datasrc'), ); return $schema; } + +/** + * Update primary key of groups_membership_stat table + */ +function groups_reports_update_7100() { + db_drop_primary_key('groups_membership_stat'); + db_add_primary_key('groups_membership_stat', array('nid', 'timestamp', 'datasrc')); +} diff --git a/modules/groups/groups_reports/groups_reports.module b/modules/groups/groups_reports/groups_reports.module index 1eb9df4..39976e5 100644 --- a/modules/groups/groups_reports/groups_reports.module +++ b/modules/groups/groups_reports/groups_reports.module @@ -74,18 +74,32 @@ function groups_reports_update_membership_stat($timestamp = null) { ->execute(); foreach ($result as $record) { $node = node_load($record->nid); + // update meetup.com membership data $membercount = 0; if (isset($node->field_meetup_members[LANGUAGE_NONE])) { $membercount = (int)$node->field_meetup_members[LANGUAGE_NONE][0]['value']; } db_merge('groups_membership_stat') - ->key(array('nid' => $node->nid, 'timestamp' => $timestr)) + ->key(array('nid' => $node->nid, 'timestamp' => $timestr, 'datasrc' => 'M')) ->fields(array( 'nid' => $node->nid, 'timestamp' => $timestr, 'membercount' => $membercount, 'datasrc' => 'M', ))->execute(); + // update alternate membership data + $membercount = 0; + if (isset($node->field_group_members[LANGUAGE_NONE])) { + $membercount = (int)$node->field_group_members[LANGUAGE_NONE][0]['value']; + } + db_merge('groups_membership_stat') + ->key(array('nid' => $node->nid, 'timestamp' => $timestr, 'datasrc' => 'C')) + ->fields(array( + 'nid' => $node->nid, + 'timestamp' => $timestr, + 'membercount' => $membercount, + 'datasrc' => 'C', + ))->execute(); } watchdog('Groups Reports', 'Groups membership statistics had been updated.', array(), WATCHDOG_INFO); } @@ -357,12 +371,14 @@ function groups_report_get_regional_membership_report($date) { $query->leftJoin('groups_membership_stat', 's', 'n.nid = s.nid'); $query->fields('n', array('nid', 'title')); $query->fields('l', array('field_group_location_continent', 'field_group_location_country')); - $query->fields('s', array('membercount')); + $query->addExpression('sum(s.membercount)', 'membercount'); $query->condition('n.type', 'group', '='); $query->condition('n.status', 1, '='); $query->condition('s.timestamp', gmdate('Ymd', $date), '='); - $query->orderBy('l.field_group_location_continent', 'ASC'); - $query->orderBy('n.title', 'ASC'); + $query->groupBy('n.title'); + $query->groupBy('n.nid'); + $query->groupBy('l.field_group_location_continent'); + $query->groupBy('l.field_group_location_country'); $result = $query->execute(); $rows = array(); $totals = array();