Yaron Koren has submitted this change and it was merged.

Change subject: Added limited-overwrite/"merge" option for importing XML or CSV
......................................................................


Added limited-overwrite/"merge" option for importing XML or CSV

Change-Id: If308b926be2d17f0fdb3278f1e54cab41b2bd96d
---
M includes/DT_ImportJob.php
M includes/DT_PageStructure.php
M includes/DT_Utils.php
M languages/DT_Messages.php
4 files changed, 102 insertions(+), 7 deletions(-)

Approvals:
  Yaron Koren: Verified; Looks good to me, approved



diff --git a/includes/DT_ImportJob.php b/includes/DT_ImportJob.php
index 09fddd3..0210080 100644
--- a/includes/DT_ImportJob.php
+++ b/includes/DT_ImportJob.php
@@ -50,14 +50,23 @@
                $actual_user = $wgUser;
                $wgUser = User::newFromId( $this->params['user_id'] );
                $text = $this->params['text'];
-               if ( $for_pages_that_exist == 'append' && 
$this->title->exists() ) {
-                       if ( method_exists( 'WikiPage', 'getContent' ) ) {
-                               // MW >= 1.21
-                               $existingText = 
$wikiPage->getContent()->getNativeData();
-                       } else {
-                               $existingText = $article->getContent();
+               if ( $this->title->exists() ) {
+                       if ( $for_pages_that_exist == 'append' ) {
+                               if ( method_exists( 'WikiPage', 'getContent' ) 
) {
+                                       // MW >= 1.21
+                                       $existingText = 
$wikiPage->getContent()->getNativeData();
+                               } else {
+                                       $existingText = $article->getContent();
+                               }
+                               $text = $existingText . "\n" . $text;
+                       } elseif ( $for_pages_that_exist == 'merge' ) {
+                               $existingPageStructure = 
DTPageStructure::newFromTitle( $this->title );
+                               $newPageStructure = new DTPageStructure;
+                               $newPageStructure->parsePageContents( $text );
+                               $existingPageStructure->mergeInPageStructure( 
$newPageStructure );
+                               return $existingPageStructure->toWikitext();
                        }
-                       $text = $existingText . "\n" . $text;
+                       // otherwise, $for_pages_that_exist == 'overwrite'
                }
                $edit_summary = $this->params['edit_summary'];
                if ( method_exists( 'WikiPage', 'getContent' ) ) {
diff --git a/includes/DT_PageStructure.php b/includes/DT_PageStructure.php
index 3f65f4a..6df693a 100644
--- a/includes/DT_PageStructure.php
+++ b/includes/DT_PageStructure.php
@@ -39,6 +39,23 @@
                $this->mFields[$fieldName] = trim( $fieldValue );
        }
 
+       public function toWikitext() {
+               if ( $this->mIsTemplate ) {
+                       $wikitext = '{{' . $this->mTemplateName;
+                       foreach ( $this->mFields as $fieldName => $fieldValue ) 
{
+                               if ( is_numeric( $fieldName ) ) {
+                                       $wikitext .= '|' . $fieldValue;
+                               } else {
+                                       $wikitext .= 
"\n|$fieldName=$fieldValue";
+                               }
+                       }
+                       $wikitext .= "\n}}";
+                       return $wikitext;
+               } else {
+                       return $this->mFreeText;
+               }
+       }
+
        public function toXML( $isSimplified ) {
                global $wgDataTransferViewXMLParseFields;
                global $wgDataTransferViewXMLParseFreeText;
@@ -261,6 +278,67 @@
                }
        }
 
+       /**
+        * Helper function for mergeInPageStructure().
+        */
+       private function getSingleInstanceTemplates() {
+               $instancesPerTemplate = array();
+               foreach ( $this->mComponents as $pageComponent ) {
+                       if ( $pageComponent->mIsTemplate ) {
+                               $templateName = $pageComponent->mTemplateName;
+                               if ( array_key_exists( $templateName, 
$instancesPerTemplate ) ) {
+                                       $instancesPerTemplate[$templateName]++;
+                               } else {
+                                       $instancesPerTemplate[$templateName] = 
1;
+                               }
+                       }
+               }
+
+               $singleInstanceTemplates = array();
+               foreach ( $instancesPerTemplate as $templateName => $instances 
) {
+                       if ( $instances == 1 ) {
+                               $singleInstanceTemplates[] = $templateName;
+                       }
+               }
+               return $singleInstanceTemplates;
+       }
+
+       private function getIndexOfTemplateName( $templateName ) {
+               foreach ( $this->mComponents as $i => $pageComponent ) {
+                       if ( $pageComponent->mTemplateName == $templateName ) {
+                               return $i;
+                       }
+               }
+               return null;
+       }
+
+       public function mergeInPageStructure( $secondPageStructure ) {
+               // If there are any templates that have one instance in both
+               // pages, replace values for their fields with values from
+               // the second page.
+               $singleInstanceTemplatesHere = 
$this->getSingleInstanceTemplates();
+               $singleInstanceTemplatesThere = 
$secondPageStructure->getSingleInstanceTemplates();
+               $singleInstanceTemplatesInBoth = array_intersect( 
$singleInstanceTemplatesHere, $singleInstanceTemplatesThere );
+               foreach ( $secondPageStructure->mComponents as $pageComponent ) 
{
+                       if ( in_array( $pageComponent->mTemplateName, 
$singleInstanceTemplatesInBoth ) ) {
+                               $indexOfThisTemplate = 
$this->getIndexOfTemplateName( $pageComponent->mTemplateName );
+                               foreach ( $pageComponent->mFields as $fieldName 
=> $fieldValue ) {
+                                       
$this->mComponents[$indexOfThisTemplate]->mFields[$fieldName] = $fieldValue;
+                               }
+                       } else {
+                               $this->mComponents[] = $pageComponent;
+                       }
+               }
+       }
+
+       public function toWikitext() {
+               $wikitext = '';
+               foreach ( $this->mComponents as $pageComponent ) {
+                       $wikitext .= $pageComponent->toWikitext() . "\n";
+               }
+               return trim( $wikitext );
+       }
+
        public function toXML( $isSimplified ) {
                $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' 
)->inContentLanguage()->text() );
                $id_str = str_replace( ' ', '_', wfMessage( 'dt_xml_id' 
)->inContentLanguage()->text() );
diff --git a/includes/DT_Utils.php b/includes/DT_Utils.php
index 2cabfee..03af8e6 100644
--- a/includes/DT_Utils.php
+++ b/includes/DT_Utils.php
@@ -36,6 +36,13 @@
                                array(
                                        'type' => 'radio',
                                        'name' => 'pagesThatExist',
+                                       'value' => 'merge',
+                               ) ) . "\n" .
+                       "\t" . wfMessage( 'dt_import_mergeintoexisting' 
)->text() . "<br />" . "\n\t" .
+                       "\t" . Xml::element( 'input',
+                               array(
+                                       'type' => 'radio',
+                                       'name' => 'pagesThatExist',
                                        'value' => 'skip',
                                ) ) . "\n" .
                        "\t" . wfMessage( 'dt_import_skipexisting' )->text() . 
"<br />" . "\n" .
diff --git a/languages/DT_Messages.php b/languages/DT_Messages.php
index dec4d13..713c80b 100644
--- a/languages/DT_Messages.php
+++ b/languages/DT_Messages.php
@@ -32,6 +32,7 @@
        'dt_import_encodingtype'      => 'Encoding type:',
        'dt_import_forexisting'       => 'For pages that already exist:',
        'dt_import_overwriteexisting' => 'Overwrite existing content',
+       'dt_import_mergeintoexisting' => 'Overwrite only fields contained in 
the file',
        'dt_import_skipexisting'      => 'Skip',
        'dt_import_appendtoexisting'  => 'Append to existing content',
        'dt_import_summarydesc'       => 'Summary of import:',

-- 
To view, visit https://gerrit.wikimedia.org/r/61387
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: If308b926be2d17f0fdb3278f1e54cab41b2bd96d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/DataTransfer
Gerrit-Branch: master
Gerrit-Owner: Yaron Koren <yaro...@gmail.com>
Gerrit-Reviewer: Siebrand <siebr...@wikimedia.org>
Gerrit-Reviewer: Yaron Koren <yaro...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to