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