Files
server/usr/share/psa-horde/kronolith/data.php
2026-01-07 20:52:11 +01:00

246 lines
9.0 KiB
PHP

<?php
/**
* Copyright 2001-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Jan Schneider <jan@horde.org>
* @package Kronolith
*/
require_once __DIR__ . '/lib/Application.php';
$app_ob = Horde_Registry::appInit('kronolith');
if ((Kronolith::showAjaxView() && !(Horde_Util::getPost('import_ajax'))) ||
(!$conf['menu']['import_export'])) {
Horde::url('', true)->redirect();
}
/* Importable file types. */
$file_types = array('csv' => _("Comma separated values"),
'icalendar' => _("vCalendar/iCalendar"));
/* Templates for the different import steps. */
$templates = array(
Horde_Data::IMPORT_CSV => array($registry->get('templates', 'horde') . '/data/csvinfo.inc'),
Horde_Data::IMPORT_MAPPED => array($registry->get('templates', 'horde') . '/data/csvmap.inc'),
Horde_Data::IMPORT_DATETIME => array($registry->get('templates', 'horde') . '/data/datemap.inc')
);
$perms = $GLOBALS['injector']->getInstance('Horde_Core_Perms');
if ($perms->hasAppPermission('max_events') !== true &&
$perms->hasAppPermission('max_events') <= Kronolith::countEvents()) {
Horde::permissionDeniedError(
'kronolith',
'max_events',
sprintf(_("You are not allowed to create more than %d events."), $perms->hasAppPermission('max_events'))
);
$templates[Horde_Data::IMPORT_FILE] = array(KRONOLITH_TEMPLATES . '/data/export.inc');
} else {
$templates[Horde_Data::IMPORT_FILE] = array(KRONOLITH_TEMPLATES . '/data/import.inc', KRONOLITH_TEMPLATES . '/data/export.inc');
}
/* Initial values. */
$import_step = Horde_Util::getFormData('import_step', 0) + 1;
$actionID = Horde_Util::getFormData('actionID');
$next_step = Horde_Data::IMPORT_FILE;
$app_fields = array('title' => _("Title"),
'start_date' => _("Start Date"),
'start_time' => _("Start Time"),
'end_date' => _("End Date"),
'end_time' => _("End Time"),
'alarm' => _("Alarm Span (minutes)"),
'alarm_date' => _("Alarm Date"),
'alarm_time' => _("Alarm Time"),
'description' => _("Description"),
'location' => _("Location"),
'recur_type' => _("Recurrence Type"),
'recur_end_date' => _("Recurrence End Date"),
'recur_interval' => _("Recurrence Interval"),
'recur_data' => _("Recurrence Data"));
$time_fields = array('start_date' => 'date',
'start_time' => 'time',
'end_date' => 'date',
'end_time' => 'time',
'recur_end_date' => 'date');
$param = array('time_fields' => $time_fields,
'file_types' => $file_types);
$import_format = Horde_Util::getFormData('import_format', '');
$storage = $injector->getInstance('Horde_Core_Data_Storage');
switch ($actionID) {
case Horde_Data::IMPORT_FILE:
$storage->set('import_cal', Horde_Util::getFormData('importCal'));
$storage->set('purge', Horde_Util::getFormData('purge'));
break;
}
if ($import_format) {
$data = null;
try {
$data = $injector->getInstance('Horde_Core_Factory_Data')->create($import_format, array('cleanup' => array($app_ob, 'cleanupData')));
if ($actionID == Horde_Data::IMPORT_FILE) {
$cleanup = true;
try {
if (!in_array($storage->get('import_cal'), array_keys(Kronolith::listCalendars(Horde_Perms::EDIT)))) {
$notification->push(_("You have specified an invalid calendar or you do not have permission to add events to the selected calendar."), 'horde.error');
} else {
$next_step = $data->nextStep($actionID, $param);
$cleanup = false;
}
} catch (Exception $e) {
$notification->push($e, 'horde.error');
}
if ($cleanup) {
$next_step = $data->cleanup();
}
} else {
$next_step = $data->nextStep($actionID, $param);
}
} catch (Exception $e) {
if ($data) {
$notification->push($e, 'horde.error');
$next_step = $data->cleanup();
} else {
$notification->push(_("This file format is not supported."), 'horde.error');
$next_step = Horde_Data::IMPORT_FILE;
}
}
}
/* We have a final result set. */
if (is_array($next_step)) {
$events = array();
$error = false;
$max_events = $perms->hasAppPermission('max_events');
if ($max_events !== true) {
$num_events = Kronolith::countEvents();
}
list($type, $calendar) = explode('_', $storage->get('import_cal'), 2);
$kronolith_driver = Kronolith::getDriver($type, $calendar);
if (!count($next_step)) {
$notification->push(sprintf(_("The %s file didn't contain any events."),
$file_types[$storage->get('format')]), 'horde.error');
$error = true;
} else {
/* Purge old calendar if requested. */
if ($storage->get('purge')) {
try {
$kronolith_driver->delete($calendar);
$notification->push(_("Calendar successfully purged."), 'horde.success');
} catch (Exception $e) {
$notification->push(sprintf(_("The calendar could not be purged: %s"), $e->getMessage()), 'horde.error');
}
}
}
$recurrences = array();
$ical = null;
foreach ($next_step as $row) {
if ($max_events !== true && $num_events >= $max_events) {
Horde::permissionDeniedError(
'kronolith',
'max_events',
sprintf(_("You are not allowed to create more than %d events."), $perms->hasAppPermission('max_events'))
);
break;
}
if ($row instanceof Horde_Icalendar_Vevent) {
if (!$ical) {
$ical = new Horde_Icalendar();
}
$ical->addComponent($row);
if ($max_events !== true) {
$num_events++;
}
continue;
}
try {
$event = $kronolith_driver->getEvent();
} catch (Exception $e) {
$msg = _("Can't create a new event.")
. ' ' . sprintf(_("This is what the server said: %s"), $e->getMessage());
$notification->push($msg, 'horde.error');
$error = true;
break;
}
if ($row instanceof Horde_Icalendar) {
// Skip other iCalendar components for now.
continue;
} else {
try {
$event->fromHash($row);
} catch (Exception $e) {
$notification->push($e, 'horde.error');
$error = true;
break;
}
}
try {
$event->save();
} catch (Exception $e) {
$notification->push($e, 'horde.error');
$error = true;
break;
}
if ($max_events !== true) {
$num_events++;
}
}
if (!empty($ical)) {
$ical_importer = new Kronolith_Icalendar_Handler_Base($ical, $kronolith_driver);
try {
$ical_importer->process();
} catch (Kronolith_Exception $e) {
$msg = _("Can't create a new event.")
. ' ' . sprintf(_("This is what the server said: %s"), $e->getMessage());
$notification->push($msg, 'horde.error');
$error = true;
}
}
if (!$error) {
$notification->push(sprintf(_("%s file successfully imported"),
$file_types[$storage->get('format')]), 'horde.success');
}
if (Horde_Util::getFormData('import_ajax')) {
$page_output->includeScriptFiles();
$page_output->addInlineScript('(function(window){window.KronolithCore.loading--;if(!window.KronolithCore.loading)window.$(\'kronolithLoading\').hide();window.KronolithCore.loadCalendar(\'' . $type . '\', \'' . $calendar . '\');})(window.parent)');
}
$next_step = $data->cleanup();
}
if (Horde_Util::getFormData('import_ajax')) {
$page_output->addInlineScript('window.parent.$(window.name).remove();');
$page_output->outputInlineScript();
exit;
}
$import_calendars = $export_calendars = array();
if ($GLOBALS['registry']->getAuth()) {
$import_calendars = Kronolith::listCalendars(Horde_Perms::EDIT, true);
}
$export_calendars = Kronolith::listCalendars(Horde_Perms::READ, true);
$page_output->header(array(
'title' => _("Import/Export Calendar")
));
require KRONOLITH_TEMPLATES . '/javascript_defs.php';
$notification->notify(array('listeners' => 'status'));
foreach ($templates[$next_step] as $template) {
require $template;
}
$page_output->footer();