|
@@ -8,18 +8,128 @@
|
|
|
* @license Licensed under the General Public License version 2 and later, and the CeCILL 2.0 license.
|
|
|
*/
|
|
|
|
|
|
+/**
|
|
|
+ * Information/utility class about CaseTracker in a Migrate context.
|
|
|
+ */
|
|
|
+class CaseTrackerMeta {
|
|
|
+ public static function getFields() {
|
|
|
+ $fields = array(
|
|
|
+ 'pid' => t('Case project'),
|
|
|
+ 'case_number' => t('Case number'),
|
|
|
+ 'assign_to' => t('Case assigned to'),
|
|
|
+ 'case_priority_id' => t('Case priority'),
|
|
|
+ 'case_type_id' => t('Case type'),
|
|
|
+ 'case_status_id' => t('Case status'),
|
|
|
+ );
|
|
|
+ return $fields;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class MigrateDestinationCommentFollowup extends MigrateDestinationComment {
|
|
|
+
|
|
|
+ public function __construct() {
|
|
|
+ parent::__construct(MigrateDestinationNodeCase::ct_bundle);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Could also be implemented as a migrate hook_migrate_fields() in module.
|
|
|
+ * Which is best ?
|
|
|
+ *
|
|
|
+ * (non-PHPdoc)
|
|
|
+ * @see MigrateDestinationComment::fields()
|
|
|
+ */
|
|
|
+ public function fields() {
|
|
|
+ $fields = parent::fields();
|
|
|
+ $fields['revision_id'] = t('Ticket revision ID');
|
|
|
+ $fields += CaseTrackerMeta::getFields();
|
|
|
+ return $fields;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function prepare($entity, stdClass $source_row) {
|
|
|
+ $ticket = node_load($entity->nid);
|
|
|
+
|
|
|
+ // ticket->casetracker is assigned by CT to both new and old, so clone is
|
|
|
+ // required, to avoid overwriting one state with the other
|
|
|
+ $entity->casetracker = clone $ticket->casetracker;
|
|
|
+
|
|
|
+ // CT needs a name in assign_to, not an uid
|
|
|
+ $entity->casetracker->assign_to = casetracker_get_name($entity->casetracker->assign_to);
|
|
|
+ //print_r($entity);
|
|
|
+
|
|
|
+ $entity->revision_id = $ticket->vid;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Casetracker-specific destination node handling
|
|
|
+ */
|
|
|
+class MigrateDestinationNodeCase extends MigrateDestinationNode {
|
|
|
+ const ct_bundle = 'casetracker_basic_case';
|
|
|
+
|
|
|
+ public function __construct() {
|
|
|
+ parent::__construct(self::ct_bundle);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Could also be implemented as a migrate hook_migrate_fields() in module.
|
|
|
+ * Which is best ?
|
|
|
+ *
|
|
|
+ * (non-PHPdoc)
|
|
|
+ * @see MigrateDestinationNode::fields()
|
|
|
+ */
|
|
|
+ public function fields() {
|
|
|
+ $fields = parent::fields();
|
|
|
+ $fields += CaseTrackerMeta::getFields();
|
|
|
+ return $fields;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Casetracker saves its fields in a separate stdClass extra field.
|
|
|
+ *
|
|
|
+ * (non-PHPdoc)
|
|
|
+ * @see MigrateDestinationEntity::prepare()
|
|
|
+ */
|
|
|
+ public function prepare($entity, stdClass $source_row) {
|
|
|
+ $extraFields = array(
|
|
|
+ 'pid',
|
|
|
+ 'case_priority_id',
|
|
|
+ 'case_type_id',
|
|
|
+ 'assign_to',
|
|
|
+ 'case_status_id',
|
|
|
+ );
|
|
|
+
|
|
|
+ $entity->casetracker = new stdClass();
|
|
|
+ foreach ($extraFields as $extra) {
|
|
|
+ if (isset($entity->$extra)) {
|
|
|
+ $entity->casetracker->$extra = $entity->$extra;
|
|
|
+ unset($entity->extra);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $entity->casetracker->case_type_id = 9; // Bug. Case type is not a default Unfuddle field
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
abstract class UnfuddleMigration extends XMLMigration {
|
|
|
- public $items_url;
|
|
|
+ protected static $fields = array();
|
|
|
public $item_ID_xpath = 'id';
|
|
|
+ public $items_url;
|
|
|
public $unmigratedDestinations = array();
|
|
|
public $unmigratedSources = array();
|
|
|
- protected static $fields = array();
|
|
|
|
|
|
public function __construct($group) {
|
|
|
parent::__construct($group);
|
|
|
$this->items_url = file_directory_path() . '/unfuddle/backup.xml';
|
|
|
}
|
|
|
|
|
|
+ public function addXPathFieldMapping($destination_field, $source_field, $xpath = NULL) {
|
|
|
+ if (!isset($xpath)) {
|
|
|
+ $xpath = $source_field;
|
|
|
+ }
|
|
|
+ return $this->addFieldMapping($destination_field, $source_field)
|
|
|
+ ->xpath($xpath);
|
|
|
+ }
|
|
|
+
|
|
|
public function afterConstruct() {
|
|
|
$this->addUnmigratedDestinations($this->unmigratedDestinations, t('White hole'));
|
|
|
$this->addUnmigratedSources($this->unmigratedSources, t('Black hole'));
|
|
@@ -34,13 +144,6 @@ abstract class UnfuddleMigration extends XMLMigration {
|
|
|
return self::$fields;
|
|
|
}
|
|
|
|
|
|
- public function addXPathFieldMapping($destination_field, $source_field, $xpath = NULL) {
|
|
|
- if (!isset($xpath)) {
|
|
|
- $xpath = $source_field;
|
|
|
- }
|
|
|
- return $this->addFieldMapping($destination_field, $source_field)
|
|
|
- ->xpath($xpath);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -75,35 +178,6 @@ class UnfuddlePeopleMigration extends UnfuddleMigration {
|
|
|
'updated-at',
|
|
|
);
|
|
|
|
|
|
- protected static function getFieldInfo() {
|
|
|
- self::$fields = array(
|
|
|
- 'account-id' => t('Unfuddle account Id'),
|
|
|
- 'id' => t('User account ID'),
|
|
|
- 'created-at' => t('User account creation timestamp'),
|
|
|
- 'email' => t('Current email address for the account'),
|
|
|
- 'first-name' => t('User given name'),
|
|
|
- 'identity-url' => t('OpenID URL for the user account'),
|
|
|
- 'is-administrator' => t('User is an Unfuddle project administrator'),
|
|
|
- 'is-removed' => t('User account has been removed'),
|
|
|
- 'last-name' => t('User last name'),
|
|
|
- 'last-signed-in' => t('Latest login timestamp'),
|
|
|
- 'notification-frequency' => t('Unfuddle notification frequency'),
|
|
|
- 'notification-ignore-self' => t('Ignore self when sending notifications'),
|
|
|
- 'notification-last-sent' => t('Timestamp of latest notification sent'),
|
|
|
- 'notification-scope-messages' => t('Send message notifications'),
|
|
|
- 'notification-scope-milestones' => t('Send milestones notifications'),
|
|
|
- 'notification-scope-notebooks' => t('Send notebooks notifications'),
|
|
|
- 'notification-scope-source' => t('Send source notifications'),
|
|
|
- 'notification-scope-tickets' => t('Send tickets notifications'),
|
|
|
- 'text-markup' => t('Preferred markup format for issues'),
|
|
|
- 'time-zone' => t('Timezone'),
|
|
|
- 'updated-at' => t('Timestamp of latest user account change'),
|
|
|
- 'username' => t('The user account login name'),
|
|
|
- );
|
|
|
-
|
|
|
- return parent::getFieldInfo();
|
|
|
- }
|
|
|
-
|
|
|
public function __construct() {
|
|
|
parent::__construct(MigrateGroup::getInstance('Unfuddle'));
|
|
|
|
|
@@ -145,6 +219,35 @@ class UnfuddlePeopleMigration extends UnfuddleMigration {
|
|
|
$this->afterConstruct();
|
|
|
}
|
|
|
|
|
|
+ protected static function getFieldInfo() {
|
|
|
+ self::$fields = array(
|
|
|
+ 'account-id' => t('Unfuddle account Id'),
|
|
|
+ 'id' => t('User account ID'),
|
|
|
+ 'created-at' => t('User account creation timestamp'),
|
|
|
+ 'email' => t('Current email address for the account'),
|
|
|
+ 'first-name' => t('User given name'),
|
|
|
+ 'identity-url' => t('OpenID URL for the user account'),
|
|
|
+ 'is-administrator' => t('User is an Unfuddle project administrator'),
|
|
|
+ 'is-removed' => t('User account has been removed'),
|
|
|
+ 'last-name' => t('User last name'),
|
|
|
+ 'last-signed-in' => t('Latest login timestamp'),
|
|
|
+ 'notification-frequency' => t('Unfuddle notification frequency'),
|
|
|
+ 'notification-ignore-self' => t('Ignore self when sending notifications'),
|
|
|
+ 'notification-last-sent' => t('Timestamp of latest notification sent'),
|
|
|
+ 'notification-scope-messages' => t('Send message notifications'),
|
|
|
+ 'notification-scope-milestones' => t('Send milestones notifications'),
|
|
|
+ 'notification-scope-notebooks' => t('Send notebooks notifications'),
|
|
|
+ 'notification-scope-source' => t('Send source notifications'),
|
|
|
+ 'notification-scope-tickets' => t('Send tickets notifications'),
|
|
|
+ 'text-markup' => t('Preferred markup format for issues'),
|
|
|
+ 'time-zone' => t('Timezone'),
|
|
|
+ 'updated-at' => t('Timestamp of latest user account change'),
|
|
|
+ 'username' => t('The user account login name'),
|
|
|
+ );
|
|
|
+
|
|
|
+ return parent::getFieldInfo();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* - Timestamp format conversion not needed, as per MigrationBase::timestamp()
|
|
|
* - Invert is-removed to convert to status
|
|
@@ -198,6 +301,46 @@ class UnfuddleProjectMigration extends UnfuddleMigration {
|
|
|
'categories', // @todo TODO Taxonomy ?
|
|
|
);
|
|
|
|
|
|
+ public function __construct() {
|
|
|
+ parent::__construct(MigrateGroup::getInstance('Unfuddle'));
|
|
|
+ $item_xpath = '/account/projects/project';
|
|
|
+ $items_class = new MigrateItemsXML($this->items_url, $item_xpath, $this->item_ID_xpath);
|
|
|
+ $this->source = new MigrateSourceMultiItems($items_class, self::getFieldInfo());
|
|
|
+ $source_key = array(
|
|
|
+ 'id' => array(
|
|
|
+ 'type' => 'int',
|
|
|
+ 'unsigned' => TRUE,
|
|
|
+ 'not null' => TRUE,
|
|
|
+ )
|
|
|
+ );
|
|
|
+
|
|
|
+ $this->dependencies = array('UnfuddlePeople');
|
|
|
+ $this->destination = new MigrateDestinationNode('casetracker_basic_project');
|
|
|
+ $this->map = new MigrateSQLMap('unfuddle_project',
|
|
|
+ $source_key,
|
|
|
+ MigrateDestinationNode::getKeySchema());
|
|
|
+
|
|
|
+ $this->addXPathFieldMapping('created', 'created-at');
|
|
|
+ $this->addXPathFieldMapping('status', 'archived')
|
|
|
+ ->description(t('Inverted when converting to node.status'));
|
|
|
+ $this->addXPathFieldMapping('body', 'description')
|
|
|
+ ->description(t('Applying site default input format: will often be wrong'));
|
|
|
+ $this->addXPathFieldMapping('teaser', node_teaser('description', FILTER_FORMAT_DEFAULT))
|
|
|
+ ->description(t('Applying site default input format: will often be wrong'));
|
|
|
+ $this->addXPathFieldMapping('changed', 'updated-at');
|
|
|
+ $this->addXPathFieldMapping('title', 'title');
|
|
|
+
|
|
|
+ $this->addXPathFieldMapping('uid', NULL)
|
|
|
+ ->sourceMigration('UnfuddlePeople')
|
|
|
+ ->defaultValue(1);
|
|
|
+ $this->addXPathFieldMapping('revision_uid', NULL)
|
|
|
+ ->sourceMigration('UnfuddlePeople')
|
|
|
+ ->defaultValue(1);
|
|
|
+ $this->addXPathFieldMapping('path', 'short-name')
|
|
|
+ ->description(t('Auto-aliased to project/(short-name)'));
|
|
|
+ $this->afterConstruct();
|
|
|
+ }
|
|
|
+
|
|
|
protected static function getFieldInfo() {
|
|
|
self::$fields = array(
|
|
|
'account-id' => t('Unfuddle account Id'),
|
|
@@ -244,9 +387,51 @@ class UnfuddleProjectMigration extends UnfuddleMigration {
|
|
|
return self::$fields;
|
|
|
}
|
|
|
|
|
|
+ public function preparerow(stdClass $row) {
|
|
|
+ $row->xml->{'archived'} = ((int) $row->xml->{'archived'}) ? 0 : 1;
|
|
|
+ $row->xml->{'short-name'} = 'project/'. drupal_clean_css_identifier($row->xml->{'short-name'});
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Import ticket follow-up (comments) data from Unfuddle into CaseTracker project comments
|
|
|
+ */
|
|
|
+class UnfuddleTicketFollowupMigration extends UnfuddleMigration {
|
|
|
+ public $unmigratedDestinations = array(
|
|
|
+ 'hostname',
|
|
|
+ 'status',
|
|
|
+ 'thread',
|
|
|
+ 'name',
|
|
|
+ 'mail',
|
|
|
+ 'homepage',
|
|
|
+ 'language',
|
|
|
+ 'revision_id',
|
|
|
+ );
|
|
|
+
|
|
|
+ public $unmigratedSources = array(
|
|
|
+ 'created-at',
|
|
|
+ 'body-format',
|
|
|
+ 'parent-type',
|
|
|
+ );
|
|
|
+
|
|
|
+ protected static function getFieldInfo() {
|
|
|
+ self::$fields = array(
|
|
|
+ 'author-id' => t('Comment author'),
|
|
|
+ 'body' => t('Comment text. Applying site default input format: will often be wrong'),
|
|
|
+ 'body-format' => t('Comment text input format. No direct mapping to Drupal format defaults'),
|
|
|
+ 'created-at' => t('The follow-up creation timestamp'),
|
|
|
+ 'updated-at' => t('The follow-up latest update timestamp'),
|
|
|
+ 'parent-id' => t('The ticket to which the follow-up applies'),
|
|
|
+ 'parent-type' => t('The follow-up parent type: always Ticket'),
|
|
|
+ 'x-subject' => t('Virtual: from body'),
|
|
|
+ );
|
|
|
+
|
|
|
+ return self::$fields;
|
|
|
+ }
|
|
|
+
|
|
|
public function __construct() {
|
|
|
parent::__construct(MigrateGroup::getInstance('Unfuddle'));
|
|
|
- $item_xpath = '/account/projects/project';
|
|
|
+ $item_xpath = '/account/projects/project/tickets/ticket/comments/comment';
|
|
|
$items_class = new MigrateItemsXML($this->items_url, $item_xpath, $this->item_ID_xpath);
|
|
|
$this->source = new MigrateSourceMultiItems($items_class, self::getFieldInfo());
|
|
|
$source_key = array(
|
|
@@ -257,93 +442,38 @@ class UnfuddleProjectMigration extends UnfuddleMigration {
|
|
|
)
|
|
|
);
|
|
|
|
|
|
- $this->dependencies = array('UnfuddlePeople');
|
|
|
- $this->destination = new MigrateDestinationNode('casetracker_basic_project');
|
|
|
- $this->map = new MigrateSQLMap('unfuddle_project',
|
|
|
+ $this->dependencies = array('UnfuddlePeople', 'UnfuddleProject', 'UnfuddleTicket');
|
|
|
+ $this->destination = new MigrateDestinationCommentFollowup();
|
|
|
+ $this->map = new MigrateSQLMap('unfuddle_ticket_followup',
|
|
|
$source_key,
|
|
|
MigrateDestinationNode::getKeySchema());
|
|
|
|
|
|
- $this->addXPathFieldMapping('created', 'created-at');
|
|
|
- $this->addXPathFieldMapping('status', 'archived')
|
|
|
- ->description(t('Inverted when converting to node.status'));
|
|
|
- $this->addXPathFieldMapping('body', 'description')
|
|
|
- ->description(t('Applying site default input format: will often be wrong'));
|
|
|
- $this->addXPathFieldMapping('teaser', node_teaser('description', FILTER_FORMAT_DEFAULT))
|
|
|
+ $ar1 = drupal_map_assoc($this->unmigratedDestinations);
|
|
|
+ $ar2 = CaseTrackerMeta::getFields();
|
|
|
+ $this->unmigratedDestinations = array_keys($ar1 + $ar2); // Note: PID ignored
|
|
|
+
|
|
|
+ $this->addXPathFieldMapping('uid', 'author-id')
|
|
|
+ ->sourceMigration('UnfuddlePeople');
|
|
|
+ $this->addXPathFieldMapping('comment', 'body')
|
|
|
->description(t('Applying site default input format: will often be wrong'));
|
|
|
- $this->addXPathFieldMapping('changed', 'updated-at');
|
|
|
- $this->addXPathFieldMapping('title', 'title');
|
|
|
+ $this->addXPathFieldMapping('nid', 'parent-id')
|
|
|
+ ->sourceMigration('UnfuddleTicket');
|
|
|
+ $this->addXPathFieldMapping('timestamp', 'updated-at');
|
|
|
+ $this->addXPathFieldMapping('subject', 'x-subject')
|
|
|
+ ->description(t('Generated'));
|
|
|
|
|
|
- $this->addXPathFieldMapping('uid', NULL)
|
|
|
- ->sourceMigration('UnfuddlePeople')
|
|
|
- ->defaultValue(1);
|
|
|
- $this->addXPathFieldMapping('revision_uid', NULL)
|
|
|
- ->sourceMigration('UnfuddlePeople')
|
|
|
- ->defaultValue(1);
|
|
|
- $this->addXPathFieldMapping('path', 'short-name')
|
|
|
- ->description(t('Auto-aliased to project/(short-name)'));
|
|
|
$this->afterConstruct();
|
|
|
}
|
|
|
|
|
|
public function preparerow(stdClass $row) {
|
|
|
- $row->xml->{'archived'} = ((int) $row->xml->{'archived'}) ? 0 : 1;
|
|
|
- $row->xml->{'short-name'} = 'project/'. drupal_clean_css_identifier($row->xml->{'short-name'});
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-class MigrateDestinationNodeCase extends MigrateDestinationNode {
|
|
|
- public function __construct() {
|
|
|
- parent::__construct('casetracker_basic_case');
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Could also be implemented as a migrate hook_migrate_fields() in module.
|
|
|
- * Which is best ?
|
|
|
- *
|
|
|
- * (non-PHPdoc)
|
|
|
- * @see MigrateDestinationNode::fields()
|
|
|
- */
|
|
|
- public function fields() {
|
|
|
- $fields = parent::fields();
|
|
|
- $fields += array(
|
|
|
- 'pid' => t('Case project'),
|
|
|
- 'case_number' => t('Case number'),
|
|
|
- 'assign_to' => t('Case assigned to'),
|
|
|
- 'case_priority_id' => t('Case priority'),
|
|
|
- 'case_type_id' => t('Case type'),
|
|
|
- 'case_status_id' => t('Case status'),
|
|
|
- );
|
|
|
- return $fields;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Casetracker saves its fields in a separate stdClass extra field.
|
|
|
- *
|
|
|
- * (non-PHPdoc)
|
|
|
- * @see MigrateDestinationEntity::prepare()
|
|
|
- */
|
|
|
- public function prepare($entity, stdClass $source_row) {
|
|
|
- $extraFields = array(
|
|
|
- 'pid',
|
|
|
- 'case_priority_id',
|
|
|
- 'case_type_id',
|
|
|
- 'assign_to',
|
|
|
- 'case_status_id',
|
|
|
- );
|
|
|
-
|
|
|
- $entity->casetracker = new stdClass();
|
|
|
- foreach ($extraFields as $extra) {
|
|
|
- if (isset($entity->$extra)) {
|
|
|
- $entity->casetracker->$extra = $entity->$extra;
|
|
|
- unset($entity->extra);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- $entity->casetracker->case_type_id = 9; // Bug. Case type is not a default Unfuddle field
|
|
|
+ $row->xml->{'x-subject'} = strip_tags(node_teaser($row->xml->{'body'}, FILTER_FORMAT_DEFAULT, 40));
|
|
|
+// echo "SOURCE " . __FUNCTION__ . PHP_EOL;
|
|
|
+// print_r($row->xml);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Import "project" ticket data from Unfuddle into CaseTracker project nodes
|
|
|
+ * Import ticket data from Unfuddle into CaseTracker project nodes
|
|
|
*/
|
|
|
class UnfuddleTicketMigration extends UnfuddleMigration {
|
|
|
public $unmigratedDestinations = array(
|
|
@@ -366,37 +496,6 @@ class UnfuddleTicketMigration extends UnfuddleMigration {
|
|
|
'version-id',
|
|
|
);
|
|
|
|
|
|
- protected static function getFieldInfo() {
|
|
|
- self::$fields = array(
|
|
|
- 'assignee-id' => t('User Id'),
|
|
|
- 'component-id' => t('The project component (unused)'),
|
|
|
- 'created-at' => t('Ticket creation timestamp'),
|
|
|
- 'description' => t('Description'),
|
|
|
- 'description-format' => t('The ticket body format - does not match Drupal formats'),
|
|
|
- 'due-on' => t('Timestamp the ticket should be resolved by'),
|
|
|
- /*
|
|
|
- 'fieldn-value-id' => t('The value for custom field n'),
|
|
|
- */
|
|
|
- 'hours-estimate-current' => t('The current estimate for ticket resolution'),
|
|
|
- 'hours-estimate-initial' => t('The initial estimate for ticket resolution'),
|
|
|
- 'milestone-id' => t('The milestone for which resolution of this ticket is due'),
|
|
|
- 'number' => t('An apparent duplicate of the ticket id'),
|
|
|
- 'priority' => t('The priority level for the ticket'),
|
|
|
- 'project-id' => t('The project this ticket belongs to'),
|
|
|
- 'reporter-id' => t('The user reporting the ticket'),
|
|
|
- 'resolution' => t('The way the ticket was resolved'),
|
|
|
- 'resolution-description' => t('Details about the way the ticket was resolved'),
|
|
|
- 'severity-id' => t('The ticket severity level'),
|
|
|
- 'status' => t('The ticket status'),
|
|
|
- 'summary' => t('The ticket summary'),
|
|
|
- 'updated-at' => t('Timestamp of latest ticket change'),
|
|
|
- 'version-id' => t('The ticket version'),
|
|
|
- 'slug' => t('Virtual: ticket summary, converted to slug'),
|
|
|
- );
|
|
|
-
|
|
|
- return self::$fields;
|
|
|
- }
|
|
|
-
|
|
|
public function __construct() {
|
|
|
parent::__construct(MigrateGroup::getInstance('Unfuddle'));
|
|
|
$item_xpath = '/account/projects/project/tickets/ticket';
|
|
@@ -442,6 +541,37 @@ class UnfuddleTicketMigration extends UnfuddleMigration {
|
|
|
$this->afterConstruct();
|
|
|
}
|
|
|
|
|
|
+ protected static function getFieldInfo() {
|
|
|
+ self::$fields = array(
|
|
|
+ 'assignee-id' => t('User Id'),
|
|
|
+ 'component-id' => t('The project component (unused)'),
|
|
|
+ 'created-at' => t('Ticket creation timestamp'),
|
|
|
+ 'description' => t('Description'),
|
|
|
+ 'description-format' => t('The ticket body format - does not match Drupal formats'),
|
|
|
+ 'due-on' => t('Timestamp the ticket should be resolved by'),
|
|
|
+ /*
|
|
|
+ 'fieldn-value-id' => t('The value for custom field n'),
|
|
|
+ */
|
|
|
+ 'hours-estimate-current' => t('The current estimate for ticket resolution'),
|
|
|
+ 'hours-estimate-initial' => t('The initial estimate for ticket resolution'),
|
|
|
+ 'milestone-id' => t('The milestone for which resolution of this ticket is due'),
|
|
|
+ 'number' => t('An apparent duplicate of the ticket id'),
|
|
|
+ 'priority' => t('The priority level for the ticket'),
|
|
|
+ 'project-id' => t('The project this ticket belongs to'),
|
|
|
+ 'reporter-id' => t('The user reporting the ticket'),
|
|
|
+ 'resolution' => t('The way the ticket was resolved'),
|
|
|
+ 'resolution-description' => t('Details about the way the ticket was resolved'),
|
|
|
+ 'severity-id' => t('The ticket severity level'),
|
|
|
+ 'status' => t('The ticket status'),
|
|
|
+ 'summary' => t('The ticket summary'),
|
|
|
+ 'updated-at' => t('Timestamp of latest ticket change'),
|
|
|
+ 'version-id' => t('The ticket version'),
|
|
|
+ 'slug' => t('Virtual: ticket summary, converted to slug'),
|
|
|
+ );
|
|
|
+
|
|
|
+ return self::$fields;
|
|
|
+ }
|
|
|
+
|
|
|
public function preparerow(stdClass $row) {
|
|
|
/*
|
|
|
$row->xml->{'archived'} = ((int) $row->xml->{'archived'}) ? 0 : 1;
|
|
@@ -473,3 +603,4 @@ class UnfuddleTicketMigration extends UnfuddleMigration {
|
|
|
$row->xml->{'slug'} = 'case/'. drupal_strtolower(drupal_clean_css_identifier((string) $row->xml->{'summary'}));
|
|
|
}
|
|
|
}
|
|
|
+
|