mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
Mark Smith ([staff profile] mark) wrote in [site community profile] changelog2009-02-27 10:29 am

[dw-free] Allow importing of your journal from another LiveJournal-based site.

[commit: http://hg.dwscoalition.org/dw-free/rev/76012a72e138]

http://bugs.dwscoalition.org/show_bug.cgi?id=114

Tonight's work on the importer: enable entry importing, disable ESN events
for imported entries, make polls links and not just removing them.

Patch by [staff profile] mark.

Files modified:
  • cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm
  • cgi-bin/DW/Worker/ContentImporter/LiveJournal/FriendGroups.pm
  • cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm
  • cgi-bin/ljprotocol.pl
  • htdocs/misc/import.bml
--------------------------------------------------------------------------------
diff -r fe1d3e12654a -r 76012a72e138 cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm	Fri Feb 27 07:44:45 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/Entries.pm	Fri Feb 27 10:29:16 2009 +0000
@@ -123,11 +123,9 @@ sub try_work {
 
             my $event = $evt->{event};
 
-            if ( $event =~ m/<.+?-poll-.+?>/ ) {
-                $event =~ s/<.+?-poll-.+?>//g;
-
-                push @item_errors, "Entry contained a poll, please manually re-add the poll.";
-            }
+            # we just link polls to the original site
+# FIXME: this URL should be from some method and not manually constructed
+            $event =~ s!<.+?-poll-(\d+?)>![<a href="http://www.$data->{hostname}/poll/?id=$1">Poll #$1</a>]!g;
 
             if ( $event =~ m/<.+?-embed-.+?>/ ) {
                 $event =~ s/<.+?-embed-.+?>//g;
diff -r fe1d3e12654a -r 76012a72e138 cgi-bin/DW/Worker/ContentImporter/LiveJournal/FriendGroups.pm
--- a/cgi-bin/DW/Worker/ContentImporter/LiveJournal/FriendGroups.pm	Fri Feb 27 07:44:45 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/LiveJournal/FriendGroups.pm	Fri Feb 27 10:29:16 2009 +0000
@@ -66,7 +66,8 @@ sub try_work {
 # FIXME: what do we do on error case? well, hopefully that will be rare...
     $dbh->do(
         q{UPDATE import_items SET status = 'ready'
-          WHERE userid = ? AND item = 'lj_friends' AND import_data_id = ? AND status = 'init'},
+          WHERE userid = ? AND item IN ('lj_friends', 'lj_entries')
+          AND import_data_id = ? AND status = 'init'},
         undef, $u->id, $opts->{import_data_id}        
     );
 
diff -r fe1d3e12654a -r 76012a72e138 cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm
--- a/cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm	Fri Feb 27 07:44:45 2009 +0000
+++ b/cgi-bin/DW/Worker/ContentImporter/Local/Entries.pm	Fri Feb 27 10:29:16 2009 +0000
@@ -138,6 +138,7 @@ sub post_event {
         {
             u => $u,
             noauth => 1,
+            nonotify => 1,
         }
     );
 
diff -r fe1d3e12654a -r 76012a72e138 cgi-bin/ljprotocol.pl
--- a/cgi-bin/ljprotocol.pl	Fri Feb 27 07:44:45 2009 +0000
+++ b/cgi-bin/ljprotocol.pl	Fri Feb 27 10:29:16 2009 +0000
@@ -1553,8 +1553,12 @@ sub postevent
     $res->{'anum'} = $anum;
     $res->{'url'} = $entry->url;
 
-    push @jobs, LJ::Event::JournalNewEntry->new($entry)->fire_job;
-    push @jobs, LJ::Event::UserNewEntry->new($entry)->fire_job if (!$LJ::DISABLED{'esn-userevents'} || $LJ::_T_FIRE_USERNEWENTRY);
+    # if the caller told us not to fire events (importer?) then skip the user events,
+    # but still fire the logging events
+    unless ( $flags->{nonotify} ) {
+        push @jobs, LJ::Event::JournalNewEntry->new($entry)->fire_job;
+        push @jobs, LJ::Event::UserNewEntry->new($entry)->fire_job if (!$LJ::DISABLED{'esn-userevents'} || $LJ::_T_FIRE_USERNEWENTRY);
+    }
     push @jobs, LJ::EventLogRecord::NewEntry->new($entry)->fire_job;
 
     my $sclient = LJ::theschwartz();
diff -r fe1d3e12654a -r 76012a72e138 htdocs/misc/import.bml
--- a/htdocs/misc/import.bml	Fri Feb 27 07:44:45 2009 +0000
+++ b/htdocs/misc/import.bml	Fri Feb 27 10:29:16 2009 +0000
@@ -59,16 +59,27 @@ body<=
         );
         return "Database error." if $dbh->err;
 
+        # okay, this is kinda hacky but turn on the right things so we can do
+        # a proper entry import...
+        if ( $POST{lj_entries} ) {
+            $POST{lj_tags} = 1;
+            $POST{lj_friendgroups} = 1;
+        }
+
+        # default job status
         my @jobs = (
-            ['lj_userpics', 'ready'],
-            ['lj_bio', 'ready'],
-            ['lj_tags', 'ready'],
+            ['lj_userpics',     'ready'],
+            ['lj_bio',          'ready'],
+            ['lj_tags',         'ready'],
             ['lj_friendgroups', 'ready'],
-            ['lj_friends', 'init'],
-            ['lj_entries', 'init'],
+#            ['lj_friends',      'init' ],
+            ['lj_entries',      'init' ],
         );
+
         # schedule userpic, bio, and tag imports
-        foreach my $item (@jobs) {
+        foreach my $item ( @jobs ) {
+            next unless $POST{$item->[0]};
+
             $dbh->do(
                 "INSERT INTO import_items (userid, item, status, created, import_data_id, priority) " .
                 "VALUES (?, ?, ?, UNIX_TIMESTAMP(), ?, UNIX_TIMESTAMP())",
@@ -129,17 +140,58 @@ body<=
 
     # now let them do the rest...
     my $authas = LJ::make_authas_select( $remote, { authas => $u->user } );
-    $ret .= "<?h2 Start Import Job h2?><?p <form method='get'>$authas</form> p?><br />";
+    $authas = "<?p <form method='get'>$authas</form> p?><br />"
+        if $authas =~ /select/i;
+
+    # give selection table
+    $ret .= "<?h2 Start Import Job h2?>$authas";
     $ret .= "<form method='post'>" . LJ::form_auth();;
+    $ret .= <<EOF;
 
-    $ret .= "<input type='text' name='username' maxlength='15'> username<br />";
-    $ret .= "<input type='password' name='password' maxlength='15'> password<br />";
-    $ret .= "<select name='hostname'><option value='livejournal.com'>LiveJournal.com</option></select><br />";
-    $ret .= "<br />";
-    $ret .= "Clicking submit below will cause import jobs to be queued to import your userpics, your ";
-    $ret .= "tags, and your bio fields.  You can check this page for status.<br />";
-    $ret .= "<strong>This option now imports your friend groups, friends, and entries.</strong><br />";
-    $ret .= "<input type='submit' value='Do it!'></form>";
+<table>
+    <tr><td>Username:</td><td><input type='text' name='username' maxlength='15'></td></tr>
+    <tr><td>Password:</td><td><input type='password' name='password' maxlength='25'></td></tr>
+    <tr><td></td><td>
+        <select name='hostname'>
+            <option value='livejournal.com'>LiveJournal.com</option>
+            <option value='insanejournal.org'>Insane Journal</option>
+        </select>
+    </td></tr>
+    <tr><td colspan='2'>&nbsp;</td></tr>
+
+EOF
+
+    # checkbox easier this way
+    my %opts = (
+        lj_entries      => [ 0, 'Import all journal entries.  Implies: tags, friendgroups.' ],
+        lj_tags         => [ 1, 'Import list of tags.' ],
+        lj_userpics     => [ 1, 'Import icons (aka userpics).' ],
+        lj_bio          => [ 1, 'Import bio field for profile.' ],
+#        lj_friends      => [ 0, 'Import friends as OpenID/feed accounts.' ],
+        lj_friendgroups => [ 1, 'Import friend groups as trust groups.' ],
+    );
+
+    foreach my $key ( sort keys %opts ) {
+        $ret .= "<tr><td></td><td>" .
+                LJ::html_check( { name => $key, id => $key, label => $opts{$key}->[1], selected => $opts{$key}->[0] } ) .
+                "</td></tr>\n";
+    }
+
+    $ret .= <<EOF;
+    <tr><td colspan='2'>&nbsp;</td></tr>
+</table>
+
+<?p
+    This will immediately kick off some jobs to import the selected items.  Please make sure
+    you are okay with this data being imported.  You will be able to watch status by checking
+    your site inbox to look for messages.  <em>This action is not reversible.</em>
+p?>
+
+<?p <input type='submit' value='Import' /> p?>
+
+</form>
+EOF
+
     return $ret;
 }
 _code?>
--------------------------------------------------------------------------------