diff --git a/entity_translation.api.php b/entity_translation.api.php
index c048d11..b968878 100644
--- a/entity_translation.api.php
+++ b/entity_translation.api.php
@@ -48,6 +48,8 @@
* - edit form: The key to be used to retrieve the entity object from the form
* state array. An empty value prevents Entity translation from performing
* alterations to the entity form. Defaults to ENTITY_TYPE.
+ * - skip original values access: A flag specifying whether skipping access
+ * control when editing original values for this entity. Defaults to FALSE.
*/
function hook_entity_info() {
$info['custom_entity'] = array(
diff --git a/entity_translation.info b/entity_translation.info
index 58c8771..f4ba85d 100644
--- a/entity_translation.info
+++ b/entity_translation.info
@@ -8,6 +8,7 @@ files[] = includes/translation.handler.inc
files[] = includes/translation.handler.comment.inc
files[] = includes/translation.handler.node.inc
files[] = includes/translation.handler.taxonomy_term.inc
+files[] = includes/translation.handler.user.inc
files[] = tests/entity_translation.test
files[] = views/entity_translation_handler_relationship.inc
files[] = views/entity_translation_handler_field_translate_link.inc
diff --git a/entity_translation.install b/entity_translation.install
index ffff0b8..d973b1d 100644
--- a/entity_translation.install
+++ b/entity_translation.install
@@ -93,6 +93,73 @@ function entity_translation_install() {
// Make translation use the content language type.
variable_set('translation_language_type', LANGUAGE_TYPE_CONTENT);
+
+ // Grant the 'edit original values' permission, so we don't break editing on
+ // existing sites.
+ $msg = _entity_translation_grant_original_values_permissions();
+ drupal_set_message($msg);
+}
+
+/**
+ * Grant 'edit $type original values' permission to existing roles.
+ */
+function _entity_translation_grant_original_values_permissions() {
+ $permissions = array();
+
+ // Nodes.
+ $permissions['node'][] = 'bypass node access';
+ foreach (node_permissions_get_configured_types() as $type) {
+ $permissions['node'][] = "edit own $type content";
+ $permissions['node'][] = "edit any $type content";
+ }
+
+ // Comments.
+ $permissions['comment'][] = 'administer comments';
+ if (module_exists('comment')) {
+ $permissions['comment'][] = 'edit own comments';
+ }
+
+ // Taxonomy terms.
+ if (module_exists('taxonomy')) {
+ $permissions['taxonomy_term'][] = 'administer taxonomy';
+ foreach (taxonomy_get_vocabularies() as $vocabulary) {
+ $permissions['taxonomy_term'][] = "edit terms in {$vocabulary->vid}";
+ }
+ }
+
+ $assignments = array();
+ foreach ($permissions as $entity_type => $permissions_filter) {
+ $permission = "edit $entity_type original values";
+ $assignments[] = _entity_translation_grant_permission($permission, $permissions_filter);
+ }
+ $assignments = '
- ' . implode('
- ', $assignments) . '
';
+
+ $t = get_t();
+ return $t('The following permissions have been assigned to existing roles: !assignments', array('!assignments' => $assignments));
+}
+
+/**
+ * Grant the given permission to all roles which already have any of the
+ * permissions specified in the $permissions_filter parameter.
+ *
+ * @param $permission
+ * The new permission which to grant.
+ * @param $permissions_filter
+ * List of permissions used for loading roles.
+ *
+ * @return
+ * A message describing permission changes.
+ */
+function _entity_translation_grant_permission($permission, $permissions_filter = NULL) {
+ $roles = user_roles(FALSE, $permissions_filter);
+ foreach ($roles as $rid => $role) {
+ user_role_grant_permissions($rid, array($permission));
+ }
+ $t = get_t();
+ return $t('%permission was assigned to %roles', array(
+ '%permission' => $permission,
+ '%roles' => implode(', ', $roles)
+ ));
}
/**
@@ -167,3 +234,10 @@ function entity_translation_update_7001() {
->condition('name', 'entity_translation')
->execute();
}
+
+/**
+ * Grant 'edit original values' permission to roles which have entity editing permissions.
+ */
+function entity_translation_update_7002() {
+ return _entity_translation_grant_original_values_permissions();
+}
diff --git a/entity_translation.module b/entity_translation.module
index 01934df..71b01b0 100644
--- a/entity_translation.module
+++ b/entity_translation.module
@@ -84,6 +84,15 @@ function entity_translation_entity_info() {
);
}
+ $info['user'] = array(
+ 'translation' => array(
+ 'entity_translation' => array(
+ 'class' => 'EntityTranslationUserHandler',
+ 'skip original values access' => TRUE,
+ ),
+ ),
+ );
+
return $info;
}
@@ -510,14 +519,14 @@ function entity_translation_permission() {
'title' => t('Edit shared fields'),
'description' => t('Edit fields shared between translations on the translation form.'),
),
- 'edit original values' => array(
- 'title' => t('Edit original values'),
- 'description' => t('Access the entity edit form in the original language.'),
- ),
'translate any entity' => array(
'title' => t('Translate any entity'),
'description' => t('Translate field content for any fieldable entity.'),
),
+ 'edit original values' => array(
+ 'title' => t('Edit original values'),
+ 'description' => t('Access any entity edit form in the original language.'),
+ ),
);
foreach (entity_get_info() as $entity_type => $info) {
@@ -527,6 +536,16 @@ function entity_translation_permission() {
'title' => t('Translate entities of type @type', array('@type' => $label)),
'description' => t('Translate field content for entities of type @type.', array('@type' => $label)),
);
+
+ // Avoid access control for original values on the current entity.
+ if (!empty($info['translation']['entity_translation']['skip original values access'])) {
+ continue;
+ }
+
+ $permission["edit $entity_type original values"] = array(
+ 'title' => t('Edit original values on entities of type @type', array('@type' => $label)),
+ 'description' => t('Access the edit form in the original language for entities of type @type.', array('@type' => $label)),
+ );
}
}
diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc
index 5c64f3b..63ff802 100644
--- a/includes/translation.handler.inc
+++ b/includes/translation.handler.inc
@@ -662,7 +662,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
* @see EntityTranslationHandlerInterface::getTranslationAccess()
*/
public function getTranslationAccess($langcode) {
- return $langcode != $this->getLanguage() || user_access('edit original values');
+ return $langcode != $this->getLanguage() || user_access('edit original values') || user_access("edit {$this->entityType} original values");
}
/**
diff --git a/includes/translation.handler.user.inc b/includes/translation.handler.user.inc
new file mode 100644
index 0000000..a1c75f8
--- /dev/null
+++ b/includes/translation.handler.user.inc
@@ -0,0 +1,23 @@
+