Merge branch 'master' into next

This commit is contained in:
following
2013-06-12 17:44:21 +02:00
51 changed files with 557 additions and 320 deletions

View File

@@ -173,7 +173,7 @@
sql("ALTER TABLE `cache_reports` ADD INDEX `userid` (`userid`)"); sql("ALTER TABLE `cache_reports` ADD INDEX `userid` (`userid`)");
} }
function dbv_108() // automatic email-bounce processiong function dbv_108() // automatic email-bounce processing
{ {
if (!sql_field_exists('user','last_email_problem')) if (!sql_field_exists('user','last_email_problem'))
sql("ALTER TABLE `user` ADD COLUMN `last_email_problem` datetime default NULL AFTER `email_problems`"); sql("ALTER TABLE `user` ADD COLUMN `last_email_problem` datetime default NULL AFTER `email_problems`");
@@ -181,10 +181,46 @@
sql("ALTER TABLE `user` ADD COLUMN `mailing_problems` int(10) unsigned NOT NULL default '0' AFTER `last_email_problem`"); sql("ALTER TABLE `user` ADD COLUMN `mailing_problems` int(10) unsigned NOT NULL default '0' AFTER `last_email_problem`");
} }
function dbv_109() // improved email-bounce processiong function dbv_109() // improved email-bounce processing
{ {
if (!sql_field_exists('user','first_email_problem')) if (!sql_field_exists('user','first_email_problem'))
sql("ALTER TABLE `user` ADD COLUMN `first_email_problem` date default NULL AFTER `email_problems`"); sql("ALTER TABLE `user` ADD COLUMN `first_email_problem` date default NULL AFTER `email_problems`");
} }
function dbv_110() // move adoption history to separate table
{
if (!sql_table_exists('cache_adoptions'))
{
sql(
"CREATE TABLE `cache_adoptions` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cache_id` int(10) unsigned NOT NULL,
`date` datetime NOT NULL,
`from_user_id` int(10) unsigned NOT NULL,
`to_user_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `cache_id` (`cache_id`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1");
$rs = sql("SELECT `id`, `date_created`, `objectid1`, `logtext`
FROM `logentries`
WHERE `eventid`=5
ORDER BY `date_created`, `id`");
while ($rLog = sql_fetch_assoc($rs))
{
preg_match('/Cache (\d+) has changed the owner from userid (\d+) to (\d+) by (\d+)/',
$rLog['logtext'], $matches);
if (count($matches) != 5)
die("unknown adoption log entry format for ID " . $rLog['id'] . "\n");
sql("INSERT INTO `cache_adoptions`
(`cache_id`,`date`,`from_user_id`,`to_user_id`)
VALUES ('&1','&2','&3','&4')",
$rLog['objectid1'], $rLog['date_created'], $matches[2], $matches[3]);
}
sql_free_result($rs);
// We keep the old entries in 'logentries' for the case something went wrong here.
}
}
?> ?>

View File

@@ -144,7 +144,7 @@
$tpl->assign('adminid', $record['adminid']); $tpl->assign('adminid', $record['adminid']);
$tpl->assign('adminnick', $record['adminnick']); $tpl->assign('adminnick', $record['adminnick']);
$tpl->assign('reason', $record['reason']); $tpl->assign('reason', $record['reason']);
$tpl->assign('note', $record['note']); $tpl->assign('note', trim($record['note']));
$tpl->assign('status', $record['status']); $tpl->assign('status', $record['status']);
$tpl->assign('created', $record['date_created']); $tpl->assign('created', $record['date_created']);
$tpl->assign('lastmodified', $record['lastmodified']); $tpl->assign('lastmodified', $record['lastmodified']);

View File

@@ -368,9 +368,10 @@
// fill_gaps = false: continue with the last waypoint // fill_gaps = false: continue with the last waypoint
$opt['logic']['waypoint_pool']['fill_gaps'] = false; $opt['logic']['waypoint_pool']['fill_gaps'] = false;
/* Automatic system user actions /* Username for cronjobs or CLI tools
* is used e.g. for cache auto-archiving and auto-publishing
*/ */
$opt['logic']['systemuser']['user'] = ''; // enter an active username to enable auto archiving $opt['logic']['systemuser']['user'] = '';
/* Purge log files - age in days (0 = keep infinite) /* Purge log files - age in days (0 = keep infinite)
*/ */
@@ -405,6 +406,7 @@
/* cronjob /* cronjob
*/ */
$opt['cron']['pidfile'] = $opt['rootpath'] . 'cache2/runcron.pid'; $opt['cron']['pidfile'] = $opt['rootpath'] . 'cache2/runcron.pid';
$opt['cron']['username'] = 'apache'; // system username for cronjobs
/* phpbb news integration (index.php) /* phpbb news integration (index.php)
* *
@@ -437,10 +439,11 @@
$opt['cron']['sitemaps']['generate'] = true; $opt['cron']['sitemaps']['generate'] = true;
$opt['cron']['sitemaps']['submit'] = false; $opt['cron']['sitemaps']['submit'] = false;
/* Geokret cronjob /* other cronjobs
*/ */
$opt['cron']['geokrety']['run'] = true; $opt['cron']['geokrety']['run'] = true;
$opt['cron']['autoarchive']['run'] = false;
/* E-Mail settings /* E-Mail settings
* *

View File

@@ -2487,11 +2487,16 @@ INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2065', 'Guest',
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2066', 'Open chat in a new tab/window', '2013-04-25 23:00:00'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2066', 'Open chat in a new tab/window', '2013-04-25 23:00:00');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2067', 'Status', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2067', 'Status', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2068', 'since June 2013', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2068', 'since June 2013', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2069', 'since February 2012', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2069', 'since deletion date February 2012', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2070', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2070', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2071', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2071', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2072', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2072', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2073', 'This user account is disabled.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2073', 'This user account is disabled.', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2074', 'Adoptions_', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2075', 'since September 2012', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2076', 'From Owner', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2077', 'To Owner', '2013-05-28 16:51:40');
INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2078', 'Maintenance', '2013-05-28 16:51:40');
-- Table sys_trans_ref -- Table sys_trans_ref
SET NAMES 'utf8'; SET NAMES 'utf8';
@@ -4983,7 +4988,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('158', 'DE', 'Französisch', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('158', 'DE', 'Französisch', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('159', 'DE', 'Englisch', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('159', 'DE', 'Englisch', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('160', 'DE', 'Deutsch', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('160', 'DE', 'Deutsch', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('161', 'DE', 'Vorsicht: Wenn Du diese Option verwenden, vergiss niemals auf Logout zu klicken, wenn Du dich von einem PC aus angemeldet hast der auch Fremden zugänglich ist. Ansonsten könnte ein Fremder Deine persönlichen Account-Daten auslesen und ändern.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('161', 'DE', 'Vorsicht: Wenn du diese Option verwenden, vergiss niemals auf Logout zu klicken, wenn du dich von einem PC aus angemeldet hast der auch Fremden zugänglich ist. Ansonsten könnte ein Fremder deine persönlichen Account-Daten auslesen und ändern.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('162', 'DE', 'Simbabwe', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('162', 'DE', 'Simbabwe', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('163', 'DE', 'Sambia', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('163', 'DE', 'Sambia', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('164', 'DE', 'Südafrika', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('164', 'DE', 'Südafrika', '2010-08-28 11:48:06');
@@ -5413,11 +5418,11 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('601', 'DE', 'Folgender Sicherheits-Code wurde generiert: %1', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('601', 'DE', 'Folgender Sicherheits-Code wurde generiert: %1', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('602', 'DE', 'Der Sicherheits-Code bleibt drei Tage gültig.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('602', 'DE', 'Der Sicherheits-Code bleibt drei Tage gültig.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('603', 'DE', 'Dein neues Passwort kannst du unter %1newpw.php eingeben.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('603', 'DE', 'Dein neues Passwort kannst du unter %1newpw.php eingeben.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('604', 'DE', 'Um ein neues Passwort einzugeben, musst Du zunächst einen Sicherheits-Code anfordern. Dieser wird per E-Mail an Dich gesendet.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('604', 'DE', 'Um ein neues Passwort einzugeben, musst du zunächst einen Sicherheits-Code anfordern. Dieser wird per E-Mail an dich gesendet.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('605', 'DE', 'Die E-Mail-Adresse gehört zu keinem gültigen Benutzer.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('605', 'DE', 'Die E-Mail-Adresse gehört zu keinem gültigen Benutzer.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('606', 'DE', 'Dir wurde eine E-Mail mit dem Sicherheits-Code zugesandt.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('606', 'DE', 'Dir wurde eine E-Mail mit dem Sicherheits-Code zugesandt.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('607', 'DE', 'Der Sicherheitscode konnte wegen eines Fehlers nicht gesendet werden.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('607', 'DE', 'Der Sicherheitscode konnte wegen eines Fehlers nicht gesendet werden.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitten deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst Du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitte deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('609', 'DE', 'Der angegebene Benutzer ist noch nicht aktiviert.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('609', 'DE', 'Der angegebene Benutzer ist noch nicht aktiviert.', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('610', 'DE', 'Sicherheitscode:', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('610', 'DE', 'Sicherheitscode:', '2010-08-28 11:48:06');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('611', 'DE', 'Der Sicherheitscode ist abgelaufen. Fordere bitte einen neuen an.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('611', 'DE', 'Der Sicherheitscode ist abgelaufen. Fordere bitte einen neuen an.', '2010-08-28 11:48:06');
@@ -6431,11 +6436,16 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'DE', 'Chat in neuem Tab/Fenster öffnen', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'DE', 'Chat in neuem Tab/Fenster öffnen', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'DE', 'Status', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'DE', 'Status', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'DE', 'seit Juni 2013', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'DE', 'seit Juni 2013', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'DE', 'seit Februar 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'DE', 'seit Löschdatum Februar 2012', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'DE', 'Eine oder mehrere Emails an diesen Benutzer konnten nicht zugestellt werden. Es könnte ratsam sein, Hinweise zu seinen Caches zusätzlich zu loggen, und ihn ggf. über weitere Adressen wie z.B. Forenaccounts oder andere Geocaching-Plattformen zu kontaktieren.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'DE', 'Eine oder mehrere Emails an diesen Benutzer konnten nicht zugestellt werden. Es könnte ratsam sein, Hinweise zu seinen Caches zusätzlich zu loggen, und ihn ggf. über weitere Adressen wie z.B. Forenaccounts oder andere Geocaching-Plattformen zu kontaktieren.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'DE', 'Dieser Cache ist seit mehr als einem Jahr „momentan nicht verfügbar“; daher wird er automatisch archiviert. Er kann vom Besitzer jederzeit instand gesetzt und reaktiviert werden.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'DE', 'Dieser Cache ist seit mehr als einem Jahr „momentan nicht verfügbar“; daher wird er automatisch archiviert. Er kann vom Besitzer jederzeit instand gesetzt und reaktiviert werden.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'DE', 'Dieses Event fand vor über fünf Wochen statt; daher wird es automatisch archiviert. Das Listing kann vom Owner selbst reaktiviert werden, falls es aus besonderen Gründen weiter aktiv bleiben soll.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'DE', 'Dieses Event fand vor über fünf Wochen statt; daher wird es automatisch archiviert. Das Listing kann vom Owner selbst reaktiviert werden, falls es aus besonderen Gründen weiter aktiv bleiben soll.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'DE', 'Dieser Benutzer ist deaktiviert.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'DE', 'Dieser Benutzer ist deaktiviert.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2074', 'DE', 'Adoptionen', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'DE', 'seit September 2012', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'DE', 'Alter Besitzer', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'DE', 'Neuer Besitzer', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2078', 'DE', 'Wartung', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'EN', 'Reorder IDs \r', '2010-09-02 00:15:30'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'EN', 'Reorder IDs \r', '2010-09-02 00:15:30');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'EN', 'The database could not be reconnected.', '2010-08-28 11:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'EN', 'The database could not be reconnected.', '2010-08-28 11:48:07');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'EN', 'Testing please do not login', '2010-08-28 11:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'EN', 'Testing please do not login', '2010-08-28 11:48:07');
@@ -7995,11 +8005,16 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'EN', 'Open chat in a new tab/window', '2013-02-19 05:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'EN', 'Open chat in a new tab/window', '2013-02-19 05:48:07');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'EN', 'Status', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'EN', 'Status', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'EN', 'since June 2013', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'EN', 'since June 2013', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'EN', 'since February 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'EN', 'since deletion date February 2012', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'EN', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'EN', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'EN', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'EN', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'EN', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'EN', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'EN', 'This user account is disabled.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'EN', 'This user account is disabled.', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2074', 'EN', 'Adoptions', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'EN', 'since September 2012', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'EN', 'From Owner', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'EN', 'To Owner', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2078', 'EN', 'Maintenance', '2013-04-25 23:00:00');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'ES', 'Reordenar ID', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'ES', 'Reordenar ID', '2010-12-09 00:17:55');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'ES', 'La base de datos no se pudo conectar.', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'ES', 'La base de datos no se pudo conectar.', '2010-12-09 00:17:55');
INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'ES', 'En pruebas - por favor, no entre.', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'ES', 'En pruebas - por favor, no entre.', '2010-12-09 00:17:55');

View File

@@ -710,6 +710,10 @@
/* logpw needs not to be saved */ /* logpw needs not to be saved */
/* for further explanation see restorecaches.php */ /* for further explanation see restorecaches.php */
END IF; END IF;
IF NEW.`user_id`!=OLD.`user_id` THEN
INSERT INTO `cache_adoptions` (`cache_id`,`date`,`from_user_id`,`to_user_id`)
VALUES (NEW.`cache_id`, NEW.`last_modified`, OLD.`user_id`, NEW.`user_id`);
END IF;
IF NEW.`user_id`!=OLD.`user_id` OR NEW.`status`!=OLD.`status` THEN IF NEW.`user_id`!=OLD.`user_id` OR NEW.`status`!=OLD.`status` THEN
CALL sp_update_hiddenstat(OLD.`user_id`, OLD.`status`, TRUE); CALL sp_update_hiddenstat(OLD.`user_id`, OLD.`status`, TRUE);
CALL sp_update_hiddenstat(NEW.`user_id`, NEW.`status`, FALSE); CALL sp_update_hiddenstat(NEW.`user_id`, NEW.`status`, FALSE);

View File

@@ -0,0 +1,11 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `cache_adoptions`;
CREATE TABLE IF NOT EXISTS `cache_adoptions` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cache_id` int(10) unsigned NOT NULL,
`date` datetime NOT NULL,
`from_user_id` int(10) unsigned NOT NULL,
`to_user_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `cache_id` (`cache_id`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

View File

@@ -104,7 +104,7 @@
$log_time_minute = isset($_POST['logminute']) ? trim($_POST['logminute']) : (substr($log_record['date'],11) == "00:00:00" ? "" : date('i', strtotime($log_record['date']))); $log_time_minute = isset($_POST['logminute']) ? trim($_POST['logminute']) : (substr($log_record['date'],11) == "00:00:00" ? "" : date('i', strtotime($log_record['date'])));
$top_option = isset($_POST['ratingoption']) ? $_POST['ratingoption']+0 : 0; $top_option = isset($_POST['ratingoption']) ? $_POST['ratingoption']+0 : 0;
$top_cache = isset($_POST['rating']) ? $_POST['rating']+0 : 0; $top_cache = isset($_POST['rating']) ? $_POST['rating']+0 : 0;
$oc_team_comment = isset($_POST['teamcomment']) ? ($_POST['teamcomment'] != 0) : ($log_record['oc_team_comment'] == '1'); $oc_team_comment = isset($_POST['submitform']) ? @$_POST['teamcomment']+0 : ($log_record['oc_team_comment'] == 1);
$log_pw = ''; $log_pw = '';
$use_log_pw = (($log_record['logpw'] == NULL) || ($log_record['logpw'] == '')) ? false : true; $use_log_pw = (($log_record['logpw'] == NULL) || ($log_record['logpw'] == '')) ? false : true;
@@ -222,7 +222,7 @@
} }
// ignore unauthorized team comments // ignore unauthorized team comments
if (!teamcomment_allowed($log_record['cache_id'], $log_type)) if (!teamcomment_allowed($log_record['cache_id'], $log_type, $log_record['oc_team_comment']))
$oc_team_comment = 0; $oc_team_comment = 0;
//store? //store?
@@ -289,8 +289,7 @@
$selected = ($log_record['logtype'] == $logtype ? ' selected="selected"' : ''); $selected = ($log_record['logtype'] == $logtype ? ' selected="selected"' : '');
$logtypeoptions .= '<option value="' . $logtype . '"' . $selected . '>' . htmlspecialchars($logtype_names[$logtype], ENT_COMPAT, 'UTF-8') . '</option>' . "\n"; $logtypeoptions .= '<option value="' . $logtype . '"' . $selected . '>' . htmlspecialchars($logtype_names[$logtype], ENT_COMPAT, 'UTF-8') . '</option>' . "\n";
} }
if (teamcomment_allowed($log_record['cache_id'], 3, $log_record['oc_team_comment']))
if (teamcomment_allowed($log_record['cache_id'],3))
tpl_set_var('teamcommentoption', tpl_set_var('teamcommentoption',
mb_ereg_replace('{chk_sel}', ($oc_team_comment ? 'checked' : ''), $teamcomment_field)); mb_ereg_replace('{chk_sel}', ($oc_team_comment ? 'checked' : ''), $teamcomment_field));
else else

View File

@@ -63,7 +63,7 @@
<input class="input20" type="text" name="activate_day" maxlength="2" value="{activate_day}"/>. <input class="input20" type="text" name="activate_day" maxlength="2" value="{activate_day}"/>.
<input class="input20" type="text" name="activate_month" maxlength="2" value="{activate_month}"/>. <input class="input20" type="text" name="activate_month" maxlength="2" value="{activate_month}"/>.
<input class="input40" type="text" name="activate_year" maxlength="4" value="{activate_year}"/>&nbsp; <input class="input40" type="text" name="activate_year" maxlength="4" value="{activate_year}"/>&nbsp;
<select name="activate_hour" class="input40"> <select name="activate_hour" class="input60">
{activation_hours} {activation_hours}
</select>&nbsp;' . t('#time_suffix_label#') . '&nbsp;{activate_on_message}<br /> </select>&nbsp;' . t('#time_suffix_label#') . '&nbsp;{activate_on_message}<br />
<input type="radio" class="radio" name="publish" id="publish_notnow" value="notnow" {publish_notnow_checked}>&nbsp;<label for="publish_notnow">' . t('Do not publish now.') . '</label> <input type="radio" class="radio" name="publish" id="publish_notnow" value="notnow" {publish_notnow_checked}>&nbsp;<label for="publish_notnow">' . t('Do not publish now.') . '</label>

View File

@@ -109,6 +109,11 @@
$allowed_logtypes[] = 3; // note $allowed_logtypes[] = 3; // note
} }
// always allow to keep the existing logtype when the log is edited by an admin
if ($login->hasAdminPriv(ADMIN_USER) &&
$old_logtype > 0 && !in_array($old_logtype+0,$allowed_logtypes))
$allowed_logtypes[] = $old_logtype;
return $allowed_logtypes; return $allowed_logtypes;
} }
@@ -119,7 +124,7 @@
} }
function teamcomment_allowed($cache_id, $logtype_id) function teamcomment_allowed($cache_id, $logtype_id, $old_teamcomment=false)
{ {
global $login, $opt; global $login, $opt;
@@ -127,6 +132,8 @@
return false; return false;
elseif ($logtype_id != 3 && ($logtype_id < 9 || $logtype_id > 14)) elseif ($logtype_id != 3 && ($logtype_id < 9 || $logtype_id > 14))
return false; return false;
elseif ($old_teamcomment)
return true;
else else
{ {
$rs = sql("SELECT `user_id`,`status` FROM `caches` WHERE `cache_id`='&1'", $cache_id); $rs = sql("SELECT `user_id`,`status` FROM `caches` WHERE `cache_id`='&1'", $cache_id);

View File

@@ -60,7 +60,9 @@ class RSSParser {
// increment counter // increment counter
$i++; $i++;
} }
else if (!in_array($item->title,$headlines) && // htmlspecialchars_decode() works around inconsistent HTML encoding
// e.g. in SMF Forum Threads
else if (!in_array(htmlspecialchars_decode($item->title),$headlines) &&
strpos($item->title,'VERSCHOBEN') === FALSE) // hack to exclude forum thread-move messages strpos($item->title,'VERSCHOBEN') === FALSE) // hack to exclude forum thread-move messages
{ {
// fill array // fill array
@@ -69,7 +71,7 @@ class RSSParser {
'title' => $item->title, 'title' => $item->title,
'link' => $item->link 'link' => $item->link
); );
$headlines[] = "" . $item->title; $headlines[] = "" . htmlspecialchars_decode($item->title);
// increment counter // increment counter
$i++; $i++;
} }

View File

@@ -542,6 +542,7 @@
return $result; return $result;
} }
// returns false if no more matching rows exist
function sql_fetch_row($rs) function sql_fetch_row($rs)
{ {
global $opt; global $opt;

View File

@@ -413,6 +413,9 @@ class cache
VALUES ('cache', 5, '&1', '&2', '&3', '&4')", VALUES ('cache', 5, '&1', '&2', '&3', '&4')",
$login->userid, $this->nCacheId, 0, $login->userid, $this->nCacheId, 0,
'Cache ' . sql_escape($this->nCacheId) . ' has changed the owner from userid ' . sql_escape($this->getUserId()) . ' to ' . sql_escape($userid) . ' by ' . sql_escape($login->userid)); 'Cache ' . sql_escape($this->nCacheId) . ' has changed the owner from userid ' . sql_escape($this->getUserId()) . ' to ' . sql_escape($userid) . ' by ' . sql_escape($login->userid));
// Adoptions now are recorded by trigger in cache_adoptions table.
// Recording adoptions in 'logentries' may be discarded after ensuring that the
// log entries are not used anywhere.
sql("UPDATE `caches` SET `user_id`='&1' WHERE `cache_id`='&2'", $userid, $this->nCacheId); sql("UPDATE `caches` SET `user_id`='&1' WHERE `cache_id`='&2'", $userid, $this->nCacheId);
sql("DELETE FROM `cache_adoption` WHERE `cache_id`='&1'", $this->nCacheId); sql("DELETE FROM `cache_adoption` WHERE `cache_id`='&1'", $this->nCacheId);
@@ -516,6 +519,7 @@ class cache
`csm`.`old_state` AS `old_status_id`, `csm`.`old_state` AS `old_status_id`,
`csm`.`new_state` AS `new_status_id`, `csm`.`new_state` AS `new_status_id`,
`user`.`username`, `user`.`username`,
`user`.`user_id`,
IFNULL(`stt_old`.`text`,`cs_old`.`name`) AS `old_status`, IFNULL(`stt_old`.`text`,`cs_old`.`name`) AS `old_status`,
IFNULL(`stt_new`.`text`,`cs_new`.`name`) AS `new_status` IFNULL(`stt_new`.`text`,`cs_new`.`name`) AS `new_status`
FROM `cache_status_modified` `csm` FROM `cache_status_modified` `csm`
@@ -528,6 +532,21 @@ class cache
ORDER BY `date_modified` DESC", $this->getCacheId(), $opt['template']['locale']); ORDER BY `date_modified` DESC", $this->getCacheId(), $opt['template']['locale']);
$tpl->assign_rs('status_changes',$rs); $tpl->assign_rs('status_changes',$rs);
sql_free_result($rs); sql_free_result($rs);
// Adoptions
$rs = sql("SELECT `cache_adoptions`.`date`,
`cache_adoptions`.`from_user_id`,
`cache_adoptions`.`to_user_id`,
`from_user`.`username` AS `from_username`,
`to_user`.`username` AS `to_username`
FROM `cache_adoptions`
LEFT JOIN `user` `from_user` ON `from_user`.`user_id`=`from_user_id`
LEFT JOIN `user` `to_user` ON `to_user`.`user_id`=`to_user_id`
WHERE `cache_id`='&1'
ORDER BY `cache_adoptions`.`date`, `cache_adoptions`.`id`",
$this->getCacheId());
$tpl->assign_rs('adoptions',$rs);
sql_free_result($rs);
} }
} }

View File

@@ -722,10 +722,12 @@ class user
`last_name`='', `first_name`='', `country`=NULL, `pmr_flag`=0, `last_name`='', `first_name`='', `country`=NULL, `pmr_flag`=0,
`new_pw_code`=NULL, `new_pw_date`=NULL, `new_pw_code`=NULL, `new_pw_date`=NULL,
`new_email`=NULL, `new_email_code`=NULL, `new_email_date`=NULL, `new_email`=NULL, `new_email_code`=NULL, `new_email_date`=NULL,
`email_problems`=0, `email_problems`=0, `first_email_problem`=NULL, `last_email_problem`=NULL,
`permanent_login_flag`=0, `activation_code`='', `permanent_login_flag`=0, `activation_code`='',
`notify_radius`=0, `statpic_text`='', `description`='' `notify_radius`=0
WHERE `user_id`='&1'", $this->nUserId); WHERE `user_id`='&1'", $this->nUserId);
// Statpic and profile description texts are published under the data license
// terms and therefore need not to be deleted.
sql("DELETE FROM `user_options` WHERE `user_id`='&1'", $this->nUserId); sql("DELETE FROM `user_options` WHERE `user_id`='&1'", $this->nUserId);
$this->reload(); $this->reload();
@@ -741,7 +743,7 @@ class user
$log = cachelog::createNew($rCache['cache_id'],$login->userid,true); $log = cachelog::createNew($rCache['cache_id'],$login->userid,true);
if ($log !== false) if ($log !== false)
{ {
$log->setType(cachelog::LOGTYPE_LOCKED); $log->setType(cachelog::LOGTYPE_LOCKED,true);
$log->setOcTeamComment(true); $log->setOcTeamComment(true);
$log->setDate(date('Y-m-d')); $log->setDate(date('Y-m-d'));
$log->setText($translate->t('The user account has been disabled.', '','',0,'',1, $cache->getDefaultDescLanguage())); $log->setText($translate->t('The user account has been disabled.', '','',0,'',1, $cache->getDefaultDescLanguage()));

View File

@@ -341,5 +341,10 @@ class login
return ($this->admin & $privilege) == $privilege; return ($this->admin & $privilege) == $privilege;
} }
function logged_in()
{
return $this->userid > 0;
}
} }
?> ?>

View File

@@ -231,7 +231,7 @@
$rs = sql("SELECT `id` FROM `cache_logs` $rs = sql("SELECT `id` FROM `cache_logs`
WHERE `cache_id`='&1' AND `user_id`='&2' AND `type`='&3' AND `date`='&4' AND `text`='&5'", WHERE `cache_id`='&1' AND `user_id`='&2' AND `type`='&3' AND `date`='&4' AND `text`='&5'",
$cache_id, $usr['userid'], $log_type, $log_date, $log_text); $cache_id, $usr['userid'], $log_type, $log_date, $log_text);
$already_exists = sql_fetch_row($rs) != null; $already_exists = (sql_fetch_row($rs) !== false);
sql_free_result($rs); sql_free_result($rs);
if (!$already_exists) if (!$already_exists)

View File

@@ -455,6 +455,7 @@ function output_searchresult($nResultId, $compact, $nLon1, $nLon2, $nLat1, $nLat
LEFT JOIN `caches_attributes` ON `caches_attributes`.`cache_id`=`caches`.`cache_id` AND `caches_attributes`.`attrib_id`=6 LEFT JOIN `caches_attributes` ON `caches_attributes`.`cache_id`=`caches`.`cache_id` AND `caches_attributes`.`attrib_id`=6
WHERE `map2_data`.`result_id`='&1' AND `caches`.`longitude`>'&2' AND `caches`.`longitude`<'&3' AND `caches`.`latitude`>'&4' AND `caches`.`latitude`<'&5' WHERE `map2_data`.`result_id`='&1' AND `caches`.`longitude`>'&2' AND `caches`.`longitude`<'&3' AND `caches`.`latitude`>'&4' AND `caches`.`latitude`<'&5'
AND `caches`.`status`<>6 /* hide vandalized listings, locked duplicates etc. */ AND `caches`.`status`<>6 /* hide vandalized listings, locked duplicates etc. */
AND `caches`.`status`<>7 /* ... and locked/invisible caches */
ORDER BY `caches`.`status` DESC, `oconly` AND NOT (`found` OR `notfound`), NOT (`found` OR `notfound`), `caches`.`type`<>4, MD5(`caches`.`name`) ORDER BY `caches`.`status` DESC, `oconly` AND NOT (`found` OR `notfound`), NOT (`found` OR `notfound`), `caches`.`type`<>4, MD5(`caches`.`name`)
LIMIT &7", LIMIT &7",
// sort in reverse order, because last are on top of map; // sort in reverse order, because last are on top of map;

View File

@@ -31,7 +31,20 @@
if (!$tpl->is_cached()) if (!$tpl->is_cached())
{ {
sql_temp_table_slave('loglist'); sql_temp_table_slave('loglist');
sql_slave("CREATE TEMPORARY TABLE &loglist (`id` INT(11) PRIMARY KEY) SELECT `cache_logs`.`id` FROM `cache_logs` INNER JOIN `caches` ON `cache_logs`.`cache_id`=`caches`.`cache_id` INNER JOIN `cache_status` ON `caches`.`status`=`cache_status`.`id` WHERE `cache_status`.`allow_user_view`=1 AND `caches`.`country`<>'&1' ORDER BY `cache_logs`.`date_created` DESC LIMIT &2", $exclude_country, $logcount); sql_slave("CREATE TEMPORARY TABLE &loglist (`id` INT(11) PRIMARY KEY)
SELECT `cache_logs`.`id`
FROM `cache_logs`
INNER JOIN `caches` ON `cache_logs`.`cache_id`=`caches`.`cache_id`
INNER JOIN `cache_status` ON `caches`.`status`=`cache_status`.`id`
INNER JOIN `user` ON `cache_logs`.`user_id`=`user`.`user_id`
WHERE `cache_status`.`allow_user_view`=1
AND `caches`.`country`<>'&1'
AND `username`<>'&2'
ORDER BY `cache_logs`.`date_created` DESC
LIMIT &3",
$exclude_country,
isset($_GET['showsyslogs']) ? '' : $opt['logic']['systemuser']['user'],
$logcount);
if ($opt['logic']['new_logs_per_country']) if ($opt['logic']['new_logs_per_country'])
$sqlOrderBy = '`countries`.`de` ASC, '; $sqlOrderBy = '`countries`.`de` ASC, ';
@@ -59,10 +72,9 @@
INNER JOIN `countries` ON `caches`.`country`=`countries`.`short` INNER JOIN `countries` ON `caches`.`country`=`countries`.`short`
LEFT JOIN `sys_trans_text` ON `countries`.`trans_id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1' LEFT JOIN `sys_trans_text` ON `countries`.`trans_id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1'
LEFT JOIN `cache_logs_restored` ON `cache_logs_restored`.`id`=`cache_logs`.`id` LEFT JOIN `cache_logs_restored` ON `cache_logs_restored`.`id`=`cache_logs`.`id`
WHERE `username`<>'&2' AND IFNULL(`cache_logs_restored`.`restored_by`,0)=0 WHERE IFNULL(`cache_logs_restored`.`restored_by`,0)=0
ORDER BY " . $sqlOrderBy . "`cache_logs`.`date_created` DESC", ORDER BY " . $sqlOrderBy . "`cache_logs`.`date_created` DESC",
$opt['template']['locale'], $opt['template']['locale']);
isset($_GET['showsyslogs']) ? '' : $opt['logic']['systemuser']['user']);
$newLogs = array(); $newLogs = array();

View File

@@ -806,7 +806,7 @@ class Okapi
{ {
public static $data_store; public static $data_store;
public static $server; public static $server;
public static $revision = 810; # This gets replaced in automatically deployed packages public static $revision = 817; # This gets replaced in automatically deployed packages
private static $okapi_vars = null; private static $okapi_vars = null;
/** Get a variable stored in okapi_vars. If variable not found, return $default. */ /** Get a variable stored in okapi_vars. If variable not found, return $default. */

View File

@@ -118,7 +118,7 @@ class WebService
# We don't need to do any additional queries here. # We don't need to do any additional queries here.
$fields = 'code|name|location|date_created|url|type|status|size|size2|oxsize'. $fields = 'code|name|location|date_created|url|type|status|size|size2|oxsize'.
'|difficulty|terrain|description|hint|rating|owner|url|internal_id'; '|difficulty|terrain|description|hint2|rating|owner|url|internal_id';
if ($vars['images'] != 'none') if ($vars['images'] != 'none')
$fields .= "|images"; $fields .= "|images";
if ($vars['attrs'] != 'none') if ($vars['attrs'] != 'none')

View File

@@ -113,7 +113,7 @@ http://www.gsak.net/xmlv1/5 http://www.gsak.net/xmlv1/5/gsak.xsd
&lt;/ul&gt; &lt;/ul&gt;
<? } ?> <? } ?>
</groundspeak:long_description> </groundspeak:long_description>
<groundspeak:encoded_hints><?= Okapi::xmlescape($c['hint']) ?></groundspeak:encoded_hints> <groundspeak:encoded_hints><?= Okapi::xmlescape($c['hint2']) ?></groundspeak:encoded_hints>
<? if ($vars['latest_logs']) { /* Does user want us to include latest log entries? */ ?> <? if ($vars['latest_logs']) { /* Does user want us to include latest log entries? */ ?>
<groundspeak:logs> <groundspeak:logs>
<? foreach ($c['latest_logs'] as $log) { ?> <? foreach ($c['latest_logs'] as $log) { ?>

View File

@@ -177,12 +177,17 @@
<li><b>req_passwd</b> - boolean; states if this cache requires a password <li><b>req_passwd</b> - boolean; states if this cache requires a password
in order to submit a "Found it" log entry,</li> in order to submit a "Found it" log entry,</li>
<li><b>description</b> - HTML string, description of the cache,</li> <li><b>description</b> - HTML string, description of the cache,</li>
<li><b>descriptions</b> - a dictionary (language code => HTML string) of cache <li><b>descriptions</b> - a dictionary (language code =&gt; HTML string) of cache
descriptions,</li> descriptions,</li>
<li><b>hint</b> - plain-text string, cache hints/spoilers; in general, hints should not be displayed to the user <li class="deprecated"><b>hint</b> - HTML-encoded string, cache hints/spoilers;
unless user specifically asks for them,</li> deprecated (<a href="http://code.google.com/p/opencaching-api/issues/detail?id=261">Why?</a>),
<li><b>hints</b> - a dictionary (language code => plain-text string) of cache use <b>hint2</b> instead,</li>
hints/spoilers,</li> <li class="deprecated"><b>hints</b> - a dictionary (language code =&gt;
HTML-encoded string) of cache hints/spoilers; deprecated, use hints2 instead,</li>
<li><b>hint2</b> - plain-text string, cache hints/spoilers; in general, hints
should not be displayed to the user unless user specifically asks for them,</li>
<li><b>hints2</b> - a dictionary (language code =&gt;
plain-text string) of cache hints/spoilers,</li>
<li> <li>
<p><b>images</b> - list of dictionaries, each dictionary represents one <p><b>images</b> - list of dictionaries, each dictionary represents one
image saved along the cache description; each dictionary has the image saved along the cache description; each dictionary has the

View File

@@ -33,7 +33,7 @@ class WebService
'my_notes', 'trackables_count', 'trackables', 'alt_wpts', 'last_found', 'my_notes', 'trackables_count', 'trackables', 'alt_wpts', 'last_found',
'last_modified', 'date_created', 'date_hidden', 'internal_id', 'is_watched', 'last_modified', 'date_created', 'date_hidden', 'internal_id', 'is_watched',
'is_ignored', 'willattends', 'country', 'state', 'preview_image', 'is_ignored', 'willattends', 'country', 'state', 'preview_image',
'trip_time', 'trip_distance', 'attribution_note','gc_code'); 'trip_time', 'trip_distance', 'attribution_note','gc_code', 'hint2', 'hints2');
public static function call(OkapiRequest $request) public static function call(OkapiRequest $request)
{ {
@@ -73,6 +73,7 @@ class WebService
if ( if (
in_array('description', $fields) || in_array('descriptions', $fields) in_array('description', $fields) || in_array('descriptions', $fields)
|| in_array('hint', $fields) || in_array('hints', $fields) || in_array('hint', $fields) || in_array('hints', $fields)
|| in_array('hint2', $fields) || in_array('hints2', $fields)
|| in_array('attribution_note', $fields) || in_array('attribution_note', $fields)
) )
{ {
@@ -317,6 +318,8 @@ class WebService
case 'descriptions': /* handled separately */ break; case 'descriptions': /* handled separately */ break;
case 'hint': /* handled separately */ break; case 'hint': /* handled separately */ break;
case 'hints': /* handled separately */ break; case 'hints': /* handled separately */ break;
case 'hint2': /* handled separately */ break;
case 'hints2': /* handled separately */ break;
case 'images': /* handled separately */ break; case 'images': /* handled separately */ break;
case 'preview_image': /* handled separately */ break; case 'preview_image': /* handled separately */ break;
case 'attrnames': /* handled separately */ break; case 'attrnames': /* handled separately */ break;
@@ -461,15 +464,18 @@ class WebService
# Descriptions and hints. # Descriptions and hints.
if (in_array('description', $fields) || in_array('descriptions', $fields) if (in_array('description', $fields) || in_array('descriptions', $fields)
|| in_array('hint', $fields) || in_array('hints', $fields)) || in_array('hint', $fields) || in_array('hints', $fields)
|| in_array('hint2', $fields) || in_array('hints2', $fields))
{ {
# At first, we will fill all those 4 fields, even if user requested just one # At first, we will fill all those 4 fields, even if user requested just one
# of them. We will chop off the remaining three at the end. # of them. We will chop off the remaining three at the end.
foreach ($results as &$result_ref) foreach ($results as &$result_ref)
{
$result_ref['descriptions'] = array(); $result_ref['descriptions'] = array();
foreach ($results as &$result_ref)
$result_ref['hints'] = array(); $result_ref['hints'] = array();
$result_ref['hints2'] = array();
}
# Get cache descriptions and hints. # Get cache descriptions and hints.
@@ -500,17 +506,22 @@ class WebService
$results[$cache_code]['descriptions'][strtolower($row['language'])] = $tmp; $results[$cache_code]['descriptions'][strtolower($row['language'])] = $tmp;
} }
if ($row['hint']) if ($row['hint'])
{
$results[$cache_code]['hints'][strtolower($row['language'])] = $row['hint']; $results[$cache_code]['hints'][strtolower($row['language'])] = $row['hint'];
$results[$cache_code]['hints2'][strtolower($row['language'])]
= htmlspecialchars_decode(mb_ereg_replace("<br />", "" , $row['hint']), ENT_COMPAT);
}
} }
foreach ($results as &$result_ref) foreach ($results as &$result_ref)
{ {
$result_ref['description'] = Okapi::pick_best_language($result_ref['descriptions'], $langpref); $result_ref['description'] = Okapi::pick_best_language($result_ref['descriptions'], $langpref);
$result_ref['hint'] = Okapi::pick_best_language($result_ref['hints'], $langpref); $result_ref['hint'] = Okapi::pick_best_language($result_ref['hints'], $langpref);
$result_ref['hint2'] = Okapi::pick_best_language($result_ref['hints2'], $langpref);
} }
# Remove unwanted fields. # Remove unwanted fields.
foreach (array('description', 'descriptions', 'hint', 'hints') as $field) foreach (array('description', 'descriptions', 'hint', 'hints', 'hint2', 'hints2') as $field)
if (!in_array($field, $fields)) if (!in_array($field, $fields))
foreach ($results as &$result_ref) foreach ($results as &$result_ref)
unset($result_ref[$field]); unset($result_ref[$field]);

View File

@@ -327,15 +327,15 @@ div.changelog ul li ul {font-size: 90%; margin:0}
.table td {padding: 2px 7px 5px 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} .table td {padding: 2px 7px 5px 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;}
/* .table th {margin: 0px; background-color: #e6e6e6;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } */ /* .table th {margin: 0px; background-color: #e6e6e6;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } */
/* .table th {margin: 0px; background-color: #7fa2ca;color: #f8f8f8; padding: 2px 7px 2px 7px; border: solid 0px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; } */ /* .table th {margin: 0px; background-color: #7fa2ca;color: #f8f8f8; padding: 2px 7px 2px 7px; border: solid 0px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; } */
.table th, .searchtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } .table th, .searchtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; }
.searchtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; } .searchtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; }
.searchtable td { padding-top:2px; } .searchtable td { padding-top:2px; }
.table-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} .table-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;}
.narrowtable {font-size: 10px; line-height: 2.0em; clear: left; padding: 0px; margin: 0.5em 0px 0.2em 0px; border: solid 0px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(255,255,255);} .narrowtable {font-size: 10px; line-height: 2.0em; clear: left; padding: 0px; margin: 0.5em 0px 0.2em 0px; border: solid 0px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(255,255,255);}
.narrowtable tr {margin: 0px; padding: 0px;} .narrowtable tr {margin: 0px; padding: 0px;}
.narrowtable td {padding: 0 7px 0 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} .narrowtable td {padding: 0 7px 0 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;}
.narrowtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } .narrowtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; }
.narrowtable-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} .narrowtable-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;}
td.listicon { td.listicon {

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

View File

@@ -1332,7 +1332,12 @@ function outputSearchForm($options)
// logtypen // logtypen
$logtype_options = ''; $logtype_options = '';
$rs = sql("SELECT `log_types`.`id`, IFNULL(`sys_trans_text`.`text`, `log_types`.`name`) AS `name` FROM `log_types` LEFT JOIN `sys_trans` ON `log_types`.`trans_id`=`sys_trans`.`id` AND `sys_trans`.`text`=`log_types`.`name` LEFT JOIN `sys_trans_text` ON `sys_trans`.`id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1' ORDER BY `id` ASC", $locale); $rs = sql("SELECT `log_types`.`id`,
IFNULL(`sys_trans_text`.`text`, `log_types`.`name`) AS `name`
FROM `log_types`
LEFT JOIN `sys_trans_text` ON `sys_trans_text`.`trans_id`=`log_types`.`trans_id` AND `sys_trans_text`.`lang`='&1'
ORDER BY `log_types`.`id` ASC", $locale);
for ($i = 0; $i < mysql_num_rows($rs); $i++) for ($i = 0; $i < mysql_num_rows($rs); $i++)
{ {
$record = sql_fetch_array($rs); $record = sql_fetch_array($rs);

View File

@@ -4,6 +4,7 @@
* Unicode Reminder メモ * Unicode Reminder メモ
***************************************************************************} ***************************************************************************}
{* OCSTYLE *} {* OCSTYLE *}
{if !$reportdisplay}
<div class="content2-pagetitle"> <div class="content2-pagetitle">
<img src="resource2/{$opt.template.style}/images/misc/32x32-tools.png" style="align: left; margin-right: 10px;" width="32" height="32" alt="World" /> <img src="resource2/{$opt.template.style}/images/misc/32x32-tools.png" style="align: left; margin-right: 10px;" width="32" height="32" alt="World" />
{t}Cache history{/t} {t}Cache history{/t}
@@ -16,36 +17,127 @@
<input type="submit" name="submitform" value="{t}Show{/t}" class="formbutton" onclick="submitbutton('submitform')" /> <input type="submit" name="submitform" value="{t}Show{/t}" class="formbutton" onclick="submitbutton('submitform')" />
</p> </p>
</form> </form>
{/if}
{if $showhistory} {if $showhistory}
{if !$reportdisplay}
<p> <p>
<a href="viewcache.php?cacheid={$cache.cache_id}">{$cache.name}</a> <a href="viewcache.php?cacheid={$cache.cache_id}">{$cache.name}</a>
{t}by{/t} {t}by{/t}
<a href="viewprofile.php?userid={$cache.user_id}">{$ownername}</a> <a href="viewprofile.php?userid={$cache.user_id}">{$ownername}</a>
</p> </p>
<br /> <br />
{/if}
{if !$reportdisplay || $reports|@count}
<div class="content2-container bg-blue02"> <div class="content2-container bg-blue02">
<p class="content-title-noshade-size2"> <p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/misc/32x32-tools.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" /> <img src="resource2/{$opt.template.style}/images/misc/32x32-tools.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Cache reports{/t} {if $reportdisplay} {t}Other reports for this cache{/t}{else}{t}Cache reports{/t}{/if}
</p> </p>
</div> </div>
{include file="adminreport_history.tpl"}
<br />
<table class="table" width="98%">
{if $reports|@count}
<tr>
<th>{t}ID{/t}</th>
<th>{t}Report date{/t}</th>
<th>{t}Reporter{/t}</th>
<th>{t}Reason{/t}</th>
<th>{t}Admin{/t}</th>
<th>{t}Last modified{/t}</th>
<th>{t}Status{/t}</th>
</tr>
{foreach from=$reports item=report}
<tr>
<td><a href="adminreports.php?id={$report.id}">{$report.id}</a></td>
<td>{$report.date_created|date_format:$opt.format.date}</td>
<td><a href="viewprofile.php?userid={$report.userid}">{$report.usernick}</a></td>
<td>{$report.reason}</td>
<td><a href="viewprofile.php?userid={$report.adminid}">{$report.adminnick}</a></td>
<td>{$report.lastmodified|date_format:$opt.format.date}</td>
<td>{$report.status}</td>
</tr>
{/foreach}
{else}
<tr><td></td></tr>
{/if}
</table>
<br />
{/if}
{if !$reportdisplay || $deleted_logs|@count}
<div class="content2-container bg-blue02"> <div class="content2-container bg-blue02">
<p class="content-title-noshade-size2"> <p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" /> <img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Deleted logs{/t} <small>{t}since February 2012{/t}</small> {t}Deleted logs{/t} <small>{t}since deletion date February 2012{/t}</small>
</p> </p>
</div> </div>
<div class="content2-container"> <div class="content2-container">
{include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs} {include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs}
</div> </div>
<br /> <p>&nbsp;</p>
{/if}
{include file="res_status_changes.tpl"} {if !$reportdisplay || $status_changes|@count}
<div class="content2-container bg-blue02">
<p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Status changes{/t} <small>{t}since June 2013{/t}</small>
</p>
</div>
<table class="table" width="90%">
{if $status_changes|@count}
<tr>
<th>{t}Date{/t}</th>
<th>{t}Status{/t}</th>
<th>{t}Changed by{/t}</th>
</tr>
{foreach from=$status_changes item=change}
<tr>
<td>{$change.date_modified|date_format:$opt.format.date}</td>
<td>{$change.old_status} &rarr; {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id}</td>
<td><a href="viewprofile.php?userid={$change.user_id}">{$change.username}</a></td>
</tr>
{/foreach}
{else}
<tr><td></td></tr>
{/if}
</table>
<p>&nbsp;</p>
{/if}
{if !$reportdisplay || $adoptions|@count}
<div class="content2-container bg-blue02">
<p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Adoptions_{/t} <small>{t}since September 2012{/t}</small>
</p>
</div>
<table class="table" width="90%">
{if $adoptions|@count}
<tr>
<th>{t}Date{/t}</th>
<th>{t}From Owner{/t}</th>
<th></th>
<th>{t}To Owner{/t}</th>
</tr>
{foreach from=$adoptions item=adoption}
<tr>
<td>{$adoption.date|date_format:$opt.format.date}</td>
<td><a href="viewprofile.php?userid={$adoption.from_user_id}">{$adoption.from_username}</a></th>
<td>&rarr;</td>
<td><a href="viewprofile.php?userid={$adoption.to_user_id}">{$adoption.to_username}</a></th>
</tr>
{/foreach}
{else}
<tr><td></td></tr>
{/if}
</table>
{/if}
{else} {else}
<p class="errormsg">{$error}</p> <p class="errormsg">{$error}</p>

View File

@@ -1,36 +0,0 @@
{***************************************************************************
* You can find the license in the docs directory
*
* Unicode Reminder メモ
***************************************************************************}
{* OCSTYLE *}
<table class="table" width="98%">
{if $reports|@count}
<tr>
<th>{t}ID{/t}</th>
<th>{t}Report date{/t}</th>
<th>{t}Reporter{/t}</th>
<th>{t}Reason{/t}</th>
<th>{t}Admin{/t}</th>
<th>{t}Last modified{/t}</th>
<th>{t}Status{/t}</th>
</tr>
{foreach from=$reports item=report}
<tr>
<td><a href="adminreports.php?id={$report.id}">{$report.id}</a></td>
<td>{$report.date_created|date_format:$opt.format.date}</td>
<td><a href="viewprofile.php?userid={$report.userid}">{$report.usernick}</a></td>
<td>{$report.reason}</td>
<td><a href="viewprofile.php?userid={$report.adminid}">{$report.adminnick}</a></td>
<td>{$report.lastmodified|date_format:$opt.format.date}</td>
<td>{$report.status}</td>
</tr>
{/foreach}
{else}
<tr><td></td></tr>
{/if}
</table>

View File

@@ -67,7 +67,7 @@
{/if} {/if}
<p style="line-height: 1.6em;"><b>{t}State:{/t}</b>&nbsp;{$status}&nbsp;&nbsp;<b>Admin:</b>&nbsp;{if $adminnick==''}{t}not assigned{/t}{else}{if $otheradmin}<font color="red"><b>{/if}{$adminnick|escape}{if $otheradmin}</b></font>{/if}{/if}</p> <p style="line-height: 1.6em;"><b>{t}State:{/t}</b>&nbsp;{$status}&nbsp;&nbsp;<b>Admin:</b>&nbsp;{if $adminnick==''}{t}not assigned{/t}{else}{if $otheradmin}<font color="red"><b>{/if}{$adminnick|escape}{if $otheradmin}</b></font>{/if}{/if}</p>
<p style="line-height: 1.6em;"><b>{t}Reason:{/t}</b>&nbsp;{$reason|escape|nl2br}</p> <p style="line-height: 1.6em;"><b>{t}Reason:{/t}</b>&nbsp;{$reason|escape|nl2br}</p>
<p style="line-height: 1.6em;"><b>{t}Comment:{/t}</b>&nbsp;{$note|escape|nl2br}</p> <p style="line-height: 1.6em; margin-bottom:16px"><b>{t}Comment:{/t}</b>&nbsp;{$note|escape|nl2br}</p>
<div class="content2-container bg-blue02"> <div class="content2-container bg-blue02">
<p class="content-title-noshade-size2"> <p class="content-title-noshade-size2">
@@ -76,7 +76,7 @@
</p> </p>
</div> </div>
<p style="line-height: 1.6em; margin-bottom:16px"> <p style="line-height: 1.6em; margin-bottom:24px">
{if !$ownreport} {if !$ownreport}
<input type="submit" name="assign" value="{t}Assign to me{/t}" class="formbutton" onclick="submitbutton('assign')" /> <input type="submit" name="assign" value="{t}Assign to me{/t}" class="formbutton" onclick="submitbutton('assign')" />
{else} {else}
@@ -107,32 +107,7 @@
{/if} {/if}
<br /> <br />
{if $reports|@count} {include file=adminhistory.tpl reportdisplay=true showhistory=true}
<div class="content2-container bg-blue02">
<p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/misc/32x32-tools.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Other reports for this cache{/t}
</p>
</div>
{include file="adminreport_history.tpl"}
{/if}
{if $deleted_logs|@count}
<div class="content2-container bg-blue02">
<p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Deleted logs{/t} <small>{t}since February 2012{/t}</small>
</p>
</div>
<div class="content2-container">
{include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs}
</div>
{/if}
{if $status_changes|@count}
{include file="res_status_changes.tpl"}
{/if}
{/if} {/if}
</form> </form>

View File

@@ -13,7 +13,7 @@
<p>Im Folgenden sind alle Veränderungen ab OC Version&nbsp;3.0 aufgelistet. Manche Kleinigkeiten wurden zur besseren Übersicht weggelassen und sind im <a href="http://forum.opencaching-network.org/index.php?board=43.0">Entwicklerforum</a> nachlesbar.</p> <p>Im Folgenden sind alle Veränderungen ab OC Version&nbsp;3.0 aufgelistet. Manche Kleinigkeiten wurden zur besseren Übersicht weggelassen und sind im <a href="http://forum.opencaching-network.org/index.php?board=43.0">Entwicklerforum</a> nachlesbar.</p>
<br /> <br />
<p><strong>OC 3.0 Version 8</strong> &ndash; 1. Juni 2013</p> <p id="v3.0.8"><strong>OC 3.0 Version 8</strong> &ndash; 1. Juni 2013</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li>Der Cachestatus kann (nur noch) per Log geändert werden. Dazu gibt es die neuen Logtypen <em>momentan nicht verfügbar</em>, <em>archiviert</em>, <em>gesperrt</em> und <em>kann gesucht werden</em>. Der gleiche Status kann auch mehrmals geloggt werden, z.B. um zu signalieren dass mit dem Cache alles ok ist. Der Typ alter Logs kann nachträglich geändert werden.</li> <li>Der Cachestatus kann (nur noch) per Log geändert werden. Dazu gibt es die neuen Logtypen <em>momentan nicht verfügbar</em>, <em>archiviert</em>, <em>gesperrt</em> und <em>kann gesucht werden</em>. Der gleiche Status kann auch mehrmals geloggt werden, z.B. um zu signalieren dass mit dem Cache alles ok ist. Der Typ alter Logs kann nachträglich geändert werden.</li>
@@ -76,7 +76,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 7</strong> &ndash; 19. April 2013</p> <p id="v3.0.7"><strong>OC 3.0 Version 7</strong> &ndash; 19. April 2013</p>
<ul> <ul>
<li>Neu: <a href="okapi">OKAPI</a></li> <li>Neu: <a href="okapi">OKAPI</a></li>
<li>&bdquo;Apple-Touch-Icons&ldquo; für Smartphones</li> <li>&bdquo;Apple-Touch-Icons&ldquo; für Smartphones</li>
@@ -84,7 +84,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 6</strong> &ndash; 12. April 2013</p> <p id="v3.0.6"><strong>OC 3.0 Version 6</strong> &ndash; 12. April 2013</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li>Loggen mit Uhrzeit</li> <li>Loggen mit Uhrzeit</li>
@@ -125,7 +125,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 5</strong> &ndash; 16. März 2013</p> <p id="v3.0.5"><strong>OC 3.0 Version 5</strong> &ndash; 16. März 2013</p>
<p>Karte komplett überarbeitet:</p> <p>Karte komplett überarbeitet:</p>
<ul> <ul>
<li>Markierung von eigenen, gefundenen, nicht gefundenen und <a href="http://wiki.opencaching.de/index.php/OConly" target="_blank">OConly</a>-Caches</li> <li>Markierung von eigenen, gefundenen, nicht gefundenen und <a href="http://wiki.opencaching.de/index.php/OConly" target="_blank">OConly</a>-Caches</li>
@@ -175,7 +175,7 @@
<li>dänische Flagge bei dänischen Cachebeschreibungen</li> <li>dänische Flagge bei dänischen Cachebeschreibungen</li>
</ul> </ul>
<p><strong>OC 3.0 Version 4</strong> &ndash; 17. Februar 2013</p> <p id="v3.0.4"><strong>OC 3.0 Version 4</strong> &ndash; 17. Februar 2013</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li>neue Cachegröße &bdquo;nano&ldquo;</li> <li>neue Cachegröße &bdquo;nano&ldquo;</li>
@@ -206,7 +206,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 3</strong> &ndash; 18. November 2012</p> <p id="v3.0.3"><strong>OC 3.0 Version 3</strong> &ndash; 18. November 2012</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li>Attribut &bdquo;nur zu bestimmten Jahreszeiten&ldquo;</li> <li>Attribut &bdquo;nur zu bestimmten Jahreszeiten&ldquo;</li>
@@ -231,7 +231,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 2</strong> &ndash; 26. August 2012</p> <p id="v3.0.2"><strong>OC 3.0 Version 2</strong> &ndash; 26. August 2012</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li><a href="./articles.php?page=cacheinfo#difficulty">Schwierigkeitsgrade</a> erklärt, inklusive Tooltip und Link in den Cachelistings</li> <li><a href="./articles.php?page=cacheinfo#difficulty">Schwierigkeitsgrade</a> erklärt, inklusive Tooltip und Link in den Cachelistings</li>
@@ -273,7 +273,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Version 1</strong> &ndash; 8. August 2012</p> <p id="v3.0.1"><strong>OC 3.0 Version 1</strong> &ndash; 8. August 2012</p>
<p>Neu:</p> <p>Neu:</p>
<ul> <ul>
<li>Kurzadressen für Direktzugriff auf Cachelistings, z.B. <a href="http://www.opencaching.de/OCD93B">http://opencaching.de/OCD93B</a></li> <li>Kurzadressen für Direktzugriff auf Cachelistings, z.B. <a href="http://www.opencaching.de/OCD93B">http://opencaching.de/OCD93B</a></li>

View File

@@ -79,11 +79,11 @@
Vorstandes gemeinsam vertretungsberechtigt. Vorstandes gemeinsam vertretungsberechtigt.
</p> </p>
<p> <p>
Der gesch&auml;ftsf&uuml;hrende Vorstand besteht aus (Stand 31.08.2012): Der gesch&auml;ftsf&uuml;hrende Vorstand besteht aus (Stand 06.06.2013):
</p> </p>
<ul class="indent"> <ul class="indent">
<li>Michael Vaahsen, Vorsitzender</li> <li>Michael Vaahsen, Vorsitzender</li>
<li>Gerald Halbig, stellv. Vorsitzender</li> <li>unbesetzt, stellv. Vorsitzender</li>
<li>Maik Bischoff, Kassenwart</li> <li>Maik Bischoff, Kassenwart</li>
</ul> </ul>

View File

@@ -20,7 +20,6 @@
<tr><td class="header-small"><b>Bild</b></td><td class="header-small"><b>Nickname</b></td><td class="header-small"><b>Aufgabenbereiche</b></td></tr> <tr><td class="header-small"><b>Bild</b></td><td class="header-small"><b>Nickname</b></td><td class="header-small"><b>Aufgabenbereiche</b></td></tr>
<tr><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/4_vs.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=162754">4_Vs</a></td><td>Vorsitzender</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/4_vs.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=162754">4_Vs</a></td><td>Vorsitzender</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dl8ndm.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=102263">dl8ndm</a></td><td>stellvertretender Vorsitzender</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/schrottie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=140946">Schrottie</a></td><td>Kassenwart; Anwendersupport, Datenpflege</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/schrottie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=140946">Schrottie</a></td><td>Kassenwart; Anwendersupport, Datenpflege</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/danlex.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222261">Danlex</a></td><td>Pressesprecher; Anwendersupport, Datenpflege</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/danlex.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222261">Danlex</a></td><td>Pressesprecher; Anwendersupport, Datenpflege</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dummy.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=137473">bohrsty</a></td><td>Leiter Technik/Systemadministration</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/dummy.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=137473">bohrsty</a></td><td>Leiter Technik/Systemadministration</td></tr>
@@ -31,8 +30,8 @@
<tr><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/bundy609.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=189552">Bundy609</a></td><td>Anwendersupport, Datenpflege</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/bundy609.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=189552">Bundy609</a></td><td>Anwendersupport, Datenpflege</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/clanfamily.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=244244">ClanFamily</a></td><td>Design, Softwareentwicklung</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/clanfamily.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=244244">ClanFamily</a></td><td>Design, Softwareentwicklung</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/cmanie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222664">cmanie</a></td><td>Softwareentwicklung</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dl6hbo.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=148310">dl6hbo</a></td><td>Serverbetrieb, Dokumentation</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/dl6hbo.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=148310">dl6hbo</a></td><td>Serverbetrieb, Dokumentation</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/doglobe.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=193414">doglobe</a></td><td>Projekt &bdquo;Cachewartung&ldquo;</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/flopp.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=126329">Flopp</a></td><td>Softwareentwicklung, Anwendersupport, Datenpflege</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/flopp.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=126329">Flopp</a></td><td>Softwareentwicklung, Anwendersupport, Datenpflege</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/following.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=150360">following</a></td><td>Datenpflege, Softwareentwicklung, Forenmoderation, Wiki</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/following.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=150360">following</a></td><td>Datenpflege, Softwareentwicklung, Forenmoderation, Wiki</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/friedrichfroebel.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=234947">FriedrichFröbel</a></td><td>Wiki, Forenmoderation</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/friedrichfroebel.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=234947">FriedrichFröbel</a></td><td>Wiki, Forenmoderation</td></tr>

View File

@@ -10,22 +10,22 @@
<p>Der Verein Opencaching Deutschland wurde am 9. Juni 2012 gegründet mit dem Zweck, den Betrieb von Opencaching.de (OC) zu übernehmen und die zukünftige Entwicklung von OC sicherzustellen. Ferner wird der Verein auch zukünftige Projekte zum Thema Opencaching begleiten.<br /><br /> <p>Der Verein Opencaching Deutschland wurde am 9. Juni 2012 gegründet mit dem Zweck, den Betrieb von Opencaching.de (OC) zu übernehmen und die zukünftige Entwicklung von OC sicherzustellen. Ferner wird der Verein auch zukünftige Projekte zum Thema Opencaching begleiten.<br /><br />
<em>Wo ist der Sitz des Vereins?</em><br /> <b><em>Wo ist der Sitz des Vereins?</em></b><br />
Der Sitz des Vereins ist Bad Homburg vor der Höhe. Wir haben diesen Sitz gewählt, da er zentral gelegen ist. Letztenendes ist der Sitz von Opencaching Deutschland aber zweitrangig, denn es handelt sich um einen online agierenden Verein, der das Vereinsleben (fast) komplett online abbildet.<br />Mitgliederversammlungen, Vorstandssitzungen und Konferenzen zur weiteren Entwicklung von Opencaching werden per TeamSpeak abgehalten und dokumentiert. Wir arbeiten viel mit E-Mail und natürlich in unserem <a href="http://forum.opencaching-network.org" target="_blank">Forum</a>.<br /><br /> Der Sitz des Vereins ist Bad Homburg vor der Höhe. Wir haben diesen Sitz gewählt, da er zentral gelegen ist. Letztenendes ist der Sitz von Opencaching Deutschland aber zweitrangig, denn es handelt sich um einen online agierenden Verein, der das Vereinsleben (fast) komplett online abbildet.<br />Mitgliederversammlungen, Vorstandssitzungen und Konferenzen zur weiteren Entwicklung von Opencaching werden per TeamSpeak abgehalten und dokumentiert. Wir arbeiten viel mit E-Mail und natürlich in unserem <a href="http://forum.opencaching-network.org" target="_blank">Forum</a>.<br /><br />
<em>Was kostet die Mitgliedschaft im Verein?</em><br /> <b><em>Was kostet die Mitgliedschaft im Verein?</em></b><br />
Für ordentliche Mitglieder, die Opencaching.de mitgestalten, ist die Mitgliedschaft kostenfrei. Wir sind immer auf der Suche nach Entwicklern, Grafikern, Fotografen, Lektoren, Supportlern, Dokumentatoren etc.! Wer nicht die Zeit hat, um sich bei Opencaching einzubringen, kann stattdessen Fördermitglied werden. Der Mindestbeitrag für Fördermitglieder beträgt derzeit 1 Euro / Monat.<br /><br /> Für ordentliche Mitglieder, die Opencaching.de mitgestalten, ist die Mitgliedschaft kostenfrei. Wir sind immer auf der Suche nach Entwicklern, Grafikern, Fotografen, Lektoren, Supportlern, Dokumentatoren etc.! Wer nicht die Zeit hat, um sich bei Opencaching einzubringen, kann stattdessen Fördermitglied werden. Der Mindestbeitrag für Fördermitglieder beträgt derzeit 1 Euro / Monat.<br /><br />
<em>Wo finde ich die aktuelle Satzung?</em><br /> <b><em>Wo finde ich die aktuelle Satzung?</em></b><br />
Die <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">aktuelle Satzung</a> kannst Du <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">hier</a> herunterladen.<br /><br /> Die <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">aktuelle Satzung</a> kannst Du <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">hier</a> herunterladen.<br /><br />
<em>Wo finde ich den Mitgliedsantrag?</em><br /> <b><em>Wo finde ich den Mitgliedsantrag?</em></b><br />
Den <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">Mitgliedsantrag</a> kannst Du <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">hier</a> herunterladen.<br /><br /> Den <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">Mitgliedsantrag</a> kannst Du <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">hier</a> herunterladen.<br /><br />
<em>Ich m&ouml;chte Opencaching unterst&uuml;tzen, habe aber kein Interesse an einem Vereinsbeitritt. Was kann ich noch tun?</em><br /> <b><em>Ich m&ouml;chte Opencaching unterst&uuml;tzen, habe aber kein Interesse an einem Vereinsbeitritt. Was kann ich noch tun?</em></b><br />
Da der technische Betrieb der Website laufende Kosten verursacht, sind wir auf Spenden angewiesen. Über unsere <a href="./articles.php?page=donations" target="_blank">Spendenseite</a> kannst du uns jederzeit einen kleinen Obolus zukommen lassen, auch wenige Euro helfen uns weiter.<br /><br /> Da der technische Betrieb der Website laufende Kosten verursacht, sind wir auf Spenden angewiesen. Über unsere <a href="./articles.php?page=donations" target="_blank">Spendenseite</a> kannst du uns jederzeit einen kleinen Obolus zukommen lassen, auch wenige Euro helfen uns weiter.<br /><br />
<em>Ich habe Fragen oder Anregungen zum Verein, an wen kann ich mich wenden?</em><br /> <b><em>Ich habe Fragen oder Anregungen zum Verein, an wen kann ich mich wenden?</em></b><br />
Du kannst den Vereinsvorstand unter <a href="mailto:verein@opencaching.de">verein@opencaching.de</a> gerne kontaktieren.<br /><br /> Du kannst den Vereinsvorstand unter <a href="mailto:verein@opencaching.de">verein@opencaching.de</a> gerne kontaktieren.<br /><br />
</div> </div>

View File

@@ -13,7 +13,7 @@
<p>This page lists all changes since version 3.0. Some small items have been omitted here.</p> <p>This page lists all changes since version 3.0. Some small items have been omitted here.</p>
<br /> <br />
<p><strong>OC 3.0 Release 8</strong> &ndash; June 1, 2013</p> <p id="v3.0.8"><strong>OC 3.0 Release 8</strong> &ndash; June 1, 2013</p>
<p>New:</p> <p>New:</p>
<ul> <ul>
<li>The geocache listing status can now (only) be changed by logging the new state. New log types <em>temporarily unavailable</em>, <em>archived</em>, <em>locked </em> und <em>ready for search</em> have been added. Unchanged states may be logged, too, e.g. to confirm that the cache is still searchable. The type of old logs can be changed afterwards.</li> <li>The geocache listing status can now (only) be changed by logging the new state. New log types <em>temporarily unavailable</em>, <em>archived</em>, <em>locked </em> und <em>ready for search</em> have been added. Unchanged states may be logged, too, e.g. to confirm that the cache is still searchable. The type of old logs can be changed afterwards.</li>
@@ -74,7 +74,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 7</strong> &ndash; April 19, 2013</p> <p id="v3.0.7"><strong>OC 3.0 Release 7</strong> &ndash; April 19, 2013</p>
<ul> <ul>
<li>New: <a href="okapi">OKAPI</a></li> <li>New: <a href="okapi">OKAPI</a></li>
<li>"Apple Touch Icons" for Smartphones</li> <li>"Apple Touch Icons" for Smartphones</li>
@@ -82,7 +82,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 6</strong> &ndash; April 12, 2013</p> <p id="v3.0.6"><strong>OC 3.0 Release 6</strong> &ndash; April 12, 2013</p>
<p>New:</p> <p>New:</p>
<ul> <ul>
<li>logging with time</li> <li>logging with time</li>
@@ -123,7 +123,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 5</strong> &ndash; March 16, 2013</p> <p id="v3.0.5"><strong>OC 3.0 Release 5</strong> &ndash; March 16, 2013</p>
<p>Completely reworked map:</p> <p>Completely reworked map:</p>
<ul> <ul>
<li>Own, found, not found and <a href="http://wiki.opencaching.de/index.php/OConly" target="_blank">OConly</a> caches are marked</li> <li>Own, found, not found and <a href="http://wiki.opencaching.de/index.php/OConly" target="_blank">OConly</a> caches are marked</li>
@@ -172,7 +172,7 @@
<li>fixed nano size selection in search form</li> <li>fixed nano size selection in search form</li>
</ul> </ul>
<p><strong>OC 3.0 Release 4</strong> &ndash; February 17, 2013 <p id="v3.0.4"><strong>OC 3.0 Release 4</strong> &ndash; February 17, 2013
<p>New:</p> <p>New:</p>
<ul> <ul>
<li>new cache size "nano"</li> <li>new cache size "nano"</li>
@@ -202,7 +202,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 3</strong> &ndash; November 18, 2012</p> <p id="v3.0.3"><strong>OC 3.0 Release 3</strong> &ndash; November 18, 2012</p>
<p>New:</p> <p>New:</p>
<ul> <ul>
<li>attribute "only at certain seasons"</li> <li>attribute "only at certain seasons"</li>
@@ -227,7 +227,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 2</strong> &ndash; August 26, 2012</p> <p id="v3.0.2"><strong>OC 3.0 Release 2</strong> &ndash; August 26, 2012</p>
<p>New:</p> <p>New:</p>
<ul> <ul>
<li><a href="./articles.php?page=cacheinfo#difficulty">Difficulty ratings</a> explained, including tooltips and links within the cache listings</li> <li><a href="./articles.php?page=cacheinfo#difficulty">Difficulty ratings</a> explained, including tooltips and links within the cache listings</li>
@@ -266,7 +266,7 @@
</ul> </ul>
<br /> <br />
<p><strong>OC 3.0 Release 1</strong> &ndash; August 8, 2012</p> <p id="v3.0.1"><strong>OC 3.0 Release 1</strong> &ndash; August 8, 2012</p>
<p>New:</p> <p>New:</p>
<ul> <ul>
<li>URL shortener for direct cache listing access, e.g. <a href="http://www.opencaching.de/OCD93B">http://www.opencaching.de/OCD93B</a></li> <li>URL shortener for direct cache listing access, e.g. <a href="http://www.opencaching.de/OCD93B">http://www.opencaching.de/OCD93B</a></li>

View File

@@ -62,11 +62,11 @@
</p> </p>
<p> <p>
The managing comittee are (as of August 31, 2012): The managing comittee are (as of July 06, 2013):
</p> </p>
<ul class="indent"> <ul class="indent">
<li>Michael Vaahsen, chairman</li> <li>Michael Vaahsen, chairman</li>
<li>Gerald Halbig, vice chairman</li> <li>n.n., vice chairman</li>
<li>Maik Bischoff, treasurer</li> <li>Maik Bischoff, treasurer</li>
</ul> </ul>

View File

@@ -19,7 +19,6 @@
<tr><td class="header-small"></td><td class="header-small"><b>Nickname</b></td><td class="header-small"><b>Assignments</b></td></tr> <tr><td class="header-small"></td><td class="header-small"><b>Nickname</b></td><td class="header-small"><b>Assignments</b></td></tr>
<tr><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/4_vs.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=162754">4_Vs</a></td><td>chairman</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/4_vs.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=162754">4_Vs</a></td><td>chairman</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dl8ndm.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=102263">dl8ndm</a></td><td>vice chairman</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/schrottie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=140946">Schrottie</a></td><td>treasurer; user support, data maintenance</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/schrottie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=140946">Schrottie</a></td><td>treasurer; user support, data maintenance</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/danlex.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222261">Danlex</a></td><td>press spokesman; user support, data maintenance</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/danlex.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222261">Danlex</a></td><td>press spokesman; user support, data maintenance</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dummy.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=137473">bohrsty</a></td><td>head of system administration</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/dummy.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=137473">bohrsty</a></td><td>head of system administration</td></tr>
@@ -30,8 +29,8 @@
<tr><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/bundy609.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=189552">Bundy609</a></td><td>user support, data maintenance</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/bundy609.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=189552">Bundy609</a></td><td>user support, data maintenance</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/clanfamily.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=244244">ClanFamily</a></td><td>design, software development</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/clanfamily.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=244244">ClanFamily</a></td><td>design, software development</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/cmanie.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=222664">cmanie</a></td><td>software development</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/dl6hbo.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=148310">dl6hbo</a></td><td>server operation, documentation</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/dl6hbo.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=148310">dl6hbo</a></td><td>server operation, documentation</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/doglobe.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=193414">doglobe</a></td><td>project &bdquo;cache maintenance&ldquo;</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/flopp.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=126329">Flopp</a></td><td>software development, user support, data maintenance</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/flopp.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=126329">Flopp</a></td><td>software development, user support, data maintenance</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/following.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=150360">following</a></td><td>data maintenance, software development, message board moderation, wiki</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/following.png" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=150360">following</a></td><td>data maintenance, software development, message board moderation, wiki</td></tr>
<tr><td><img src="http://www.opencaching.de/images/team/friedrichfroebel.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=234947">FriedrichFröbel</a></td><td>wiki, message board moderation</td></tr> <tr><td><img src="http://www.opencaching.de/images/team/friedrichfroebel.jpg" /></td><td><a href="http://www.opencaching.de/viewprofile.php?userid=234947">FriedrichFröbel</a></td><td>wiki, message board moderation</td></tr>

View File

@@ -10,22 +10,22 @@
<p>The Opencaching Deutschland e.V. (e.V. = registered association) was founded on June&nbsp;9, 2012 as new operator of the Opencaching.de website (OC), and to ensure future development of OC. The association may also support other upcoming Opencaching projects.<br /><br /> <p>The Opencaching Deutschland e.V. (e.V. = registered association) was founded on June&nbsp;9, 2012 as new operator of the Opencaching.de website (OC), and to ensure future development of OC. The association may also support other upcoming Opencaching projects.<br /><br />
<em>Where is the association located?</em><br /> <b><em>Where is the association located?</em></b><br />
The association's registered address is at Bad Homburg vor der Höhe near Frankfurt/Main. We chose this place because it is a central location in Germany. Eventually, the location is not important as the association nearly solely acts online. General meetings, board sessions and conferences on further development of Opencaching.de take place via TeamSpeak. We use E-Mail and &ndash; of course &ndash; our <a href="http://forum.opencaching-network.org" target="_blank">Forum</a>.<br /><br /> The association's registered address is at Bad Homburg vor der Höhe near Frankfurt/Main. We chose this place because it is a central location in Germany. Eventually, the location is not important as the association nearly solely acts online. General meetings, board sessions and conferences on further development of Opencaching.de take place via TeamSpeak. We use E-Mail and &ndash; of course &ndash; our <a href="http://forum.opencaching-network.org" target="_blank">Forum</a>.<br /><br />
<em>What do I pay as Opencaching Deutschland member?</em><br /> <b><em>What do I pay as Opencaching Deutschland member?</em></b><br />
Membership is free for active members (<em>ordentliche Mitglieder</em>) who directly contribute time and work to the Opencaching.de project. We are always looking for software developers and testes, graphic designers, photographers, lectors, support people, documenters etc.! If you don't have the time for this, you may become passive member (<em>Fördermitglied</em>). The minimum fee for passive members is 1 Euro per month.<br /><br /> Membership is free for active members (<em>ordentliche Mitglieder</em>) who directly contribute time and work to the Opencaching.de project. We are always looking for software developers and testes, graphic designers, photographers, lectors, support people, documenters etc.! If you don't have the time for this, you may become passive member (<em>Fördermitglied</em>). The minimum fee for passive members is 1 Euro per month.<br /><br />
<em>Where do I find the association's statutes?</em><br /> <b><em>Where do I find the association's statutes?</em></b><br />
You cand download the current statutes <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">here</a> (in German).<br /><br /> You cand download the current statutes <a href="http://wiki.opencaching.de/OCeV_Satzung_aktuell.pdf">here</a> (in German).<br /><br />
<em>Where do I find the membership application form?</em><br /> <b><em>Where do I find the membership application form?</em></b><br />
You can download the application form <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">here</a> (in German).<br /><br /> You can download the application form <a href="http://wiki.opencaching.de/Beitritt_OCeV_aktuell.pdf">here</a> (in German).<br /><br />
<em>I would like to support Opencaching, but I don't want do join the association. What else can I do?</em><br /> <b><em>I would like to support Opencaching, but I don't want do join the association. What else can I do?</em></b><br />
We depend on your donations to finance the technical operation of the website. We will be glad to recieve you support via our <a href="./articles.php?page=donations" target="_blank">donations page</a>; a few Euros will already help us.<br /><br /> We depend on your donations to finance the technical operation of the website. We will be glad to recieve you support via our <a href="./articles.php?page=donations" target="_blank">donations page</a>; a few Euros will already help us.<br /><br />
<em>Where can I ask further questions on the association?</em><br /> <b><em>Where can I ask further questions on the association?</em></b><br />
You are welcome to contact the chairman at <a href="mailto:verein@opencaching.de">verein@opencaching.de</a>.<br /><br /> You are welcome to contact the chairman at <a href="mailto:verein@opencaching.de">verein@opencaching.de</a>.<br /><br />
</div> </div>

View File

@@ -14,10 +14,10 @@
{t 1=$smarty.capture.cachename}Logentries for %1{/t} {t 1=$smarty.capture.cachename}Logentries for %1{/t}
<span style="font-weight: 400;">&nbsp;&nbsp; <span style="font-weight: 400;">&nbsp;&nbsp;
<img src="resource2/{$opt.template.style}/images/log/16x16-{if $cache.type==6}attended{else}found{/if}.png" width="16" height="16" align="middle" border="0" align="left" alt="{if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if}" title="{if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if}"> {$cache.found}x <img src="resource2/{$opt.template.style}/images/log/16x16-{if $cache.type==6}attended{else}found{/if}.png" width="16" height="16" align="middle" border="0" align="left" alt="{if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if}" title="{if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if}"> {$cache.found}x
<img src="resource2/{$opt.template.style}/images/log/16x16-{if $cache.type==6}will_attend{else}dnf{/if}.png" width="16" height="16" align="middle" border="0" align="left" alt="{if $cache.type==6}{t}Will attend{/t}{else}{t}Not found{/t}{/if}" title="{if $cache.type==6}{t}Will attend{/t}{else}{t}Not found{/t}{/if}"> {if $cache.type==6}{$cache.willattend}{else}{$cache.notfound}{/if}x
<img src="resource2/{$opt.template.style}/images/log/16x16-{if $cache.type==6}will_attend{else}dnf{/if}.png" width="16" height="16" align="middle" border="0" align="left" alt="{if $cache.type==6}{t}Will attend{/t}{else}{t}Not Found{/t}{/if}" title="{if $cache.type==6}{t}Will attend{/t}{else}{t}Not Found{/t}{/if}"> {if $cache.type==6}{$cache.willattend}{else}{$cache.notfound}{/if}x <img src="resource2/{$opt.template.style}/images/log/16x16-note.png" width="16" height="16" align="middle" border="0" align="left" align="{t}Note{/t}" title="{t}Note{/t}"> {$cache.note}x
{if $cache.maintenance}<img src="resource2/{$opt.template.style}/images/viewcache/16x16-maintenance_shifted.png" width="16" height="16" align="middle" border="0" align="left" align="{t}Maintenance{/t}" title="{t}Maintenance{/t}"> {$cache.maintenance}x{/if}
<img src="resource2/{$opt.template.style}/images/log/16x16-note.png" width="16" height="16" align="middle" border="0" align="left" align="{t}Note{/t}" title="{t}Note{/t}"> {$cache.note}x<br /> <br />
</span> </span>
</p> </p>
</div> </div>

View File

@@ -4,7 +4,7 @@
<td style="text-align:center; padding:0" align="center" valign="middle"> <td style="text-align:center; padding:0" align="center" valign="middle">
<div style="max-width:{$itemwidth}px; overflow:hidden"> <div style="max-width:{$itemwidth}px; overflow:hidden">
<a id="pl{$picture.pic_uuid}" href="{$picture.pic_url}"> <a id="pl{$picture.pic_uuid}" href="{$picture.pic_url}">
<img src="thumbs.php?uuid={$picture.pic_uuid}" class="img-shadow-loggallery" onclick="enlarge(this);" longdesc="{$picture.pic_url}" onload="document.getElementById('pl{$picture.pic_uuid}').removeAttribute('href'); this.alt='{$picture.title|replace:"'":"´"}'" title="{$picture.title|replace:"'":"´"}"/> {* ' in title would cause enlargit and IE errors, even if escaped *} <img src="thumbs.php?uuid={$picture.pic_uuid}" class="img-shadow-loggallery" onclick="enlarge(this);" longdesc="{$picture.pic_url}" onload="document.getElementById('pl{$picture.pic_uuid}').removeAttribute('href'); this.alt='{$picture.title|replace:"'":"´"|replace:'"':'´´'}'" title="{$picture.title|replace:"'":"´"|replace:'"':'´´'}"/> {* ' in title would cause enlargit and IE errors, even if escaped *}
</a> </a>
{if $logdate || $loguser} {if $logdate || $loguser}
<div style="line-height:1.2em; max-height:2.4em; margin-top:5px"> <div style="line-height:1.2em; max-height:2.4em; margin-top:5px">

View File

@@ -1,32 +0,0 @@
{***************************************************************************
* You can find the license in the docs directory
*
* Unicode Reminder メモ
***************************************************************************}
{* OCSTYLE *}
<div class="content2-container bg-blue02">
<p class="content-title-noshade-size2">
<img src="resource2/{$opt.template.style}/images/description/22x22-logs.png" style="align: left; margin-right: 10px;" width="22" height="22" alt="" />
{t}Status changes{/t} <small>{t}since June 2013{/t}</small>
</p>
</div>
<table class="table" width="80%">
{if $status_changes|@count}
<tr>
<th>{t}Date{/t}</th>
<th>{t}Status{/t}</th>
<th>{t}Changed by{/t}</th>
</tr>
{foreach from=$status_changes item=change}
<tr>
<td>{$change.date_modified|date_format:$opt.format.date}</td>
<td>{$change.old_status} &rarr; {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id}</td>
<td>{$change.username}</td>
</tr>
{/foreach}
{else}
<tr><td></td></tr>
{/if}
</table>

View File

@@ -1,60 +0,0 @@
#!/usr/local/bin/php -q
<?php
/***************************************************************************
./util/publish_caches/run_publish.php
-------------------
begin : Sat September 2 2006
For license information see doc/license.txt
****************************************************************************/
/***************************************************************************
Unicode Reminder メモ
Ggf. muss die Location des php-Binaries angepasst werden.
Prueft auf wartende Caches, deren Veröffentlichungszeitpunkt
gekommen ist und veröffentlicht sie.
***************************************************************************/
$rootpath = '../../';
// chdir to proper directory (needed for cronjobs)
chdir(substr(realpath($_SERVER['PHP_SELF']), 0, strrpos(realpath($_SERVER['PHP_SELF']), '/')));
require_once($rootpath . 'lib/clicompatbase.inc.php');
require_once('settings.inc.php');
require_once($rootpath . 'lib/eventhandler.inc.php');
/* begin db connect */
db_connect();
if ($dblink === false)
{
echo 'Unable to connect to database';
exit;
}
/* end db connect */
$rsPublish = sql(" SELECT `cache_id`, `user_id`
FROM `caches`
WHERE `status` = 5
AND `date_activate` <= NOW()");
while($rPublish = sql_fetch_array($rsPublish))
{
$userid = $rPublish['user_id'];
$cacheid = $rPublish['cache_id'];
// update cache status to active
// will touch the last_modified date of all depending records
sql("UPDATE `caches` SET `status`=1, `date_activate`=NULL WHERE `cache_id`='&1'", $cacheid);
// send events
event_new_cache($userid);
event_notify_new_cache($cacheid);
}
mysql_free_result($rsPublish);
?>

View File

@@ -1,4 +0,0 @@
<?php
$debug = false;
$debug_mailto = 'abc@xyz.de';
?>

View File

@@ -16,16 +16,18 @@ checkJob(new autoarchive());
class autoarchive class autoarchive
{ {
var $name = 'autoarchive'; var $name = 'autoarchive';
var $interval = 120; // provisonal minimum interval for initial archiving var $interval = 3600; // once per hour
function run() function run()
{ {
global $opt, $login; global $opt, $login;
if ($login->system_login($opt['logic']['systemuser']['user'])) if ($opt['cron']['autoarchive']['run'])
{ {
if ($login->hasAdminPriv(ADMIN_USER)) if (!$login->logged_in())
echo $this->name . ": not logged in / no system user configured\n";
elseif ($login->hasAdminPriv(ADMIN_USER))
{ {
$this->archive_disabled_caches(); $this->archive_disabled_caches();
$this->archive_events(); $this->archive_events();
@@ -43,10 +45,10 @@ class autoarchive
$rs = sql("SELECT `caches`.`cache_id` $rs = sql("SELECT `caches`.`cache_id`
FROM `caches` FROM `caches`
WHERE `caches`.`status`=2 AND `caches`.`type`<>6 WHERE `caches`.`status`=2 AND `caches`.`type`<>6
AND IFNULL((SELECT MAX(`date_modified`) FROM `cache_status_modified` `csm` WHERE `csm`.`cache_id`=`caches`.`cache_id`),`caches`.`listing_last_modified`) < NOW() - INTERVAL 365 DAY AND IFNULL((SELECT MAX(`date_modified`) FROM `cache_status_modified` `csm` WHERE `csm`.`cache_id`=`caches`.`cache_id`),`caches`.`listing_last_modified`) < NOW() - INTERVAL 366 DAY
GROUP BY `caches`.`cache_id` GROUP BY `caches`.`cache_id`
ORDER BY `caches`.`listing_last_modified` ORDER BY `caches`.`listing_last_modified`
LIMIT 1"); // provisional limit for initial archiving LIMIT 3"); // limit to avoid mass emails and spam-filter triggers
while ($rCache = sql_fetch_assoc($rs)) while ($rCache = sql_fetch_assoc($rs))
{ {
$this->archive_cache( $this->archive_cache(
@@ -68,7 +70,7 @@ class autoarchive
WHERE `caches`.`type`=6 AND `caches`.`status`=1 WHERE `caches`.`type`=6 AND `caches`.`status`=1
AND GREATEST(`date_hidden`,`date_created`) < NOW() - INTERVAL 35 DAY AND GREATEST(`date_hidden`,`date_created`) < NOW() - INTERVAL 35 DAY
ORDER BY `date_hidden` ORDER BY `date_hidden`
LIMIT 1"); // provisonal limit for initial archiving LIMIT 1");
while ($rCache = sql_fetch_assoc($rs)) while ($rCache = sql_fetch_assoc($rs))
{ {
$this->archive_cache( $this->archive_cache(
@@ -97,7 +99,9 @@ class autoarchive
// create log // create log
$log->setType(cachelog::LOGTYPE_ARCHIVED, true); $log->setType(cachelog::LOGTYPE_ARCHIVED, true);
$log->setOcTeamComment(true); $log->setOcTeamComment(true);
$log->setDate(date('Y-m-d H:i')); $log->setDate(date('Y-m-d'));
// Log without time, so that owner reactions will always appear AFTER
// the system log, no matter if logged with or without date.
// create log text in appropriate language // create log text in appropriate language
$translated_comment = $translate->t($comment, '','',0,'',1, $cache->getDefaultDescLanguage()); $translated_comment = $translate->t($comment, '','',0,'',1, $cache->getDefaultDescLanguage());

View File

@@ -3,10 +3,16 @@
* For license information see doc/license.txt * For license information see doc/license.txt
* *
* Unicode Reminder メモ * Unicode Reminder メモ
*
* Import new data from geokrety.org.
*
* See util2/geokrety for check and repair functions.
* See discussion in http://redmine.opencaching.de/issues/18.
***************************************************************************/ ***************************************************************************/
checkJob(new geokrety()); checkJob(new geokrety());
class geokrety class geokrety
{ {
var $name = 'geokrety'; var $name = 'geokrety';
@@ -39,7 +45,9 @@ class geokrety
$this->removeXML($path); $this->removeXML($path);
$modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', '2005-01-01 00:00:00')); // Changed default-value for getSysConfig() from '2005-01-01 00:00:00' to 'NOW - 9d 12h'
// to safely stay in api-limit, even when client and server are in different time zones.
$modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', date($opt['db']['dateformat'], time() - 60*60*24*9.5)));
if (!@copy('http://geokrety.org/export.php?modifiedsince=' . date('YmdHis', $modifiedsince - 1), $path)) if (!@copy('http://geokrety.org/export.php?modifiedsince=' . date('YmdHis', $modifiedsince - 1), $path))
return false; return false;
@@ -139,34 +147,46 @@ class geokrety
$longitude = $this->GetNodeAttribute($element, 'position', 'longitude')+0; $longitude = $this->GetNodeAttribute($element, 'position', 'longitude')+0;
$latitude = $this->GetNodeAttribute($element, 'position', 'latitude')+0; $latitude = $this->GetNodeAttribute($element, 'position', 'latitude')+0;
sql("INSERT INTO `gk_item` (`id`, `name`, `description`, `userid`, `datecreated`, `distancetravelled`, sql("INSERT INTO `gk_item`
`latitude`, `longitude`, `typeid`, `stateid`) (`id`, `name`, `description`, `userid`, `datecreated`, `distancetravelled`, `latitude`, `longitude`, `typeid`, `stateid`)
VALUES ('&1', '&2', '&3', '&4', '&5', '&6', VALUES
'&7', '&8', '&9', '&10') ('&1', '&2', '&3', '&4', '&5', '&6', '&7', '&8', '&9', '&10')
ON DUPLICATE KEY UPDATE `name`='&2', `description`='&3', `userid`='&4', `datecreated`='&5', ON DUPLICATE KEY UPDATE
`distancetravelled`='&6', `latitude`='&7', `longitude`='&8', `typeid`='&9', `stateid`='&10'", `name`='&2', `description`='&3', `userid`='&4', `datecreated`='&5', `distancetravelled`='&6', `latitude`='&7', `longitude`='&8', `typeid`='&9', `stateid`='&10'",
$id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, $id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, $latitude, $longitude, $typeid, $state);
$latitude, $longitude, $typeid, $state);
/* we are using now the moves to update waypoints */ // Deleting and inserting item-waypoints if they have not changed will
/* // update caches.meta_last_modified -> caches.okapi_syncbase and thus trigger
sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); // OKAPI changelog actions. This probably can be ignored as OKAPI will verify
// if data has really changed.
// update associated waypoints // update associated waypoints
/**
* This does not work properly, because geokret.waypoints does NOT contain the
* current location of the Kret but something like the last cache where it was logged.
* Evaluating the 'state' fielt might help, but for now, we import waypoint data
* from the moves instead.
sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id);
$waypoints = $element->getElementsByTagName('waypoints'); $waypoints = $element->getElementsByTagName('waypoints');
if ($waypoints->length == 1) if ($waypoints->length > 0)
{ {
$wpItems = $waypoints->item(0)->getElementsByTagName('waypoint'); $wpItems = $waypoints->item(0)->getElementsByTagName('waypoint');
for ($i = 0; $i < $wpItems->length; $i++) for ($i = 0; $i < $wpItems->length; $i++)
{ {
$wp = $wpItems->item($i)->nodeValue; $wp = $wpItems->item($i)->nodeValue;
if ($wp != '') if ($wp != '')
sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) VALUES ('&1', '&2')", $id, $wp); sql("INSERT INTO `gk_item_waypoint`
(`id`, `wp`)
VALUES
('&1', '&2')",
$id, $wp);
} }
} }
*/ */
} }
function importMove($element) function importMove($element)
{ {
global $opt; global $opt;
@@ -190,19 +210,19 @@ class geokrety
$logtypename = $this->GetNodeValue($element, 'logtype'); $logtypename = $this->GetNodeValue($element, 'logtype');
$this->checkMoveType($logtypeid, $logtypename); $this->checkMoveType($logtypeid, $logtypename);
sql("INSERT INTO `gk_move` (`id`, `itemid`, `latitude`, `longitude`, `datemoved`, `datelogged`, sql("INSERT INTO `gk_move`
`userid`, `comment`, `logtypeid`) (`id`, `itemid`, `latitude`, `longitude`, `datemoved`, `datelogged`, `userid`, `comment`, `logtypeid`)
VALUES ('&1', '&2', '&3', '&4', '&5', '&6', VALUES
'&7', '&8', '&9') ('&1', '&2', '&3', '&4', '&5', '&6', '&7', '&8', '&9')
ON DUPLICATE KEY UPDATE `itemid`='&2', `latitude`='&3', `longitude`='&4', `datemoved`='&5', ON DUPLICATE KEY UPDATE
`datelogged`='&6', `userid`='&7', `comment`='&8', `logtypeid`='&9'", `itemid`='&2', `latitude`='&3', `longitude`='&4', `datemoved`='&5', `datelogged`='&6', `userid`='&7', `comment`='&8', `logtypeid`='&9'",
$id, $gkid, $latitude, $longitude, date($opt['db']['dateformat'], $datemoved), date($opt['db']['dateformat'], $datelogged), $id, $gkid, $latitude, $longitude, date($opt['db']['dateformat'], $datemoved), date($opt['db']['dateformat'], $datelogged), $userid, $comment, $logtypeid);
$userid, $comment, $logtypeid);
sql("DELETE FROM `gk_move_waypoint` WHERE id='&1'", $id); sql("DELETE FROM `gk_move_waypoint` WHERE id='&1'", $id);
// update associated waypoints // update associated waypoints
$waypoints = $element->getElementsByTagName('waypoints'); $waypoints = $element->getElementsByTagName('waypoints');
if ($waypoints->length == 1) if ($waypoints->length > 0)
{ {
$wpItems = $waypoints->item(0)->getElementsByTagName('waypoint'); $wpItems = $waypoints->item(0)->getElementsByTagName('waypoint');
for ($i = 0; $i < $wpItems->length; $i++) for ($i = 0; $i < $wpItems->length; $i++)
@@ -213,16 +233,25 @@ class geokrety
} }
} }
// now update the current gk-waypoints based on the last move // update the current gk-waypoints based on the last move
sql("DELETE FROM `gk_item_waypoint` WHERE `id`='&1'", $gkid); sql("DELETE FROM `gk_item_waypoint` WHERE `id`='&1'", $gkid);
$rs = sql("SELECT * FROM `gk_move` WHERE `itemid`='&1' AND `logtypeid`!=2 ORDER BY `datemoved` DESC LIMIT 1", $gkid); $rs = sql("
SELECT `id`,`logtypeid` FROM `gk_move`
WHERE `itemid`='&1' AND `logtypeid`!=2
ORDER BY `datemoved` DESC LIMIT 1",
$gkid);
$r = sql_fetch_assoc($rs); $r = sql_fetch_assoc($rs);
sql_free_result($rs); sql_free_result($rs);
if ($r === false) return; if ($r === false) return;
if ($r['logtypeid'] == 0 || $r['logtypeid'] == 3) if ($r['logtypeid'] == 0 /* dropped */ || $r['logtypeid'] == 3 /* seen in */)
{ {
sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) SELECT '&1' AS `id`, `wp` FROM `gk_move_waypoint` WHERE `id`='&2' AND `wp`!=''", $gkid, $id); sql("
INSERT INTO `gk_item_waypoint` (`id`, `wp`)
SELECT '&1' AS `id`, `wp`
FROM `gk_move_waypoint`
WHERE `id`='&2' AND `wp`!=''",
$gkid, $r['id']); // "late log" bugfix: replaced $id paramter by $r['id']
} }
else else
{ {
@@ -230,11 +259,13 @@ class geokrety
} }
} }
function checkGeoKretType($id, $name) function checkGeoKretType($id, $name)
{ {
sql("INSERT INTO `gk_item_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); sql("INSERT INTO `gk_item_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name);
} }
function checkUser($id, $name) function checkUser($id, $name)
{ {
if ($id == 0) return; if ($id == 0) return;
@@ -242,11 +273,13 @@ class geokrety
sql("INSERT INTO `gk_user` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); sql("INSERT INTO `gk_user` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name);
} }
function checkMoveType($id, $name) function checkMoveType($id, $name)
{ {
sql("INSERT INTO `gk_move_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); sql("INSERT INTO `gk_move_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name);
} }
function GetNodeValue(&$domnode, $element) function GetNodeValue(&$domnode, $element)
{ {
$subnode = $domnode->getElementsByTagName($element); $subnode = $domnode->getElementsByTagName($element);
@@ -256,6 +289,7 @@ class geokrety
return $subnode->item(0)->nodeValue; return $subnode->item(0)->nodeValue;
} }
function GetNodeAttribute(&$domnode, $element, $attr) function GetNodeAttribute(&$domnode, $element, $attr)
{ {
$subnode = $domnode->getElementsByTagName($element); $subnode = $domnode->getElementsByTagName($element);

View File

@@ -16,6 +16,8 @@ class publish_caches
function run() function run()
{ {
global $login;
$rsPublish = sql("SELECT `cache_id`, `user_id` FROM `caches` WHERE `status`=5 AND NOT ISNULL(`date_activate`) AND `date_activate`<=NOW()"); $rsPublish = sql("SELECT `cache_id`, `user_id` FROM `caches` WHERE `status`=5 AND NOT ISNULL(`date_activate`) AND `date_activate`<=NOW()");
while($rPublish = sql_fetch_array($rsPublish)) while($rPublish = sql_fetch_array($rsPublish))
{ {
@@ -23,6 +25,7 @@ class publish_caches
$cacheid = $rPublish['cache_id']; $cacheid = $rPublish['cache_id'];
// update cache status to active // update cache status to active
sql("SET @STATUS_CHANGE_USER_ID='&1'", $login->userid);
sql("UPDATE `caches` SET `status`=1, `date_activate`=NULL WHERE `cache_id`='&1'", $cacheid); sql("UPDATE `caches` SET `status`=1, `date_activate`=NULL WHERE `cache_id`='&1'", $cacheid);
} }
sql_free_result($rsPublish); sql_free_result($rsPublish);

View File

@@ -29,6 +29,10 @@ class purge_logs
if ($opt['logic']['logs']['purge_userdata'] > 0) if ($opt['logic']['logs']['purge_userdata'] > 0)
sql("DELETE FROM `logentries` WHERE date_created < NOW() - INTERVAL &1 DAY AND eventid IN (6,7)", sql("DELETE FROM `logentries` WHERE date_created < NOW() - INTERVAL &1 DAY AND eventid IN (6,7)",
$opt['logic']['logs']['purge_userdata']); $opt['logic']['logs']['purge_userdata']);
// Type 5 events = adoptions are still recorded here and preliminary archived,
// but may be discarded after verifying that they are not used anywhere.
// Adoptions are now in cache_adoptions table.
} }
} }

View File

@@ -11,13 +11,15 @@
* *
***************************************************************************/ ***************************************************************************/
$opt['rootpath'] = '../../'; $opt['rootpath'] = dirname(__FILE__) . '/../../';
// chdir to proper directory (needed for cronjobs)
chdir(substr(realpath($_SERVER['PHP_SELF']), 0, strrpos(realpath($_SERVER['PHP_SELF']), '/')));
require($opt['rootpath'] . 'lib2/cli.inc.php'); require($opt['rootpath'] . 'lib2/cli.inc.php');
// test for user who runs the cronjob
$processUser = posix_getpwuid(posix_geteuid());
if ($processUser['name'] != $opt['cron']['username'])
die("ERROR: runcron must be run by '" . $opt['cron']['username'] . "' but was called by '" . $processUser['name'] . "'\n".
"Try something like 'sudo -u ".$opt['cron']['username']." php runcron.php'.\n");
// use posix pid-files to lock process // use posix pid-files to lock process
if (!CreatePidFile($opt['cron']['pidfile'])) if (!CreatePidFile($opt['cron']['pidfile']))
{ {
@@ -25,6 +27,12 @@
exit; exit;
} }
// Run as system user, if possible.
// This is relevant e.g. for publishing and for auto-archiving caches.
if ($opt['logic']['systemuser']['user'] != '')
if (!$login->system_login($opt['logic']['systemuser']['user']))
die("ERROR: runcron system user login failed");
$modules_dir = $opt['rootpath'] . 'util2/cron/modules/'; $modules_dir = $opt['rootpath'] . 'util2/cron/modules/';
$hDir = opendir($modules_dir); $hDir = opendir($modules_dir);

View File

@@ -1,4 +1,4 @@
<FilesMatch "*"> <FilesMatch ".*">
Order Deny,Allow Order Deny,Allow
Deny from All Deny from All
</FilesMatch> </FilesMatch>

View File

@@ -0,0 +1,63 @@
<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
*
* Tests for consistency of gk_item_waypoint und gk_move_waypoint tables.
* See http://redmine.opencaching.de/issues/18.
*
* Data import functions are in util2/cron/modules/geokrety.class.php.
***************************************************************************/
$opt['rootpath'] = dirname(__FILE__) . '/../../';
require_once($opt['rootpath'] . 'lib2/cli.inc.php');
$itemwps = array();
// Get item waypoints
$rs = sql("SELECT `id` AS `itemid`, `wp` FROM `gk_item_waypoint`");
while ($r = sql_fetch_assoc($rs))
$itemwps[$r['itemid']][$r['wp']]['itemwp'] = true;
sql_free_result($rs);
// Get move waypoints
$rsItems = sql("SELECT DISTINCT `itemid` AS `id` FROM `gk_move`");
while ($rItem = sql_fetch_assoc($rsItems))
{
$lastmove = sql_value("
SELECT `id` FROM `gk_move`
WHERE `itemid`='&1' AND `logtypeid`<>2
ORDER BY `datemoved` DESC, `id` DESC
LIMIT 1",
0, $rItem['id']);
$rsWp = sql("
SELECT `wp` FROM `gk_move_waypoint`
LEFT JOIN `gk_move` ON `gk_move`.`id`=`gk_move_waypoint`.`id`
WHERE `gk_move`.`id`='&1' AND `logtypeid` IN (0,3)",
$lastmove);
while ($rWp = sql_fetch_assoc($rsWp))
$itemwps[$rItem['id']][$rWp['wp']]['movewp'] = true;
sql_free_result($rsWp);
}
sql_free_result($rsItems);
// test for missing waypoints
ksort($itemwps);
foreach ($itemwps as $itemid => $wps)
foreach ($wps as $wp => $flags)
if (isset($flags['itemwp']) && !isset($flags['movewp']))
if (sql_value("SELECT COUNT(*) FROM `gk_move`, `gk_move_waypoint`
WHERE `gk_move`.`itemid`='&1'
AND `gk_move`.`logtypeid`<>2
AND `gk_move_waypoint`.`id`=`gk_move`.`id`
AND `gk_move_waypoint`.`wp`='&2'",
0, $itemid, $wp) == 0)
echo "item ".$itemid.": ".$wp." is missing in gk_move_waypoint\n";
else
echo "item ".$itemid.": ".$wp." is not the current wp in gk_move_waypoint\n";
else if (isset($flags['movewp']) && !isset($flags['itemwp']))
echo "item ".$itemid.": ".$wp." is missing in gk_item_waypoint\n";
?>

View File

@@ -0,0 +1,50 @@
<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
*
* Regenerates gk_item_waypoint from gk_move_waypoint.
* See http://redmine.opencaching.de/issues/18.
*
* Data import functions are in util2/cron/modules/geokrety.class.php.
***************************************************************************/
$opt['rootpath'] = dirname(__FILE__) . '/../../';
require_once($opt['rootpath'] . 'lib2/cli.inc.php');
if (count($argv) != 2 || $argv[1] != 'run')
die("\n".
"Please verify that runcron.php is disabled in crontab;\n".
"then run this script with\n".
"\n".
" php fix-waypoints.php run\n".
"\n".
"Don't forget to re-enable cronjobs afterwards!\n".
"\n");
sql("DELETE FROM `gk_item_waypoint`");
$rsItems = sql("SELECT DISTINCT `itemid` AS `id` FROM `gk_move`");
while ($rItem = sql_fetch_assoc($rsItems))
{
$lastmove = sql_value("
SELECT `id` FROM `gk_move`
WHERE `itemid`='&1' AND `logtypeid`<>2
/* TODO: How does Geokrety.org order moves with same date? We assume by ID: */
ORDER BY `datemoved` DESC, `id` DESC
LIMIT 1",
0, $rItem['id']);
$rsWp = sql("
INSERT INTO `gk_item_waypoint`
(SELECT `gk_move`.`itemid`, `gk_move_waypoint`.`wp`
FROM `gk_move_waypoint`
LEFT JOIN `gk_move` ON `gk_move`.`id`=`gk_move_waypoint`.`id`
WHERE `gk_move`.`id`='&1' AND `logtypeid` IN (0,3) AND `wp`<>''
)",
$lastmove);
}
sql_free_result($rsItems);
?>

View File

@@ -12,7 +12,7 @@
***************************************************************************/ ***************************************************************************/
$opt['rootpath'] = '../../'; $opt['rootpath'] = '../../';
require_once($opt['rootpath'] . 'lib2/web.inc.php'); require_once($opt['rootpath'] . 'lib2/cli.inc.php');
require_once($opt['rootpath'] . 'lib2/logic/user.class.php'); require_once($opt['rootpath'] . 'lib2/logic/user.class.php');
$login->admin = ADMIN_USER; $login->admin = ADMIN_USER;