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
This commit is contained in:
Marton Kiss 2016-08-08 18:26:37 +02:00
parent 719d8f3a17
commit ffe419d1a1
6 changed files with 182 additions and 14 deletions

View File

@ -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,

View File

@ -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');

View File

@ -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

View File

@ -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;

View File

@ -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'));
}

View File

@ -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();