Brion VIBBER has submitted this change and it was merged.

Change subject: Object for bulk importation of saved pages records.
......................................................................


Object for bulk importation of saved pages records.

Change-Id: Iacca068c51be43e6e8f547dff6ba99921e750713
---
M Wikipedia.xcodeproj/project.pbxproj
A wikipedia/Importer/ArticleImporter.h
A wikipedia/Importer/ArticleImporter.m
M wikipedia/Session/SessionSingleton.h
M wikipedia/Session/SessionSingleton.m
5 files changed, 141 insertions(+), 1 deletion(-)

Approvals:
  Brion VIBBER: Verified; Looks good to me, approved



diff --git a/Wikipedia.xcodeproj/project.pbxproj 
b/Wikipedia.xcodeproj/project.pbxproj
index 1afeab0..28e10c6 100644
--- a/Wikipedia.xcodeproj/project.pbxproj
+++ b/Wikipedia.xcodeproj/project.pbxproj
@@ -93,6 +93,7 @@
                04B0EA4A190B2348007458AF /* PreviewLicenseView.m in Sources */ 
= {isa = PBXBuildFile; fileRef = 04B0EA49190B2348007458AF /* 
PreviewLicenseView.m */; };
                04B0EA4D190E2983007458AF /* NavButtonView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04B0EA4C190E2983007458AF /* NavButtonView.m */; 
};
                04B0EA50190E2E4E007458AF /* NavButtonLabel.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04B0EA4F190E2E4E007458AF /* NavButtonLabel.m */; 
};
+               04B0EA45190AFDD8007458AF /* ArticleImporter.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04B0EA44190AFDD8007458AF /* ArticleImporter.m 
*/; };
                04B6925018E77B2A00F88D8A /* UIWebView+HideScrollGradient.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 04B6924F18E77B2A00F88D8A /* 
UIWebView+HideScrollGradient.m */; };
                04B78A5318A580AF0050EBF5 /* LoginOp.m in Sources */ = {isa = 
PBXBuildFile; fileRef = 04B78A5218A580AF0050EBF5 /* LoginOp.m */; };
                04B7B9BD18B5570E00A63551 /* CaptchaViewController.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 04B7B9BC18B5570E00A63551 /* 
CaptchaViewController.m */; };
@@ -318,6 +319,8 @@
                04B0EA4C190E2983007458AF /* NavButtonView.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= NavButtonView.m; sourceTree = "<group>"; };
                04B0EA4E190E2E4E007458AF /* NavButtonLabel.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
NavButtonLabel.h; sourceTree = "<group>"; };
                04B0EA4F190E2E4E007458AF /* NavButtonLabel.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= NavButtonLabel.m; sourceTree = "<group>"; };
+               04B0EA43190AFDD8007458AF /* ArticleImporter.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
ArticleImporter.h; sourceTree = "<group>"; };
+               04B0EA44190AFDD8007458AF /* ArticleImporter.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= ArticleImporter.m; sourceTree = "<group>"; };
                04B6924E18E77B2A00F88D8A /* UIWebView+HideScrollGradient.h */ = 
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; 
path = "UIWebView+HideScrollGradient.h"; sourceTree = "<group>"; };
                04B6924F18E77B2A00F88D8A /* UIWebView+HideScrollGradient.m */ = 
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; path = "UIWebView+HideScrollGradient.m"; sourceTree = 
"<group>"; };
                04B78A5118A580AF0050EBF5 /* LoginOp.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
LoginOp.h; sourceTree = "<group>"; };
@@ -834,6 +837,15 @@
                        path = AccountCreation;
                        sourceTree = "<group>";
                };
+               04B0EA42190AFDBA007458AF /* Importer */ = {
+                       isa = PBXGroup;
+                       children = (
+                               04B0EA43190AFDD8007458AF /* ArticleImporter.h 
*/,
+                               04B0EA44190AFDD8007458AF /* ArticleImporter.m 
*/,
+                       );
+                       path = Importer;
+                       sourceTree = "<group>";
+               };
                04B7B9BA18B5569600A63551 /* Captcha */ = {
                        isa = PBXGroup;
                        children = (
@@ -1195,6 +1207,7 @@
                                0442F57C1900718600F55DF9 /* Fonts */,
                                04D34DA31863D2D600610A87 /* HTML Parsing */,
                                0466F44C183A30CC00EA1FD7 /* Images */,
+                               04B0EA42190AFDBA007458AF /* Importer */,
                                0463639518A844380049EE4F /* Keychain */,
                                04CF1CB5187C8F4400E9516F /* Languages */,
                                048A26741906268100395F53 /* PaddedLabel */,
@@ -1536,6 +1549,7 @@
                                04C43AC0183442FC006C643B /* NSString+Extras.m 
in Sources */,
                                0442F57B19006DCC00F55DF9 /* PageHistoryLabel.m 
in Sources */,
                                0447862F185145090050563B /* HistoryResultCell.m 
in Sources */,
+                               04B0EA45190AFDD8007458AF /* ArticleImporter.m 
in Sources */,
                                0406CEF618F8C390007EE43E /* LogEventOp.m in 
Sources */,
                                0476967C18BBFC9400071963 /* AccountCreationOp.m 
in Sources */,
                        );
diff --git a/wikipedia/Importer/ArticleImporter.h 
b/wikipedia/Importer/ArticleImporter.h
new file mode 100644
index 0000000..e948d8c
--- /dev/null
+++ b/wikipedia/Importer/ArticleImporter.h
@@ -0,0 +1,26 @@
+//  Created by Monte Hurd on 4/25/14.
+//  Copyright (c) 2013 Wikimedia Foundation. Provided under MIT-style license; 
please copy and modify!
+
+@interface ArticleImporter : NSObject
+
+// Parameter "articleDictionaries" is an array of NSDictionaries.
+// Each dictionary must have "domain" and "title" keys (NSString values)
+
+// Example:
+/*
+
+    NSArray *articles = @[
+        @{@"domain": @"en", @"title": @"food"},
+        @{@"domain": @"fr", @"title": @"nourriture"},
+        @{@"domain": @"en", @"title": @"bird"}
+    ];
+
+    ArticleImporter *importer = [[ArticleImporter alloc] init];
+
+    [importer importArticles:articles];
+
+*/
+
+-(void)importArticles:(NSArray *)articleDictionaries;
+
+@end
diff --git a/wikipedia/Importer/ArticleImporter.m 
b/wikipedia/Importer/ArticleImporter.m
new file mode 100644
index 0000000..d3ac48c
--- /dev/null
+++ b/wikipedia/Importer/ArticleImporter.m
@@ -0,0 +1,94 @@
+//  Created by Monte Hurd on 4/25/14.
+//  Copyright (c) 2013 Wikimedia Foundation. Provided under MIT-style license; 
please copy and modify!
+
+#import "ArticleImporter.h"
+
+#import "ArticleDataContextSingleton.h"
+#import "ArticleCoreDataObjects.h"
+#import "SessionSingleton.h"
+#import "NSManagedObjectContext+SimpleFetch.h"
+
+@implementation ArticleImporter
+
+-(void)importArticles:(NSArray *)articleDictionaries
+{
+    NSManagedObjectContext *context =
+        [ArticleDataContextSingleton sharedInstance].mainContext;
+
+    [context performBlock:^{
+    
+        NSError *error = nil;
+        for (NSDictionary *articleDict in articleDictionaries) {
+            
+            // Ensure both domain and title keys are present in this article 
dict.
+            if (![articleDict objectForKey:@"domain"] || ![articleDict 
objectForKey:@"title"]){
+                NSLog(@"Error: domain or title missing.");
+                continue;
+            }
+            
+            NSString *title = articleDict[@"title"];
+            NSString *domain = articleDict[@"domain"];
+
+            // Ensure both domain and title strings are not zero length.
+            if ((title.length == 0) || (domain.length == 0)){
+                NSLog(@"Error: domain or title zero length.");
+                continue;
+            }
+
+            // Get existing article record. Create article record if not found.
+            Article *article = nil;
+            NSManagedObjectID *existingArticleID = [context 
getArticleIDForTitle:title domain:domain];
+            if (existingArticleID) {
+                article = (Article *)[context objectWithID:existingArticleID];
+            }else{
+                article =
+                [NSEntityDescription insertNewObjectForEntityForName: 
@"Article"
+                                              inManagedObjectContext: context];
+            }
+
+            if (!article) {
+                NSLog(@"Error: could not create or find article.");
+                continue;
+            }
+
+            // Is there aready a saved record associated with this article?
+            Saved *alreadySaved =
+                (Saved *)[context getEntityForName: @"Saved"
+                               withPredicateFormat: @"article == %@", article];
+
+            if (alreadySaved) {
+                NSLog(@"Warning: article already saved.");
+                continue;
+            }
+            
+            // All needed data in place and no saved record already exists, so 
safe to proceed.
+            article.dateCreated = [NSDate date];
+            article.site = @"wikipedia.org";
+            article.domain = domain;
+            article.title = title;
+            article.needsRefresh = @YES;
+            article.lastmodifiedby = @"";
+            article.redirected = @"";
+            article.domainName =
+                [[SessionSingleton sharedInstance] 
domainNameForCode:article.domain];
+            
+            // Add saved record for article.
+            Saved *saved =
+                [NSEntityDescription insertNewObjectForEntityForName: @"Saved"
+                                              inManagedObjectContext: context];
+            
+            saved.dateSaved = [NSDate date];
+            
+            [article addSavedObject:saved];
+            
+        }
+        
+        // Save all the additions from the loop above in one go.
+        if (![context save:&error]) {
+            NSLog(@"Error saving to context = %@", error);
+        }
+    
+    }];
+}
+
+@end
diff --git a/wikipedia/Session/SessionSingleton.h 
b/wikipedia/Session/SessionSingleton.h
index ff6d0e3..4c0d010 100644
--- a/wikipedia/Session/SessionSingleton.h
+++ b/wikipedia/Session/SessionSingleton.h
@@ -27,6 +27,7 @@
 
 -(NSURL *)urlForDomain:(NSString *)domain;
 -(NSMutableArray *)getBundledLanguagesJson;
+-(NSString *)domainNameForCode:(NSString *)code;
 
 + (SessionSingleton *)sharedInstance;
 
diff --git a/wikipedia/Session/SessionSingleton.m 
b/wikipedia/Session/SessionSingleton.m
index 1a869ac..d5b67b8 100644
--- a/wikipedia/Session/SessionSingleton.m
+++ b/wikipedia/Session/SessionSingleton.m
@@ -99,6 +99,11 @@
 
 -(NSString *)currentArticleDomainName
 {
+    return [self domainNameForCode:self.currentArticleDomain];
+}
+
+-(NSString *)domainNameForCode:(NSString *)code
+{
     NSError *error = nil;
     NSData *fileData = [NSData dataWithContentsOfFile:[self 
bundledLanguagesJsonPath] options:0 error:&error];
     if (error) return nil;
@@ -106,7 +111,7 @@
     NSArray *result = [NSJSONSerialization JSONObjectWithData:fileData 
options:0 error:&error];
     if (!error) {
         for (NSDictionary *d in result) {
-            if ([d[@"code"] isEqualToString:self.currentArticleDomain]) {
+            if ([d[@"code"] isEqualToString:code]) {
                 return d[@"name"];
             }
         }

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Iacca068c51be43e6e8f547dff6ba99921e750713
Gerrit-PatchSet: 2
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mhurd <mh...@wikimedia.org>
Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org>

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

Reply via email to