aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorredmatrix <redmatrix@redmatrix.me>2015-08-17 21:40:40 -0700
committerredmatrix <redmatrix@redmatrix.me>2015-08-17 21:40:40 -0700
commit1a4a921528f1405c131762954d16f0f6c6b690b6 (patch)
tree0f9e489abeca495c1877e4c1762fbb5f05cd66a6
parent30fd17c58dccd688e99407b8c3a7b0cf9f4fbdfe (diff)
downloadvolse-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.php11
-rw-r--r--mod/import_items.php173
-rwxr-xr-xview/tpl/item_import.tpl15
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>
+