diff options
author | redmatrix <redmatrix@redmatrix.me> | 2015-08-17 21:40:40 -0700 |
---|---|---|
committer | redmatrix <redmatrix@redmatrix.me> | 2015-08-17 21:40:40 -0700 |
commit | 1a4a921528f1405c131762954d16f0f6c6b690b6 (patch) | |
tree | 0f9e489abeca495c1877e4c1762fbb5f05cd66a6 | |
parent | 30fd17c58dccd688e99407b8c3a7b0cf9f4fbdfe (diff) | |
download | volse-hubzilla-1a4a921528f1405c131762954d16f0f6c6b690b6.tar.gz volse-hubzilla-1a4a921528f1405c131762954d16f0f6c6b690b6.tar.bz2 volse-hubzilla-1a4a921528f1405c131762954d16f0f6c6b690b6.zip |
provide module for importing yearly content dumps
-rw-r--r-- | include/event.php | 11 | ||||
-rw-r--r-- | mod/import_items.php | 173 | ||||
-rwxr-xr-x | view/tpl/item_import.tpl | 15 |
3 files changed, 199 insertions, 0 deletions
diff --git a/include/event.php b/include/event.php index 4393e6854..b690647fd 100644 --- a/include/event.php +++ b/include/event.php @@ -698,3 +698,14 @@ function event_store_item($arr, $event) { return $item_id; } } + + +function todo_stat() { + return array( + '' => t('Not specified'), + 'NEEDS-ACTION' => t('Needs Action'), + 'COMPLETED' => t('Completed'), + 'IN-PROCESS' => t('In Process'), + 'CANCELLED' => t('Cancelled') + ); +} diff --git a/mod/import_items.php b/mod/import_items.php new file mode 100644 index 000000000..fe505ff87 --- /dev/null +++ b/mod/import_items.php @@ -0,0 +1,173 @@ +<?php + + +function import_items_post(&$a) { + + if(! local_channel()) + return; + + $data = null; + + $src = $_FILES['filename']['tmp_name']; + $filename = basename($_FILES['filename']['name']); + $filesize = intval($_FILES['filename']['size']); + $filetype = $_FILES['filename']['type']; + + if($src) { + // This is OS specific and could also fail if your tmpdir isn't very large + // mostly used for Diaspora which exports gzipped files. + + if(strpos($filename,'.gz')){ + @rename($src,$src . '.gz'); + @system('gunzip ' . escapeshellarg($src . '.gz')); + } + + if($filesize) { + $data = @file_get_contents($src); + } + unlink($src); + } + + if(! $src) { + + $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : ''); + + if(! $old_address) { + logger('mod_import: nothing to import.'); + notice( t('Nothing to import.') . EOL); + return; + } + + $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : ''); + $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : ''); + + $year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : ''); + + $channelname = substr($old_address,0,strpos($old_address,'@')); + $servername = substr($old_address,strpos($old_address,'@')+1); + + $scheme = 'https://'; + $api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year); + $binary = false; + $redirects = 0; + $opts = array('http_auth' => $email . ':' . $password); + $url = $scheme . $servername . $api_path; + $ret = z_fetch_url($url, $binary, $redirects, $opts); + if(! $ret['success']) + $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts); + if($ret['success']) + $data = $ret['body']; + else + notice( t('Unable to download data from old server') . EOL); + + } + + if(! $data) { + logger('mod_import: empty file.'); + notice( t('Imported file is empty.') . EOL); + return; + } + + $data = json_decode($data,true); + +// logger('import: data: ' . print_r($data,true)); +// print_r($data); + + + if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) { + $v1 = substr($data['compatibility']['database'],-4); + $v2 = substr(DB_UPDATE_VERSION,-4); + if($v2 > $v1) { + $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 ); + notice($t); + } + } + + $channel = $a->get_channel(); + + + $saved_notification_flags = notifications_off($channel['channel_id']); + + if($import_posts && array_key_exists('item',$data) && $data['item']) { + + foreach($data['item'] as $i) { + $item = get_item_elements($i); + + $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1", + dbesc($item['mid']), + intval($channel['channel_id']) + ); + if($r) { + if($item['edited'] > $r[0]['edited']) { + $item['id'] = $r[0]['id']; + $item['uid'] = $channel['channel_id']; + item_store_update($item); + continue; + } + } + else { + $item['aid'] = $channel['channel_account_id']; + $item['uid'] = $channel['channel_id']; + $item_result = item_store($item); + } + + } + + } + + notifications_on($channel['channel_id'],$saved_notification_flags); + + if(array_key_exists('item_id',$data) && $data['item_id']) { + foreach($data['item_id'] as $i) { + $r = q("select id from item where mid = '%s' and uid = %d limit 1", + dbesc($i['mid']), + intval($channel['channel_id']) + ); + if(! $r) + continue; + $z = q("select * from item_id where service = '%s' and sid = '%s' and iid = %d and uid = %d limit 1", + dbesc($i['service']), + dbesc($i['sid']), + intval($r[0]['id']), + intval($channel['channel_id']) + ); + if(! $z) { + q("insert into item_id (iid,uid,sid,service) values(%d,%d,'%s','%s')", + intval($r[0]['id']), + intval($channel['channel_id']), + dbesc($i['sid']), + dbesc($i['service']) + ); + } + } + } + + info( t('Import completed') . EOL); + return; +} + + + + +function import_items_content(&$a) { + + + + + if(! local_channel()) { + notice( t('Permission denied') . EOL); + return login(); + } + + $o = replace_macros(get_markup_template('item_import.tpl'),array( + '$title' => t('Import Items'), + '$desc' => t('Use this form to import existing posts and content from an export file.'), + '$label_filename' => t('File to Upload'), + '$submit' => t('Submit') + )); + + return $o; + +} + + diff --git a/view/tpl/item_import.tpl b/view/tpl/item_import.tpl new file mode 100755 index 000000000..416defcce --- /dev/null +++ b/view/tpl/item_import.tpl @@ -0,0 +1,15 @@ +<h2>{{$title}}</h2> + +<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form"> + + <div id="import-desc" class="descriptive-paragraph">{{$desc}}</div> + + <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label> + <input type="file" name="filename" id="import-filename" class="import-input" value="" /> + <div id="import-filename-end" class="import-field-end"></div> + + <input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" /> + <div id="import-submit-end" class="import-field-end"></div> + +</form> + |