diff --git a/cod_session/cod_session.features.field.inc b/cod_session/cod_session.features.field.inc index 2b6bead..f23d715 100644 --- a/cod_session/cod_session.features.field.inc +++ b/cod_session/cod_session.features.field.inc @@ -5,11 +5,94 @@ */ /** - * Implementation of hook_field_default_fields(). + * Implements hook_field_default_fields(). */ function cod_session_field_default_fields() { $fields = array(); + // Exported field: 'node-page-body' + $fields['node-page-body'] = array( + 'field_config' => array( + 'active' => '1', + 'cardinality' => '1', + 'deleted' => '0', + 'entity_types' => array( + 0 => 'node', + ), + 'field_name' => 'body', + 'field_permissions' => array( + 'type' => '0', + ), + 'foreign keys' => array( + 'format' => array( + 'columns' => array( + 'format' => 'format', + ), + 'table' => 'filter_format', + ), + ), + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'module' => 'text', + 'settings' => array( + 'field_permissions' => array( + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', + 'view' => 'view', + 'view own' => 0, + ), + ), + 'translatable' => '1', + 'type' => 'text_with_summary', + ), + 'field_instance' => array( + 'bundle' => 'page', + 'default_value' => NULL, + 'deleted' => '0', + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array( + 'trim_length' => 600, + ), + 'type' => 'text_summary_or_trimmed', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'body', + 'label' => 'Body', + 'required' => FALSE, + 'settings' => array( + 'display_summary' => TRUE, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => -4, + ), + ), + ); + // Exported field: 'node-room-body' $fields['node-room-body'] = array( 'field_config' => array( @@ -20,6 +103,9 @@ function cod_session_field_default_fields() { 0 => 'node', ), 'field_name' => 'body', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array( 'format' => array( 'columns' => array( @@ -34,7 +120,15 @@ function cod_session_field_default_fields() { ), ), 'module' => 'text', - 'settings' => array(), + 'settings' => array( + 'field_permissions' => array( + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', + 'view' => 'view', + 'view own' => 0, + ), + ), 'translatable' => '1', 'type' => 'text_with_summary', ), @@ -49,7 +143,7 @@ function cod_session_field_default_fields() { 'module' => 'text', 'settings' => array(), 'type' => 'text_default', - 'weight' => '0', + 'weight' => '3', ), 'teaser' => array( 'label' => 'hidden', @@ -78,7 +172,7 @@ function cod_session_field_default_fields() { 'summary_rows' => 5, ), 'type' => 'text_textarea_with_summary', - 'weight' => '2', + 'weight' => '3', ), 'widget_type' => 'text_textarea_with_summary', ), @@ -123,7 +217,7 @@ function cod_session_field_default_fields() { 'module' => 'text', 'settings' => array(), 'type' => 'text_default', - 'weight' => '1', + 'weight' => '0', ), 'teaser' => array( 'label' => 'above', @@ -225,7 +319,71 @@ function cod_session_field_default_fields() { 'progress_indicator' => 'throbber', ), 'type' => 'image_image', - 'weight' => '3', + 'weight' => '4', + ), + ), + ); + + // Exported field: 'node-room-field_room_session_capacity' + $fields['node-room-field_room_session_capacity'] = array( + 'field_config' => array( + 'active' => '1', + 'cardinality' => '1', + 'deleted' => '0', + 'entity_types' => array(), + 'field_name' => 'field_room_session_capacity', + 'field_permissions' => array( + 'type' => '0', + ), + 'foreign keys' => array(), + 'indexes' => array(), + 'module' => 'number', + 'settings' => array(), + 'translatable' => '0', + 'type' => 'number_integer', + ), + 'field_instance' => array( + 'bundle' => 'room', + 'default_value' => NULL, + 'deleted' => '0', + 'description' => 'Number of sessions or BoFs that this room can hold in a time slot. Used to allow multiple BoFs in the same room at the same time slot.', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'number', + 'settings' => array( + 'decimal_separator' => '.', + 'prefix_suffix' => TRUE, + 'scale' => 0, + 'thousand_separator' => ' ', + ), + 'type' => 'number_integer', + 'weight' => '1', + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_room_session_capacity', + 'label' => 'Session capacity', + 'required' => 0, + 'settings' => array( + 'max' => '', + 'min' => '', + 'prefix' => '', + 'suffix' => '', + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 0, + 'module' => 'number', + 'settings' => array(), + 'type' => 'number', + 'weight' => '2', ), ), ); @@ -240,6 +398,9 @@ function cod_session_field_default_fields() { 0 => 'node', ), 'field_name' => 'body', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array( 'format' => array( 'columns' => array( @@ -254,7 +415,15 @@ function cod_session_field_default_fields() { ), ), 'module' => 'text', - 'settings' => array(), + 'settings' => array( + 'field_permissions' => array( + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', + 'view' => 'view', + 'view own' => 0, + ), + ), 'translatable' => '1', 'type' => 'text_with_summary', ), @@ -269,7 +438,7 @@ function cod_session_field_default_fields() { 'module' => 'text', 'settings' => array(), 'type' => 'text_default', - 'weight' => 0, + 'weight' => '0', ), 'teaser' => array( 'label' => 'hidden', @@ -311,6 +480,9 @@ function cod_session_field_default_fields() { 'deleted' => '0', 'entity_types' => array(), 'field_name' => 'field_accepted', + 'field_permissions' => array( + 'type' => '2', + ), 'foreign keys' => array(), 'indexes' => array( 'value' => array( @@ -320,6 +492,7 @@ function cod_session_field_default_fields() { 'module' => 'list', 'settings' => array( 'allowed_values' => array( + 0 => 'Unprocessed', 1 => 'Accepted', 2 => 'Declined', ), @@ -342,11 +515,11 @@ function cod_session_field_default_fields() { 'description' => '', 'display' => array( 'default' => array( - 'label' => 'above', + 'label' => 'inline', 'module' => 'list', 'settings' => array(), 'type' => 'list_default', - 'weight' => 1, + 'weight' => '2', ), 'teaser' => array( 'label' => 'above', @@ -372,6 +545,182 @@ function cod_session_field_default_fields() { ), ); + // Exported field: 'node-schedule_item-field_session_room' + $fields['node-schedule_item-field_session_room'] = array( + 'field_config' => array( + 'active' => '1', + 'cardinality' => '-1', + 'deleted' => '0', + 'entity_types' => array(), + 'field_name' => 'field_session_room', + 'field_permissions' => array( + 'type' => '0', + ), + 'foreign keys' => array( + 'nid' => array( + 'columns' => array( + 'nid' => 'nid', + ), + 'table' => 'node', + ), + ), + 'indexes' => array( + 'nid' => array( + 0 => 'nid', + ), + ), + 'module' => 'node_reference', + 'settings' => array( + 'field_permissions' => array( + 'create' => 0, + 'edit' => 'edit', + 'edit own' => 0, + 'view' => 'view', + 'view own' => 0, + ), + 'referenceable_types' => array( + 'article' => 0, + 'bof_session' => 0, + 'page' => 0, + 'room' => 'room', + 'schedule_item' => 0, + 'session' => 0, + 'time_slot' => 0, + ), + 'view' => array( + 'args' => array(), + 'display_name' => '', + 'view_name' => '', + ), + ), + 'translatable' => '1', + 'type' => 'node_reference', + ), + 'field_instance' => array( + 'bundle' => 'schedule_item', + 'default_value' => NULL, + 'deleted' => '0', + 'description' => 'Select room(s) in which the session occurs.', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'node_reference', + 'settings' => array(), + 'type' => 'node_reference_default', + 'weight' => '4', + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_session_room', + 'label' => 'Room', + 'required' => 0, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_buttons', + 'weight' => '5', + ), + ), + ); + + // Exported field: 'node-schedule_item-field_session_slot' + $fields['node-schedule_item-field_session_slot'] = array( + 'field_config' => array( + 'active' => '1', + 'cardinality' => '1', + 'deleted' => '0', + 'entity_types' => array(), + 'field_name' => 'field_session_slot', + 'field_permissions' => array( + 'type' => '0', + ), + 'foreign keys' => array( + 'nid' => array( + 'columns' => array( + 'nid' => 'nid', + ), + 'table' => 'node', + ), + ), + 'indexes' => array( + 'nid' => array( + 0 => 'nid', + ), + ), + 'module' => 'node_reference', + 'settings' => array( + 'field_permissions' => array( + 'create' => 0, + 'edit' => 'edit', + 'edit own' => 0, + 'view' => 'view', + 'view own' => 0, + ), + 'referenceable_types' => array( + 'article' => 0, + 'bof_session' => 0, + 'page' => 0, + 'room' => 0, + 'schedule_item' => 0, + 'session' => 0, + 'time_slot' => 'time_slot', + ), + 'view' => array( + 'args' => array(), + 'display_name' => '', + 'view_name' => '', + ), + ), + 'translatable' => '1', + 'type' => 'node_reference', + ), + 'field_instance' => array( + 'bundle' => 'schedule_item', + 'default_value' => NULL, + 'deleted' => '0', + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'inline', + 'module' => 'node_reference', + 'settings' => array(), + 'type' => 'node_reference_default', + 'weight' => '3', + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_session_slot', + 'label' => 'Time slot', + 'required' => 0, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_select', + 'weight' => '4', + ), + ), + ); + // Exported field: 'node-session-body' $fields['node-session-body'] = array( 'field_config' => array( @@ -382,6 +731,9 @@ function cod_session_field_default_fields() { 0 => 'node', ), 'field_name' => 'body', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array( 'format' => array( 'columns' => array( @@ -396,7 +748,15 @@ function cod_session_field_default_fields() { ), ), 'module' => 'text', - 'settings' => array(), + 'settings' => array( + 'field_permissions' => array( + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', + 'view' => 'view', + 'view own' => 0, + ), + ), 'translatable' => '1', 'type' => 'text_with_summary', ), @@ -411,7 +771,7 @@ function cod_session_field_default_fields() { 'module' => 'text', 'settings' => array(), 'type' => 'text_default', - 'weight' => 0, + 'weight' => '0', ), 'teaser' => array( 'label' => 'hidden', @@ -454,6 +814,9 @@ function cod_session_field_default_fields() { 'deleted' => '0', 'entity_types' => array(), 'field_name' => 'field_accepted', + 'field_permissions' => array( + 'type' => '2', + ), 'foreign keys' => array(), 'indexes' => array( 'value' => array( @@ -463,6 +826,7 @@ function cod_session_field_default_fields() { 'module' => 'list', 'settings' => array( 'allowed_values' => array( + 0 => 'Unprocessed', 1 => 'Accepted', 2 => 'Declined', ), @@ -480,16 +844,20 @@ function cod_session_field_default_fields() { ), 'field_instance' => array( 'bundle' => 'session', - 'default_value' => NULL, + 'default_value' => array( + 0 => array( + 'value' => '0', + ), + ), 'deleted' => '0', 'description' => '', 'display' => array( 'default' => array( - 'label' => 'above', + 'label' => 'inline', 'module' => 'list', 'settings' => array(), 'type' => 'list_default', - 'weight' => 7, + 'weight' => '8', ), 'teaser' => array( 'label' => 'above', @@ -501,7 +869,7 @@ function cod_session_field_default_fields() { 'entity_type' => 'node', 'field_name' => 'field_accepted', 'label' => 'Status', - 'required' => 0, + 'required' => 1, 'settings' => array( 'user_register_form' => FALSE, ), @@ -523,6 +891,9 @@ function cod_session_field_default_fields() { 'deleted' => '0', 'entity_types' => array(), 'field_name' => 'field_experience', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array(), 'indexes' => array( 'value' => array( @@ -538,7 +909,7 @@ function cod_session_field_default_fields() { ), 'allowed_values_function' => '', 'field_permissions' => array( - 'create' => 0, + 'create' => 'create', 'edit' => 'edit', 'edit own' => 0, 'view' => 'view', @@ -559,7 +930,7 @@ function cod_session_field_default_fields() { 'module' => 'list', 'settings' => array(), 'type' => 'list_default', - 'weight' => 4, + 'weight' => '6', ), 'teaser' => array( 'label' => 'above', @@ -571,7 +942,7 @@ function cod_session_field_default_fields() { 'entity_type' => 'node', 'field_name' => 'field_experience', 'label' => 'Experience level', - 'required' => 1, + 'required' => 0, 'settings' => array( 'user_register_form' => FALSE, ), @@ -589,10 +960,13 @@ function cod_session_field_default_fields() { $fields['node-session-field_session_room'] = array( 'field_config' => array( 'active' => '1', - 'cardinality' => '1', + 'cardinality' => '-1', 'deleted' => '0', 'entity_types' => array(), 'field_name' => 'field_session_room', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array( 'nid' => array( 'columns' => array( @@ -616,6 +990,9 @@ function cod_session_field_default_fields() { 'view own' => 0, ), 'referenceable_types' => array( + 'article' => 0, + 'bof_session' => 0, + 'page' => 0, 'room' => 'room', 'schedule_item' => 0, 'session' => 0, @@ -637,11 +1014,11 @@ function cod_session_field_default_fields() { 'description' => 'Select room(s) in which the session occurs.', 'display' => array( 'default' => array( - 'label' => 'above', + 'label' => 'inline', 'module' => 'node_reference', 'settings' => array(), 'type' => 'node_reference_default', - 'weight' => 6, + 'weight' => '7', ), 'teaser' => array( 'label' => 'above', @@ -675,6 +1052,9 @@ function cod_session_field_default_fields() { 'deleted' => '0', 'entity_types' => array(), 'field_name' => 'field_session_slot', + 'field_permissions' => array( + 'type' => '0', + ), 'foreign keys' => array( 'nid' => array( 'columns' => array( @@ -698,6 +1078,9 @@ function cod_session_field_default_fields() { 'view own' => 0, ), 'referenceable_types' => array( + 'article' => 0, + 'bof_session' => 0, + 'page' => 0, 'room' => 0, 'schedule_item' => 0, 'session' => 0, @@ -719,11 +1102,11 @@ function cod_session_field_default_fields() { 'description' => '', 'display' => array( 'default' => array( - 'label' => 'above', + 'label' => 'inline', 'module' => 'node_reference', 'settings' => array(), 'type' => 'node_reference_default', - 'weight' => 5, + 'weight' => '6', ), 'teaser' => array( 'label' => 'above', @@ -775,9 +1158,9 @@ function cod_session_field_default_fields() { 'display_default' => 1, 'display_field' => 1, 'field_permissions' => array( - 'create' => 0, - 'edit' => 'edit', - 'edit own' => 0, + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', 'view' => 'view', 'view own' => 0, ), @@ -796,7 +1179,7 @@ function cod_session_field_default_fields() { 'module' => 'file', 'settings' => array(), 'type' => 'file_default', - 'weight' => 2, + 'weight' => '2', ), 'teaser' => array( 'label' => 'above', @@ -852,9 +1235,9 @@ function cod_session_field_default_fields() { 'module' => 'user_reference', 'settings' => array( 'field_permissions' => array( - 'create' => 0, - 'edit' => 'edit', - 'edit own' => 0, + 'create' => 'create', + 'edit' => 0, + 'edit own' => 'edit own', 'view' => 'view', 'view own' => 0, ), @@ -862,6 +1245,7 @@ function cod_session_field_default_fields() { 2 => 0, 3 => 0, 4 => 0, + 5 => 0, ), 'referenceable_status' => array( 0 => 0, @@ -887,7 +1271,7 @@ function cod_session_field_default_fields() { 'module' => 'user_reference', 'settings' => array(), 'type' => 'user_reference_default', - 'weight' => 1, + 'weight' => '1', ), 'teaser' => array( 'label' => 'above', @@ -940,9 +1324,9 @@ function cod_session_field_default_fields() { ), 'allowed_values_function' => '', 'field_permissions' => array( - 'create' => 0, + 'create' => 'create', 'edit' => 'edit', - 'edit own' => 0, + 'edit own' => 'edit own', 'view' => 'view', 'view own' => 0, ), @@ -957,11 +1341,11 @@ function cod_session_field_default_fields() { 'description' => '', 'display' => array( 'default' => array( - 'label' => 'above', + 'label' => 'inline', 'module' => 'list', 'settings' => array(), 'type' => 'list_default', - 'weight' => 3, + 'weight' => '5', ), 'teaser' => array( 'label' => 'above', @@ -1108,9 +1492,11 @@ function cod_session_field_default_fields() { t('Description'); t('Experience level'); t('How many people does this space hold?'); + t('Number of sessions or BoFs that this room can hold in a time slot. Used to allow multiple BoFs in the same room at the same time slot.'); t('Photo'); t('Room'); t('Select room(s) in which the session occurs.'); + t('Session capacity'); t('Slides'); t('Speaker(s)'); t('Status'); diff --git a/cod_session/cod_session.features.inc b/cod_session/cod_session.features.inc index 7d19db7..175694f 100644 --- a/cod_session/cod_session.features.inc +++ b/cod_session/cod_session.features.inc @@ -5,7 +5,7 @@ */ /** - * Implementation of hook_ctools_plugin_api(). + * Implements hook_ctools_plugin_api(). */ function cod_session_ctools_plugin_api() { list($module, $api) = func_get_args(); @@ -19,10 +19,126 @@ function cod_session_ctools_plugin_api() { } /** - * Implementation of hook_node_info(). + * Implements hook_flag_default_flags(). + */ +function cod_session_flag_default_flags() { + $flags = array(); + // Exported flag: "Speaker confirmation flag". + $flags['session_confirm'] = array( + 'content_type' => 'node', + 'title' => 'Speaker confirmation flag', + 'global' => '0', + 'types' => array( + 0 => 'session', + ), + 'flag_short' => 'I confirm that I can present this sesssion at the listed date and time.', + 'flag_long' => 'Once confirmed, you cannot unconfirm without contacting the session organizers.', + 'flag_message' => 'Thanks for confirming that you can present [title] at this date and time!', + 'unflag_short' => 'Cancel confirmation', + 'unflag_long' => '', + 'unflag_message' => '', + 'unflag_denied_text' => 'You have confirmed that you will be presenting for this session.', + 'link_type' => 'toggle', + 'roles' => array( + 'flag' => array( + 0 => '2', + ), + 'unflag' => array(), + ), + 'show_on_page' => 1, + 'show_on_teaser' => 1, + 'show_on_form' => 0, + 'access_author' => '', + 'i18n' => 0, + 'module' => 'cod_session', + 'locked' => array( + 0 => 'name', + ), + 'api_version' => 2, + ); + // Exported flag: "Session Attending". + $flags['session_schedule'] = array( + 'content_type' => 'node', + 'title' => 'Session Attending', + 'global' => '0', + 'types' => array( + 0 => 'schedule_item', + 1 => 'session', + ), + 'flag_short' => 'Add to your schedule', + 'flag_long' => 'Add this session to your personal session attendance.', + 'flag_message' => 'Session added', + 'unflag_short' => 'Remove from your schedule', + 'unflag_long' => 'Remove this session from your schedule', + 'unflag_message' => 'Session removed', + 'unflag_denied_text' => '', + 'link_type' => 'toggle', + 'roles' => array( + 'flag' => array(), + 'unflag' => array(), + ), + 'show_on_page' => 0, + 'show_on_teaser' => 1, + 'show_on_form' => 0, + 'access_author' => '', + 'i18n' => 0, + 'api_version' => 2, + 'module' => 'cod_session', + 'locked' => array( + 0 => 'name', + ), + ); + // Exported flag: "Session Vote". + $flags['session_vote'] = array( + 'content_type' => 'node', + 'title' => 'Session Vote', + 'global' => '0', + 'types' => array( + 0 => 'session', + ), + 'flag_short' => 'Vote for this session', + 'flag_long' => 'Vote for this session', + 'flag_message' => 'Your vote has been recorded!', + 'unflag_short' => 'Retract vote', + 'unflag_long' => 'Retract your vote for this session.', + 'unflag_message' => 'Your vote has been retracted.', + 'unflag_denied_text' => '', + 'link_type' => 'toggle', + 'roles' => array( + 'flag' => array( + 0 => 3, + ), + 'unflag' => array( + 0 => 3, + ), + ), + 'show_on_page' => 1, + 'show_on_teaser' => 0, + 'show_on_form' => 0, + 'access_author' => '', + 'i18n' => 0, + 'api_version' => 2, + 'module' => 'cod_session', + 'locked' => array( + 0 => 'name', + ), + ); + return $flags; +} + +/** + * Implements hook_node_info(). */ function cod_session_node_info() { $items = array( + 'page' => array( + 'name' => t('Basic page'), + 'base' => 'node_content', + 'description' => t('Use basic pages for your static content, such as an \'About us\' page.'), + 'has_title' => '1', + 'title_label' => t('Title'), + 'help' => '', + ), 'room' => array( 'name' => t('Room'), 'base' => 'node_content', diff --git a/cod_session/cod_session.features.user_permission.inc b/cod_session/cod_session.features.user_permission.inc index dfc0257..d5d7869 100644 --- a/cod_session/cod_session.features.user_permission.inc +++ b/cod_session/cod_session.features.user_permission.inc @@ -5,139 +5,170 @@ */ /** - * Implementation of hook_user_default_permissions(). + * Implements hook_user_default_permissions(). */ function cod_session_user_default_permissions() { $permissions = array(); - // Exported permission: edit field_accepted - $permissions['edit field_accepted'] = array( - 'name' => 'edit field_accepted', + // Exported permission: create field_accepted + $permissions['create field_accepted'] = array( + 'name' => 'create field_accepted', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), 'module' => 'field_permissions', ); - // Exported permission: edit field_experience - $permissions['edit field_experience'] = array( - 'name' => 'edit field_experience', - 'roles' => array(), + // Exported permission: create room content + $permissions['create room content'] = array( + 'name' => 'create room content', + 'roles' => array( + 0 => 'session organizer', + ), + 'module' => 'node', ); - // Exported permission: edit field_session_room - $permissions['edit field_session_room'] = array( - 'name' => 'edit field_session_room', - 'roles' => array(), + // Exported permission: create schedule_item content + $permissions['create schedule_item content'] = array( + 'name' => 'create schedule_item content', + 'roles' => array( + 0 => 'session organizer', + ), + 'module' => 'node', ); - // Exported permission: edit field_session_slot - $permissions['edit field_session_slot'] = array( - 'name' => 'edit field_session_slot', - 'roles' => array(), + // Exported permission: create session content + $permissions['create session content'] = array( + 'name' => 'create session content', + 'roles' => array( + 0 => 'authenticated user', + ), + 'module' => 'node', ); - // Exported permission: edit field_slides - $permissions['edit field_slides'] = array( - 'name' => 'edit field_slides', - 'roles' => array(), + // Exported permission: create time_slot content + $permissions['create time_slot content'] = array( + 'name' => 'create time_slot content', + 'roles' => array( + 0 => 'session organizer', + ), + 'module' => 'node', ); - // Exported permission: edit field_slot_datetime - $permissions['edit field_slot_datetime'] = array( - 'name' => 'edit field_slot_datetime', + // Exported permission: delete any room content + $permissions['delete any room content'] = array( + 'name' => 'delete any room content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: edit field_speakers - $permissions['edit field_speakers'] = array( - 'name' => 'edit field_speakers', + // Exported permission: delete any schedule_item content + $permissions['delete any schedule_item content'] = array( + 'name' => 'delete any schedule_item content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: edit field_track - $permissions['edit field_track'] = array( - 'name' => 'edit field_track', + // Exported permission: delete any session content + $permissions['delete any session content'] = array( + 'name' => 'delete any session content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: view field_accepted - $permissions['view field_accepted'] = array( - 'name' => 'view field_accepted', + // Exported permission: delete any time_slot content + $permissions['delete any time_slot content'] = array( + 'name' => 'delete any time_slot content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: view field_experience - $permissions['view field_experience'] = array( - 'name' => 'view field_experience', - 'roles' => array(), + // Exported permission: delete own session content + $permissions['delete own session content'] = array( + 'name' => 'delete own session content', + 'roles' => array( + 0 => 'authenticated user', + ), + 'module' => 'node', ); - // Exported permission: view field_session_room - $permissions['view field_session_room'] = array( - 'name' => 'view field_session_room', + // Exported permission: edit any room content + $permissions['edit any room content'] = array( + 'name' => 'edit any room content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: view field_session_slot - $permissions['view field_session_slot'] = array( - 'name' => 'view field_session_slot', + // Exported permission: edit any schedule_item content + $permissions['edit any schedule_item content'] = array( + 'name' => 'edit any schedule_item content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: view field_slides - $permissions['view field_slides'] = array( - 'name' => 'view field_slides', - 'roles' => array(), + // Exported permission: edit any session content + $permissions['edit any session content'] = array( + 'name' => 'edit any session content', + 'roles' => array( + 0 => 'session organizer', + ), + 'module' => 'node', ); - // Exported permission: view field_slot_datetime - $permissions['view field_slot_datetime'] = array( - 'name' => 'view field_slot_datetime', + // Exported permission: edit any time_slot content + $permissions['edit any time_slot content'] = array( + 'name' => 'edit any time_slot content', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', ), - 'module' => 'field_permissions', + 'module' => 'node', ); - // Exported permission: view field_speakers - $permissions['view field_speakers'] = array( - 'name' => 'view field_speakers', - 'roles' => array(), + // Exported permission: edit field_accepted + $permissions['edit field_accepted'] = array( + 'name' => 'edit field_accepted', + 'roles' => array( + 0 => 'session organizer', + ), + 'module' => 'field_permissions', ); - // Exported permission: view field_track - $permissions['view field_track'] = array( - 'name' => 'view field_track', + // Exported permission: edit own field_accepted + $permissions['edit own field_accepted'] = array( + 'name' => 'edit own field_accepted', 'roles' => array( 0 => 'session organizer', - 1 => 'site administrator', + ), + 'module' => 'field_permissions', + ); + + // Exported permission: edit own session content + $permissions['edit own session content'] = array( + 'name' => 'edit own session content', + 'roles' => array( + 0 => 'authenticated user', + ), + 'module' => 'node', + ); + + // Exported permission: view field_accepted + $permissions['view field_accepted'] = array( + 'name' => 'view field_accepted', + 'roles' => array( + 0 => 'anonymous user', + 1 => 'authenticated user', ), 'module' => 'field_permissions', ); diff --git a/cod_session/cod_session.features.user_role.inc b/cod_session/cod_session.features.user_role.inc index f90adc5..187327d 100644 --- a/cod_session/cod_session.features.user_role.inc +++ b/cod_session/cod_session.features.user_role.inc @@ -5,7 +5,7 @@ */ /** - * Implementation of hook_user_default_roles(). + * Implements hook_user_default_roles(). */ function cod_session_user_default_roles() { $roles = array(); diff --git a/cod_session/cod_session.field_group.inc b/cod_session/cod_session.field_group.inc index 16bccaf..2ed24c8 100644 --- a/cod_session/cod_session.field_group.inc +++ b/cod_session/cod_session.field_group.inc @@ -5,12 +5,40 @@ */ /** - * Implementation of hook_field_group_info(). + * Implements hook_field_group_info(). */ function cod_session_field_group_info() { $export = array(); - $field_group = new stdClass; + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_audience|node|session|default'; + $field_group->group_name = 'group_audience'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'session'; + $field_group->mode = 'default'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'Audience', + 'weight' => '4', + 'children' => array( + 0 => 'field_experience', + 1 => 'field_track', + ), + 'format_type' => 'fieldset', + 'format_settings' => array( + 'formatter' => 'collapsible', + 'instance_settings' => array( + 'description' => '', + 'classes' => '', + ), + ), + ); + $export['group_audience|node|session|default'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ $field_group->api_version = 1; $field_group->identifier = 'group_audience|node|session|form'; $field_group->group_name = 'group_audience'; @@ -36,7 +64,64 @@ function cod_session_field_group_info() { ); $export['group_audience|node|session|form'] = $field_group; - $field_group = new stdClass; + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_schedule_info|node|schedule_item|default'; + $field_group->group_name = 'group_schedule_info'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'schedule_item'; + $field_group->mode = 'default'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'Schedule info', + 'weight' => '1', + 'children' => array( + 0 => 'field_accepted', + 1 => 'field_session_slot', + 2 => 'field_session_room', + ), + 'format_type' => 'fieldset', + 'format_settings' => array( + 'formatter' => 'collapsible', + 'instance_settings' => array( + 'description' => '', + 'classes' => '', + ), + ), + ); + $export['group_schedule_info|node|schedule_item|default'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_schedule_info|node|session|default'; + $field_group->group_name = 'group_schedule_info'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'session'; + $field_group->mode = 'default'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'Schedule info', + 'weight' => '3', + 'children' => array( + 0 => 'field_accepted', + 1 => 'field_session_room', + 2 => 'field_session_slot', + ), + 'format_type' => 'fieldset', + 'format_settings' => array( + 'formatter' => 'collapsible', + 'instance_settings' => array( + 'description' => '', + 'classes' => '', + ), + ), + ); + $export['group_schedule_info|node|session|default'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ $field_group->api_version = 1; $field_group->identifier = 'group_schedule|node|schedule_item|form'; $field_group->group_name = 'group_schedule'; @@ -49,19 +134,24 @@ function cod_session_field_group_info() { 'weight' => '1', 'children' => array( 0 => 'field_accepted', + 1 => 'field_session_slot', + 2 => 'field_session_room', ), 'format_type' => 'fieldset', 'format_settings' => array( - 'formatter' => 'collapsible', + 'label' => 'Schedule Info', 'instance_settings' => array( + 'required_fields' => 0, 'classes' => '', - 'required_fields' => 1, + 'description' => '', ), + 'formatter' => 'collapsible', ), ); $export['group_schedule|node|schedule_item|form'] = $field_group; - $field_group = new stdClass; + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ $field_group->api_version = 1; $field_group->identifier = 'group_schedule|node|session|form'; $field_group->group_name = 'group_schedule'; diff --git a/cod_session/cod_session.info b/cod_session/cod_session.info index 8744ccd..cee05a8 100644 --- a/cod_session/cod_session.info +++ b/cod_session/cod_session.info @@ -1,22 +1,43 @@ +name = "COD Session" +description = "COD Session Scheduling & Voting" core = "7.x" +package = "COD" +php = "5.2.4" +project = "cod_session" +dependencies[] = "auto_nodetitle" dependencies[] = "date" dependencies[] = "date_popup" dependencies[] = "features" dependencies[] = "field_group" dependencies[] = "field_permissions" +dependencies[] = "flag" dependencies[] = "image" dependencies[] = "list" +dependencies[] = "menu" dependencies[] = "node_reference" +dependencies[] = "number" +dependencies[] = "page_manager" +dependencies[] = "panels" +dependencies[] = "search" dependencies[] = "strongarm" dependencies[] = "user_reference" -description = "COD Session Scheduling & Voting" +dependencies[] = "views" +dependencies[] = "views_bulk_operations" +dependencies[] = "views_content" +dependencies[] = "views_ui" +datestamp = "1312320179" features[ctools][] = "field_group:field_group:1" features[ctools][] = "strongarm:strongarm:1" +features[ctools][] = "views:views_default:3.0" +features[field][] = "node-page-body" features[field][] = "node-room-body" features[field][] = "node-room-field_room_capacity" features[field][] = "node-room-field_room_photo" +features[field][] = "node-room-field_room_session_capacity" features[field][] = "node-schedule_item-body" features[field][] = "node-schedule_item-field_accepted" +features[field][] = "node-schedule_item-field_session_room" +features[field][] = "node-schedule_item-field_session_slot" features[field][] = "node-session-body" features[field][] = "node-session-field_accepted" features[field][] = "node-session-field_experience" @@ -26,29 +47,44 @@ features[field][] = "node-session-field_slides" features[field][] = "node-session-field_speakers" features[field][] = "node-session-field_track" features[field][] = "node-time_slot-field_slot_datetime" +features[field_group][] = "group_audience|node|session|default" features[field_group][] = "group_audience|node|session|form" +features[field_group][] = "group_schedule_info|node|schedule_item|default" +features[field_group][] = "group_schedule_info|node|session|default" features[field_group][] = "group_schedule|node|schedule_item|form" features[field_group][] = "group_schedule|node|session|form" +features[flag][] = "session_confirm" +features[flag][] = "session_schedule" +features[flag][] = "session_vote" +features[menu_custom][] = "main-menu" +features[menu_custom][] = "menu-menu-quick-links" +features[menu_links][] = "main-menu:node/76" +features[menu_links][] = "main-menu:program" +features[menu_links][] = "main-menu:program/sessions" +features[menu_links][] = "menu-menu-quick-links:program/session-schedule/your-schedule" +features[node][] = "page" features[node][] = "room" features[node][] = "schedule_item" features[node][] = "session" features[node][] = "time_slot" +features[user_permission][] = "create field_accepted" +features[user_permission][] = "create room content" +features[user_permission][] = "create schedule_item content" +features[user_permission][] = "create session content" +features[user_permission][] = "create time_slot content" +features[user_permission][] = "delete any room content" +features[user_permission][] = "delete any schedule_item content" +features[user_permission][] = "delete any session content" +features[user_permission][] = "delete any time_slot content" +features[user_permission][] = "delete own session content" +features[user_permission][] = "edit any room content" +features[user_permission][] = "edit any schedule_item content" +features[user_permission][] = "edit any session content" +features[user_permission][] = "edit any time_slot content" features[user_permission][] = "edit field_accepted" -features[user_permission][] = "edit field_experience" -features[user_permission][] = "edit field_session_room" -features[user_permission][] = "edit field_session_slot" -features[user_permission][] = "edit field_slides" -features[user_permission][] = "edit field_slot_datetime" -features[user_permission][] = "edit field_speakers" -features[user_permission][] = "edit field_track" +features[user_permission][] = "edit own field_accepted" +features[user_permission][] = "edit own session content" features[user_permission][] = "view field_accepted" -features[user_permission][] = "view field_experience" -features[user_permission][] = "view field_session_room" -features[user_permission][] = "view field_session_slot" -features[user_permission][] = "view field_slides" -features[user_permission][] = "view field_slot_datetime" -features[user_permission][] = "view field_speakers" -features[user_permission][] = "view field_track" features[user_role][] = "session organizer" features[variable][] = "comment_anonymous_room" features[variable][] = "comment_anonymous_schedule_item" @@ -66,6 +102,7 @@ features[variable][] = "comment_form_location_room" features[variable][] = "comment_form_location_schedule_item" features[variable][] = "comment_form_location_session" features[variable][] = "comment_form_location_time_slot" +features[variable][] = "comment_page" features[variable][] = "comment_preview_room" features[variable][] = "comment_preview_schedule_item" features[variable][] = "comment_preview_session" @@ -78,11 +115,21 @@ features[variable][] = "comment_subject_field_schedule_item" features[variable][] = "comment_subject_field_session" features[variable][] = "comment_subject_field_time_slot" features[variable][] = "comment_time_slot" +features[variable][] = "menu_options_time_slot" +features[variable][] = "menu_parent_time_slot" +features[variable][] = "node_options_page" features[variable][] = "node_options_room" features[variable][] = "node_options_schedule_item" features[variable][] = "node_options_session" features[variable][] = "node_options_time_slot" -name = "COD Session" -package = "COD" -php = "5.2.4" -project = "cod_session" +features[variable][] = "node_preview_time_slot" +features[variable][] = "node_submitted_page" +features[variable][] = "node_submitted_time_slot" +features[views_view][] = "cod_schedule" +features[views_view][] = "cod_time_slots" +features[views_view][] = "schedule_room_list" +features[views_view][] = "sessions" +features[views_view][] = "sessions_admin" +features[views_view][] = "sessions_admin_contact" +features[views_view][] = "sessions_speaker_confirmation" +files[] = "cod_session_views_style_plugin_schedule.inc" diff --git a/cod_session/cod_session.module b/cod_session/cod_session.module index 272de88..a8c8177 100644 --- a/cod_session/cod_session.module +++ b/cod_session/cod_session.module @@ -5,3 +5,1012 @@ */ include_once('cod_session.features.inc'); + +// Define variables values for scheduling content types. +define('COD_SCHEDULE_SINGLE', 'single'); +define('COD_SCHEDULE_MULTIPLE', 'multiple'); + +/** + * Implements hook_permission(). + */ +function cod_session_permission() { + $perms = array(); + /** + * Define a custom set of permissions to control content type scheduling. This + * gets around CCK Field Permissions because it disallows edit and view should + * access check return false. Certain roles should be able to schedule certain + * content types and so edit and view of room and time slot nodereference + * fields should be allowed for authenticated users and these custom + * permissions can disallow. + */ + $types = cod_session_schedulable_types(); + if (!empty($types)) { + foreach ($types as $type => $content_type) { + $perms['schedule ' . $type] = array('title' => 'Schedule a ' . $content_type); + } + } + return $perms; +} + +/** + * Helper function to determine content types with room and time slot fields. + */ +function cod_session_schedulable_types() { + $schedulable_types = array(); + $types = node_type_get_types(); + foreach ($types as $type => $content_type) { + $bundle = field_info_instances('node', $type); + if (isset($bundle['field_session_room']) && isset($bundle['field_session_slot'])) { + $schedulable_types[$type] = $content_type->name; + } + } + return $schedulable_types; +} + +/** + * Implements hook_field_access(). + */ +function cod_session_field_access($op, $field, $entity_type, $entity, $account) { + switch ($op) { + case 'edit': + // Respect custom schedule permission. + if (!user_access('schedule ' . $entity_type, $account) && ($field['field_name'] == 'field_session_room' || $field['field_name'] == 'field_session_slot')) { + return FALSE; + } + } + return TRUE; +} + +/** + * Helper function determines if user can create and schedule content. + */ +function cod_session_schedule_access($node_type = 'session', $account = NULL) { + if (!$account) { + global $user; + $account = $user; + } + // @todo remove when ready to turn bof-scheduler into scheduler-form + // or when ready to make Prepopulate arguments work for sessions as well as + // bofs. + if ($node_type == 'session') { + return FALSE; + } + // Also check cod_session's field access override. + $node_obj = new stdClass(); + $node_obj->type = $node_type; + $field_room = array( + 'field_name' => 'field_session_room', + ); + + $field_slot = array( + 'field_name' => 'field_session_slot', + ); + return user_access('create ' . $node_type . ' content', $account) + && user_access('edit field_session_room', $account) + && user_access('edit field_session_slot', $account) + && cod_session_field_access('edit', $field_room, $node_type, $node_obj, $account) + && cod_session_field_access('edit', $field_slot, $node_type, $node_obj, $account); +} + +/** + * Implements hook_menu(). + */ +function cod_session_menu() { + $items['scheduler-form/%'] = array( + 'title callback' => '_cod_session_scheduler_title', + 'title arguments' => array(1), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('cod_session_schedule_form', 1), + 'access callback' => 'cod_session_schedule_access', + 'access arguments' => array(1), + 'type' => MENU_CALLBACK, + ); + + return $items; +} + +/** + * Implements hook_form_FORM_ID_alter(). + */ +function cod_session_form_node_type_form_alter(&$form, &$form_state, $form_id) { + if (isset($form['#node_type'])) { + // Provide scheduling controls for this content type. + $form['cod_session'] = array( + '#type' => 'fieldset', + '#title' => t('Scheduling settings'), + '#description' => t('Scheduling is only available to content types that have room and time slot nodereference fields'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#group' => 'additional_settings', + ); + $form['cod_session']['cod_unique'] = array( + '#title' => t('Can content of this type share time slots with other scheduled content?'), + '#type' => 'radios', + '#options' => array( + 'single' => t('No, content of this type overrides room availability and occupies entire time slot'), + 'multiple' => t('Yes, content of this type can share a time slot if there is room availability'), + ), + '#default_value' => variable_get('cod_unique_' . $form['#node_type']->type, COD_SCHEDULE_SINGLE), + '#description' => t('Scheduled items (such as sessions, schedule items and BoFs) can share a room and time slot with other scheduled items or be configured here to occupy the entire room for that time slot.'), + // @todo, also make reference to room spanning? + ); + } +} + +/** + * Implements hook_form_alter(). + */ +function cod_session_form_alter(&$form, &$form_state, $form_id) { + // Prepopulate the current user into the Speakers field + // on new session creation. + if ($form_id == 'session_node_form') { + if (isset($form['field_speakers'])) { + // Form tweaks for the Speakers field: + $form['field_speakers'][LANGUAGE_NONE]['add_more']['#value'] = t('Add another speaker'); + // Prepopulate the current user into the Speakers field + // on new session creation. + if (empty($form['#node']->nid)) { + global $user; + $form['field_speakers'][LANGUAGE_NONE][0]['uid']['#default_value'] = $user->uid; + } + } + } +} + +/** + * Form submit handler for bof node form. + */ +function _cod_session_unschedule(&$form, &$form_state, $form_id) { + if ($form_state['values']['op'] == $form_state['values']['cod_unschedule']) { + // Unset scheduled room and time slot. + $form_state['values']['field_session_room'][0]['nid'] = NULL; + $form_state['values']['field_session_slot'][0]['nid'] = NULL; + drupal_set_message(t('%name has been unscheduled. To reshedule, click "Schedule a session" on any available time slot.', array('%name' => $form_state['values']['title']))); + // @todo set redirect? + } +} + +/** + * Get schedulable content created by a user. + * + * @param object $account + * Account to retrieve content for. + * @param string $type + * Content type to search for. + * @param boolean $unscheduled + * Whether to return all BoFs or just those unscheduled. + * @return array + * Array of BoF nodes or empty. + */ +function cod_session_users_content($account, $type, $unscheduled = FALSE) { + $nids = $bofs = array(); + + if (!$unscheduled) { + $sql = "SELECT n.nid FROM {node} n WHERE n.type = ':type' AND n.uid = :uid AND n.status = 1"; + } + else { + $sql = "SELECT n.nid + FROM {node} n + INNER JOIN {field_data_field_session_room} r ON r.entity_id = n.nid AND r.revision_id = n.vid + INNER JOIN {field_data_field_session_slot} s ON s.entity_id = n.nid AND s.revision_id = n.vid + WHERE n.type = ':type' AND n.uid = ':uid' AND n.status = 1 AND r.field_session_room_nid IS NULL AND s.field_session_slot_nid IS NULL"; + } + $result = db_query($sql, array(':type' => $type, ':uid' => $account->uid)); + foreach ($result as $record) { + $nids[] = $record['nid']; + } + if (empty($nids)) { + return array(); + } + foreach ($nids as $nid) { + $bofs[$nid] = node_load($nid); + } + return $bofs; +} + +/** + * Custom schedule form. + */ +function cod_session_schedule_form($form, &$form_state, $type) { + global $user; + $url_query = array(); + // COD BoF uses Prepopulate so retrieve room and time slot from the request. + if (isset($_REQUEST['edit'])) { + $room_nid = $_REQUEST['edit']['field_session_room']['nid']['nid']; + $slot_nid = $_REQUEST['edit']['field_session_slot']['nid']['nid']; + // Pass along Prepopulate and destination parameters in case the user + // chooses to add a new BoF. + $url_query = array( + 'edit[field_session_room][nid][nid]' => $room_nid, + 'edit[field_session_slot][nid][nid]' => $slot_nid, + ); + $room = node_load($room_nid); + $slot = node_load($slot_nid); + // Sanity check that bad data wasn't passed. + if ($slot->type != 'time_slot' || $slot->status != 1 || $room->type != 'room' || $room->status != 1) { + drupal_access_denied(); + return; + } + } + else { + // No arguments so 404. + drupal_not_found(); + return; + } + $type_info = node_type_get_types($type); + + // Show unscheduled content for this user. + $sessions = cod_session_users_content($user, $type, TRUE); + if (empty($sessions)) { + // Unset destination to prevent drupal_goto() from following it. + unset($_GET['destination']); + // Redirect to node add if the user has no unscheduled content. + drupal_goto('node/add/' . $type, $url_query); + } + + foreach ($sessions as $session) { + $options[$session->nid] = check_plain($session->title); + } + $form['session'] = array( + '#type' => 'radios', + '#title' => t('Pick a @name to schedule', array('@name' => $type_info->name)), + '#options' => $options, + '#default_value' => array_shift(array_keys($options)), + ); + $url_query['destination'] = $_GET['destination']; + $form['add_session'] = array( + '#type' => 'markup', + '#value' => '