mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-24 10:23:17 +00:00
Merge pull request #1381 from jygaulier/TASK_RECORD_MOVER
Task record mover #PHRAS-517
This commit is contained in:
@@ -81,57 +81,81 @@ class RecordMoverEditor extends AbstractEditor
|
|||||||
<tasksettings>
|
<tasksettings>
|
||||||
<logsql>0</logsql>
|
<logsql>0</logsql>
|
||||||
<!--
|
<!--
|
||||||
|
THIS IS AN EXAMPLE OF A SIMPLE WORKFLOW
|
||||||
|
Fix with your settings (fields names, base/collections id's, status-bits) before try
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- ********* un-comment to see the tasks **********
|
||||||
|
|
||||||
<tasks>
|
<tasks>
|
||||||
//Maintain offline (sb4 = 1) all docs under copyright
|
|
||||||
<task active="1" name="confidentiel" action="update" sbas_id="1">
|
<comment> keep offline (sb4 = 1) all docs before their "go online" date </comment>
|
||||||
|
|
||||||
|
<task active="1" name="stay offline" action="update" sbas_id="1">
|
||||||
<from>
|
<from>
|
||||||
<date direction="before" field="FIN_COPYRIGHT"/>
|
<date direction="before" field="GO_ONLINE"/>
|
||||||
</from>
|
</from>
|
||||||
<to>
|
<to>
|
||||||
<status mask="x1xxxx"/>
|
<status mask="x1xxxx"/>
|
||||||
</to>
|
</to>
|
||||||
</task>
|
</task>
|
||||||
//Put online (sb4 = 0) all docs from 'public' collection and between the copyright date and the date of filing
|
|
||||||
<task active="1" name="visible" action="update" sbas_id="1">
|
|
||||||
|
<comment> Put online (sb4 = 0) all docs from 'public' collection and between the online date and the date of archiving </comment>
|
||||||
|
|
||||||
|
<task active="1" name="go online" action="update" sbas_id="1">
|
||||||
<from>
|
<from>
|
||||||
<coll compare="=" id="5"/>
|
<comment> 5, 6, 7 are "public" collections </comment>
|
||||||
<date direction="after" field="FIN_COPYRIGHT"/>
|
<coll compare="=" id="5,6,7"/>
|
||||||
<date direction="before" field="ARCHIVAGE"/>
|
<date direction="after" field="GO_ONLINE"/>
|
||||||
|
<date direction="before" field="TO_ARCHIVE"/>
|
||||||
</from>
|
</from>
|
||||||
<to>
|
<to>
|
||||||
<status mask="x0xxxx"/>
|
<status mask="x0xxxx"/>
|
||||||
</to>
|
</to>
|
||||||
</task>
|
</task>
|
||||||
// Warn 10 days before archiving (raise sb5)
|
|
||||||
<task active="1" name="bientôt la fin" action="update" sbas_id="1">
|
|
||||||
|
<comment> Warn 10 days before archiving (raise sb5) </comment>
|
||||||
|
|
||||||
|
<task active="1" name="almost the end" action="update" sbas_id="1">
|
||||||
<from>
|
<from>
|
||||||
<coll compare="=" id="5"/>
|
<coll compare="=" id="5,6,7"/>
|
||||||
<date direction="after" field="ARCHIVAGE" delta="-10"/>
|
<date direction="after" field="TO_ARCHIVE" delta="-10"/>
|
||||||
</from>
|
</from>
|
||||||
<to>
|
<to>
|
||||||
<status mask="1xxxxx"/>
|
<status mask="1xxxxx"/>
|
||||||
</to>
|
</to>
|
||||||
</task>
|
</task>
|
||||||
//Move to 'archive' collection
|
|
||||||
|
|
||||||
|
<comment> Move to 'archive' collection </comment>
|
||||||
|
|
||||||
<task active="1" name="archivage" action="update" sbas_id="1">
|
<task active="1" name="archivage" action="update" sbas_id="1">
|
||||||
<from>
|
<from>
|
||||||
<coll compare="=" id="5"/>
|
<coll compare="=" id="5,6,7"/>
|
||||||
<date direction="after" field="ARCHIVAGE" />
|
<date direction="after" field="TO_ARCHIVE" />
|
||||||
</from>
|
</from>
|
||||||
<to>
|
<to>
|
||||||
<status mask="00xxxx"/> on nettoie les status pour la forme
|
<comment> reset status of archived documents </comment>
|
||||||
|
<status mask="00xxxx"/>
|
||||||
|
<comment> 666 is the "archive" collection </comment>
|
||||||
<coll id="666" />
|
<coll id="666" />
|
||||||
</to>
|
</to>
|
||||||
</task>
|
</task>
|
||||||
//Purge the archived documents from one year that are in the 'archive' collection
|
|
||||||
<task active="1" name="archivage" action="delete" sbas_id="1">
|
|
||||||
|
<comment> Delete the archived documents that are in the 'archive' collection from one year </comment>
|
||||||
|
|
||||||
|
<task active="1" name="trash" action="delete" sbas_id="1">
|
||||||
<from>
|
<from>
|
||||||
<coll compare="=" id="666"/>
|
<coll compare="=" id="666"/>
|
||||||
<date direction="after" field="ARCHIVAGE" delta="+365" />
|
<date direction="after" field="TO_ARCHIVE" delta="+365" />
|
||||||
</from>
|
</from>
|
||||||
</task>
|
</task>
|
||||||
</tasks>
|
</tasks>
|
||||||
-->
|
|
||||||
|
****************************************** -->
|
||||||
</tasksettings>
|
</tasksettings>
|
||||||
EOF;
|
EOF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ namespace Alchemy\Phrasea\TaskManager\Job;
|
|||||||
|
|
||||||
use Alchemy\Phrasea\Application;
|
use Alchemy\Phrasea\Application;
|
||||||
use Alchemy\Phrasea\TaskManager\Editor\RecordMoverEditor;
|
use Alchemy\Phrasea\TaskManager\Editor\RecordMoverEditor;
|
||||||
|
use \databox;
|
||||||
|
use Doctrine\DBAL\Connection;
|
||||||
|
use record_adapter;
|
||||||
|
|
||||||
class RecordMoverJob extends AbstractJob
|
class RecordMoverJob extends AbstractJob
|
||||||
{
|
{
|
||||||
@@ -54,11 +57,13 @@ class RecordMoverJob extends AbstractJob
|
|||||||
protected function doJob(JobData $data)
|
protected function doJob(JobData $data)
|
||||||
{
|
{
|
||||||
$app = $data->getApplication();
|
$app = $data->getApplication();
|
||||||
$task = $data->getTask();
|
|
||||||
|
|
||||||
$settings = $task->getSettings();
|
$settings = simplexml_load_string($data->getTask()->getSettings());
|
||||||
$logsql = (Boolean) $settings->logsql;
|
$logsql = (Boolean) $settings->logsql;
|
||||||
$tasks = (array) $settings->tasks;
|
$tasks = array();
|
||||||
|
foreach($settings->tasks->task as $task) {
|
||||||
|
$tasks[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
$data = $this->getData($app, $tasks, $logsql);
|
$data = $this->getData($app, $tasks, $logsql);
|
||||||
|
|
||||||
@@ -69,6 +74,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
private function processData(Application $app, $row, $logsql)
|
private function processData(Application $app, $row, $logsql)
|
||||||
{
|
{
|
||||||
|
/** @var databox $databox */
|
||||||
$databox = $app['phraseanet.appbox']->get_databox($row['sbas_id']);
|
$databox = $app['phraseanet.appbox']->get_databox($row['sbas_id']);
|
||||||
$rec = $databox->get_record($row['record_id']);
|
$rec = $databox->get_record($row['record_id']);
|
||||||
|
|
||||||
@@ -91,7 +97,8 @@ class RecordMoverJob extends AbstractJob
|
|||||||
$status[31 - $bit] = $val;
|
$status[31 - $bit] = $val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$rec->set_binary_status(implode('', $status));
|
$status = implode('', $status);
|
||||||
|
$rec->set_binary_status($status);
|
||||||
if ($logsql) {
|
if ($logsql) {
|
||||||
$this->log('debug', sprintf("on sbas %s set rid %s status to %s \n", $row['sbas_id'], $row['record_id'], $status));
|
$this->log('debug', sprintf("on sbas %s set rid %s status to %s \n", $row['sbas_id'], $row['record_id'], $status));
|
||||||
}
|
}
|
||||||
@@ -100,6 +107,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
case 'DELETE':
|
case 'DELETE':
|
||||||
if ($row['deletechildren'] && $rec->is_grouping()) {
|
if ($row['deletechildren'] && $rec->is_grouping()) {
|
||||||
|
/** @var record_adapter $child */
|
||||||
foreach ($rec->get_children() as $child) {
|
foreach ($rec->get_children() as $child) {
|
||||||
$child->delete();
|
$child->delete();
|
||||||
if ($logsql) {
|
if ($logsql) {
|
||||||
@@ -120,7 +128,6 @@ class RecordMoverJob extends AbstractJob
|
|||||||
private function getData(Application $app, array $tasks, $logsql)
|
private function getData(Application $app, array $tasks, $logsql)
|
||||||
{
|
{
|
||||||
$ret = [];
|
$ret = [];
|
||||||
|
|
||||||
foreach ($tasks as $sxtask) {
|
foreach ($tasks as $sxtask) {
|
||||||
if (!$this->isStarted()) {
|
if (!$this->isStarted()) {
|
||||||
break;
|
break;
|
||||||
@@ -128,7 +135,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
$task = $this->calcSQL($app, $sxtask);
|
$task = $this->calcSQL($app, $sxtask);
|
||||||
|
|
||||||
if (!$task['active']) {
|
if (!$task['active'] || !$task['sql']) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,6 +144,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
/** @var databox $databox */
|
||||||
$databox = $app['phraseanet.appbox']->get_databox($task['sbas_id']);
|
$databox = $app['phraseanet.appbox']->get_databox($task['sbas_id']);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$this->log('error', sprintf("can't connect sbas %s", $task['sbas_id']));
|
$this->log('error', sprintf("can't connect sbas %s", $task['sbas_id']));
|
||||||
@@ -198,22 +206,28 @@ class RecordMoverJob extends AbstractJob
|
|||||||
];
|
];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
/** @var databox $dbox */
|
||||||
$dbox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
$dbox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
||||||
|
|
||||||
$ret['basename'] = $dbox->get_label($app['locale']);
|
$ret['basename'] = $dbox->get_label($app['locale']);
|
||||||
$ret['basename_htmlencoded'] = htmlentities($ret['basename']);
|
$ret['basename_htmlencoded'] = htmlentities($ret['basename']);
|
||||||
switch ($ret['action']) {
|
try {
|
||||||
case 'UPDATE':
|
switch ($ret['action']) {
|
||||||
$ret['sql'] = $this->calcUPDATE($app, $sbas_id, $sxtask, $playTest);
|
case 'UPDATE':
|
||||||
break;
|
$ret['sql'] = $this->calcUPDATE($app, $sbas_id, $sxtask, $playTest);
|
||||||
case 'DELETE':
|
break;
|
||||||
$ret['sql'] = $this->calcDELETE($app, $sbas_id, $sxtask, $playTest);
|
case 'DELETE':
|
||||||
$ret['deletechildren'] = (int) ($sxtask['deletechildren']);
|
$ret['sql'] = $this->calcDELETE($app, $sbas_id, $sxtask, $playTest);
|
||||||
break;
|
$ret['deletechildren'] = (int)($sxtask['deletechildren']);
|
||||||
default:
|
break;
|
||||||
$ret['err'] = "bad action '" . $ret['action'] . "'";
|
default:
|
||||||
$ret['err_htmlencoded'] = htmlentities($ret['err']);
|
$ret['err'] = "bad action '" . $ret['action'] . "'";
|
||||||
break;
|
$ret['err_htmlencoded'] = htmlentities($ret['err']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$ret['err'] = $e->getMessage();
|
||||||
|
$ret['err_htmlencoded'] = htmlentities($e->getMessage());
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$ret['err'] = "bad sbas '" . $sbas_id . "'";
|
$ret['err'] = "bad sbas '" . $sbas_id . "'";
|
||||||
@@ -225,11 +239,8 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
private function calcUPDATE(Application $app, $sbas_id, &$sxtask, $playTest)
|
private function calcUPDATE(Application $app, $sbas_id, &$sxtask, $playTest)
|
||||||
{
|
{
|
||||||
$databox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
|
||||||
$connbas = $databox->get_connection();
|
|
||||||
|
|
||||||
$tws = array(); // NEGATION of updates, used to build the 'test' sql
|
$tws = array(); // NEGATION of updates, used to build the 'test' sql
|
||||||
//
|
|
||||||
// set coll_id ?
|
// set coll_id ?
|
||||||
if (($x = (int) ($sxtask->to->coll['id'])) > 0) {
|
if (($x = (int) ($sxtask->to->coll['id'])) > 0) {
|
||||||
$tws[] = 'coll_id!=' . $x;
|
$tws[] = 'coll_id!=' . $x;
|
||||||
@@ -252,9 +263,13 @@ class RecordMoverJob extends AbstractJob
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compute the 'where' clause
|
// compute the 'where' clause
|
||||||
list($tw, $join) = $this->calcWhere($app, $sbas_id, $sxtask);
|
list($tw, $join, $err) = $this->calcWhere($app, $sbas_id, $sxtask);
|
||||||
|
|
||||||
// ... complete the where to buid the TEST
|
if(!empty($err)) {
|
||||||
|
throw(new \Exception($err));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... complete the where to build the TEST
|
||||||
if (count($tws) == 1) {
|
if (count($tws) == 1) {
|
||||||
$tw[] = $tws[0];
|
$tw[] = $tws[0];
|
||||||
} elseif (count($tws) > 1) {
|
} elseif (count($tws) > 1) {
|
||||||
@@ -268,21 +283,21 @@ class RecordMoverJob extends AbstractJob
|
|||||||
}
|
}
|
||||||
|
|
||||||
// build the real sql (select)
|
// build the real sql (select)
|
||||||
$sql = 'SELECT record_id FROM record' . $join;
|
$sql_real = 'SELECT record_id FROM record' . $join;
|
||||||
if (count($tw) > 0) {
|
if (count($tw) > 0) {
|
||||||
$sql .= ' WHERE ' . ((count($tw) == 1) ? $tw[0] : '(' . implode(') AND (', $tw) . ')');
|
$sql_real .= ' WHERE ' . ((count($tw) == 1) ? $tw[0] : '(' . implode(') AND (', $tw) . ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = array(
|
$ret = array(
|
||||||
'real' => array(
|
'real' => array(
|
||||||
'sql' => $sql,
|
'sql' => $sql_real,
|
||||||
'sql_htmlencoded' => htmlentities($sql),
|
'sql_htmlencoded' => htmlentities($sql_real),
|
||||||
),
|
),
|
||||||
'test' => array(
|
'test' => array(
|
||||||
'sql' => $sql_test,
|
'sql' => $sql_test,
|
||||||
'sql_htmlencoded' => htmlentities($sql_test),
|
'sql_htmlencoded' => htmlentities($sql_test),
|
||||||
'result' => NULL,
|
'result' => null,
|
||||||
'err' => NULL
|
'err' => null
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -296,7 +311,11 @@ class RecordMoverJob extends AbstractJob
|
|||||||
private function calcDELETE(Application $app, $sbas_id, &$sxtask, $playTest)
|
private function calcDELETE(Application $app, $sbas_id, &$sxtask, $playTest)
|
||||||
{
|
{
|
||||||
// compute the 'where' clause
|
// compute the 'where' clause
|
||||||
list($tw, $join) = $this->calcWhere($app, $sbas_id, $sxtask);
|
list($tw, $join, $err) = $this->calcWhere($app, $sbas_id, $sxtask);
|
||||||
|
|
||||||
|
if(!empty($err)) {
|
||||||
|
throw(new \Exception($err));
|
||||||
|
}
|
||||||
|
|
||||||
// build the TEST sql (select)
|
// build the TEST sql (select)
|
||||||
$sql_test = 'SELECT SQL_CALC_FOUND_ROWS record_id FROM record' . $join;
|
$sql_test = 'SELECT SQL_CALC_FOUND_ROWS record_id FROM record' . $join;
|
||||||
@@ -305,20 +324,20 @@ class RecordMoverJob extends AbstractJob
|
|||||||
$sql_test .= ' LIMIT 10';
|
$sql_test .= ' LIMIT 10';
|
||||||
|
|
||||||
// build the real sql (select)
|
// build the real sql (select)
|
||||||
$sql = 'SELECT record_id FROM record' . $join;
|
$sql_real = 'SELECT record_id FROM record' . $join;
|
||||||
if (count($tw) > 0)
|
if (count($tw) > 0)
|
||||||
$sql .= ' WHERE ' . ((count($tw) == 1) ? $tw[0] : '(' . implode(') AND (', $tw) . ')');
|
$sql_real .= ' WHERE ' . ((count($tw) == 1) ? $tw[0] : '(' . implode(') AND (', $tw) . ')');
|
||||||
|
|
||||||
$ret = [
|
$ret = [
|
||||||
'real' => [
|
'real' => [
|
||||||
'sql' => $sql,
|
'sql' => $sql_real,
|
||||||
'sql_htmlencoded' => htmlentities($sql),
|
'sql_htmlencoded' => htmlentities($sql_real),
|
||||||
],
|
],
|
||||||
'test' => [
|
'test' => [
|
||||||
'sql' => $sql_test,
|
'sql' => $sql_test,
|
||||||
'sql_htmlencoded' => htmlentities($sql_test),
|
'sql_htmlencoded' => htmlentities($sql_test),
|
||||||
'result' => NULL,
|
'result' => null,
|
||||||
'err' => NULL
|
'err' => null
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -331,6 +350,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
private function playTest(Application $app, $sbas_id, $sql)
|
private function playTest(Application $app, $sbas_id, $sql)
|
||||||
{
|
{
|
||||||
|
/** @var databox $databox */
|
||||||
$databox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
$databox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
||||||
$connbas = $databox->get_connection();
|
$connbas = $databox->get_connection();
|
||||||
$result = ['rids' => [], 'err' => '', 'n' => null];
|
$result = ['rids' => [], 'err' => '', 'n' => null];
|
||||||
@@ -344,7 +364,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
}
|
}
|
||||||
$stmt->closeCursor();
|
$stmt->closeCursor();
|
||||||
} else {
|
} else {
|
||||||
$result['err'] = $connbas->last_error();
|
$result['err'] = $connbas->errorInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
@@ -352,16 +372,21 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
private function calcWhere(Application $app, $sbas_id, &$sxtask)
|
private function calcWhere(Application $app, $sbas_id, &$sxtask)
|
||||||
{
|
{
|
||||||
|
$err = "";
|
||||||
|
/** @var databox $databox */
|
||||||
$databox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
$databox = $app['phraseanet.appbox']->get_databox($sbas_id);
|
||||||
|
/** @var Connection $connbas */
|
||||||
$connbas = $databox->get_connection();
|
$connbas = $databox->get_connection();
|
||||||
|
|
||||||
|
$struct = $databox->get_meta_structure();
|
||||||
|
|
||||||
$tw = array();
|
$tw = array();
|
||||||
$join = '';
|
$join = '';
|
||||||
|
|
||||||
$ijoin = 0;
|
$ijoin = 0;
|
||||||
|
|
||||||
// criteria <type type="XXX" />
|
// criteria <type type="XXX" />
|
||||||
if (($x = $sxtask->from->type['type']) !== NULL) {
|
if (($x = $sxtask->from->type['type']) !== null) {
|
||||||
switch (strtoupper($x)) {
|
switch (strtoupper($x)) {
|
||||||
case 'RECORD':
|
case 'RECORD':
|
||||||
$tw[] = 'parent_record_id!=record_id';
|
$tw[] = 'parent_record_id!=record_id';
|
||||||
@@ -374,44 +399,65 @@ class RecordMoverJob extends AbstractJob
|
|||||||
|
|
||||||
// criteria <text field="XXX" compare="OP" value="ZZZ" />
|
// criteria <text field="XXX" compare="OP" value="ZZZ" />
|
||||||
foreach ($sxtask->from->text as $x) {
|
foreach ($sxtask->from->text as $x) {
|
||||||
$ijoin++;
|
$field = $struct->get_element_by_name($x['field']);
|
||||||
$comp = strtoupper($x['compare']);
|
if($field != null) {
|
||||||
if (in_array($comp, array('<', '>', '<=', '>=', '=', '!='))) {
|
$ijoin++;
|
||||||
$s = 'p' . $ijoin . '.name=' . $connbas->quote($x['field']) . ' AND p' . $ijoin . '.value' . $comp
|
$comp = trim($x['compare']);
|
||||||
. '' . $connbas->quote($x['value']) . '';
|
if (in_array($comp, array('<', '>', '<=', '>=', '=', '!='))) {
|
||||||
|
$s = 'p' . $ijoin . '.meta_struct_id=' . $connbas->quote($field->get_id()) . ' AND p' . $ijoin . '.value' . $comp
|
||||||
|
. '' . $connbas->quote($x['value']) . '';
|
||||||
|
|
||||||
$tw[] = $s;
|
$tw[] = $s;
|
||||||
$join .= ' INNER JOIN prop AS p' . $ijoin . ' USING(record_id)';
|
$join .= ' INNER JOIN metadatas AS p' . $ijoin . ' USING(record_id)';
|
||||||
|
} else {
|
||||||
|
// bad comparison operator
|
||||||
|
$err .= sprintf("bad comparison operator (%s)\n", $comp);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// bad comparison operator
|
// unknown field ?
|
||||||
|
$err .= sprintf("unknown field (%s)\n", $x['field']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// criteria <date direction ="XXX" field="YYY" delta="Z" />
|
// criteria <date direction ="XXX" field="YYY" delta="Z" />
|
||||||
foreach ($sxtask->from->date as $x) {
|
foreach ($sxtask->from->date as $x) {
|
||||||
$ijoin++;
|
$field = $struct->get_element_by_name($x['field']);
|
||||||
$s = 'p' . $ijoin . '.name=\'' . $x['field'] . '\' AND NOW()';
|
if($field != null) {
|
||||||
$s .= strtoupper($x['direction']) == 'BEFORE' ? '<' : '>=';
|
$ijoin++;
|
||||||
$delta = (int) ($x['delta']);
|
$s = 'p' . $ijoin . '.meta_struct_id=' . $connbas->quote($field->get_id()) . ' AND NOW()';
|
||||||
if ($delta > 0) {
|
$dir = strtoupper($x['direction']);
|
||||||
$s .= '(p' . $ijoin . '.value+INTERVAL ' . $delta . ' DAY)';
|
if (in_array($dir, array('BEFORE', 'AFTER'))) {
|
||||||
}
|
// prevent malformed dates to act
|
||||||
elseif ($delta < 0) {
|
$tw[] = '!ISNULL(CAST(p' . $ijoin . '.value AS DATETIME))';
|
||||||
$s .= '(p' . $ijoin . '.value-INTERVAL ' . -$delta . ' DAY)';
|
$s .= $dir == 'BEFORE' ? '<' : '>=';
|
||||||
|
$delta = (int)($x['delta']);
|
||||||
|
if ($delta > 0) {
|
||||||
|
$s .= '(p' . $ijoin . '.value+INTERVAL ' . $delta . ' DAY)';
|
||||||
|
} elseif ($delta < 0) {
|
||||||
|
$s .= '(p' . $ijoin . '.value-INTERVAL ' . -$delta . ' DAY)';
|
||||||
|
} else {
|
||||||
|
$s .= 'CAST(p' . $ijoin . '.value AS DATETIME)';
|
||||||
|
}
|
||||||
|
|
||||||
|
$tw[] = $s;
|
||||||
|
$join .= ' INNER JOIN metadatas AS p' . $ijoin . ' USING(record_id)';
|
||||||
|
} else {
|
||||||
|
// bad direction
|
||||||
|
$err .= sprintf("bad direction (%s)\n", $x['direction']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$s .= 'p' . $ijoin . '.value';
|
// unknown field ?
|
||||||
|
$err .= sprintf("unknown field (%s)\n", $x['field']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tw[] = $s;
|
|
||||||
$join .= ' INNER JOIN prop AS p' . $ijoin . ' USING(record_id)';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// criteria <coll compare="OP" id="X,Y,Z" />
|
// criteria <coll compare="OP" id="X,Y,Z" />
|
||||||
if (($x = $sxtask->from->coll) !== NULL) {
|
if (($x = $sxtask->from->coll) ) {
|
||||||
$tcoll = explode(',', $x['id']);
|
$tcoll = explode(',', $x['id']);
|
||||||
foreach ($tcoll as $i => $c)
|
foreach ($tcoll as $i => $c) {
|
||||||
$tcoll[$i] = (int) $c;
|
$tcoll[$i] = (int)$c;
|
||||||
|
}
|
||||||
if ($x['compare'] == '=') {
|
if ($x['compare'] == '=') {
|
||||||
if (count($tcoll) == 1) {
|
if (count($tcoll) == 1) {
|
||||||
$tw[] = 'coll_id = ' . $tcoll[0];
|
$tw[] = 'coll_id = ' . $tcoll[0];
|
||||||
@@ -426,6 +472,7 @@ class RecordMoverJob extends AbstractJob
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// bad operator
|
// bad operator
|
||||||
|
$err .= sprintf("bad comparison operator (%s)\n", $x['compare']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,6 +490,6 @@ class RecordMoverJob extends AbstractJob
|
|||||||
$tw[] = '(status & 0b' . $ma . ")=0";
|
$tw[] = '(status & 0b' . $ma . ")=0";
|
||||||
}
|
}
|
||||||
|
|
||||||
return array($tw, $join);
|
return array($tw, $join, $err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,30 +63,32 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
function taskFillGraphic(xml)
|
function taskFillGraphic(xml)
|
||||||
{
|
{
|
||||||
if (xml) {
|
if (xml) {
|
||||||
xml = $.parseXML(xml);
|
xml = $.parseXML(xml);
|
||||||
xml = $(xml);
|
xml = $(xml);
|
||||||
|
|
||||||
with(document.forms['graphicForm'])
|
var gform = document.forms['graphicForm'];
|
||||||
{
|
var i;
|
||||||
var i;
|
var opts;
|
||||||
var opts;
|
var found;
|
||||||
var found;
|
opts = gform.base_id.options;
|
||||||
opts = base_id.options;
|
for (found=0, i=1; found==0 && i<opts.length; i++) {
|
||||||
for (found=0, i=1; found==0 && i<opts.length; i++) {
|
if(opts[i].value == xml.find("base_id").text()) {
|
||||||
if(opts[i].value == xml.find("base_id").text())
|
|
||||||
found = i;
|
found = i;
|
||||||
}
|
}
|
||||||
opts[found].selected = true;
|
|
||||||
hotfolder.value = xml.find("hotfolder").text();
|
|
||||||
cold.value = xml.find("cold").text();
|
|
||||||
move_archived.checked = Number(xml.find("move_archived").text()) > 0;
|
|
||||||
move_error.checked = Number(xml.find("move_error").text()) > 0;
|
|
||||||
delfolder.checked = Number(xml.find("delfolder").text()) > 0;
|
|
||||||
copy_spe.checked = Number(xml.find("copy_spe").text()) > 0;
|
|
||||||
}
|
}
|
||||||
|
opts[found].selected = true;
|
||||||
|
gform.hotfolder.value = xml.find("hotfolder").text();
|
||||||
|
gform.cold.value = xml.find("cold").text();
|
||||||
|
gform.move_archived.checked = Number(xml.find("move_archived").text()) > 0;
|
||||||
|
gform.move_error.checked = Number(xml.find("move_error").text()) > 0;
|
||||||
|
gform.delfolder.checked = Number(xml.find("delfolder").text()) > 0;
|
||||||
|
gform.copy_spe.checked = Number(xml.find("copy_spe").text()) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -67,25 +67,25 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
function taskFillGraphic(xml)
|
function taskFillGraphic(xml)
|
||||||
{
|
{
|
||||||
if (xml) {
|
if (xml) {
|
||||||
xml = $.parseXML(xml);
|
xml = $.parseXML(xml);
|
||||||
xml = $(xml);
|
xml = $(xml);
|
||||||
|
|
||||||
with(document.forms['graphicForm'])
|
var gform = document.forms['graphicForm'];
|
||||||
{
|
gform.proxy.value = xml.find("proxy").text();
|
||||||
proxy.value = xml.find("proxy").text();
|
gform.proxyport.value = xml.find("proxyport").text();
|
||||||
proxyport.value = xml.find("proxyport").text();
|
gform.localpath.value = xml.find("localpath").text();
|
||||||
localpath.value = xml.find("localpath").text();
|
gform.ftppath.value = xml.find("ftppath").text();
|
||||||
ftppath.value = xml.find("ftppath").text();
|
gform.host.value = xml.find("host").text();
|
||||||
host.value = xml.find("host").text();
|
gform.port.value = xml.find("port").text();
|
||||||
port.value = xml.find("port").text();
|
gform.user.value = xml.find("user").text();
|
||||||
user.value = xml.find("user").text();
|
gform.password.value = xml.find("password").text();
|
||||||
password.value = xml.find("password").text();
|
gform.ssl.checked = Number(xml.find("ssl").text()) > 0;
|
||||||
ssl.checked = Number(xml.find("ssl").text()) > 0;
|
gform.passive.checked = Number(xml.find("passive").text()) > 0;
|
||||||
passive.checked = Number(xml.find("passive").text()) > 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -17,17 +17,17 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
function taskFillGraphic(xml)
|
function taskFillGraphic(xml)
|
||||||
{
|
{
|
||||||
if (xml) {
|
if (xml) {
|
||||||
xml = $.parseXML(xml);
|
xml = $.parseXML(xml);
|
||||||
xml = $(xml);
|
xml = $(xml);
|
||||||
|
|
||||||
with(document.forms['graphicForm'])
|
var gform = document.forms['graphicForm'];
|
||||||
{
|
gform.proxy.value = xml.find("proxy").text();
|
||||||
proxy.value = xml.find("proxy").text();
|
gform.proxyport.value = xml.find("proxyport").text();
|
||||||
proxyport.value = xml.find("proxyport").text();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -67,6 +67,8 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
function taskFillGraphic(xml)
|
function taskFillGraphic(xml)
|
||||||
{
|
{
|
||||||
$("#sqlu").text("");
|
$("#sqlu").text("");
|
||||||
@@ -155,4 +157,5 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -66,6 +66,8 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
function minmax(v, _min, _max)
|
function minmax(v, _min, _max)
|
||||||
{
|
{
|
||||||
if(isNaN(v) || v < _min)
|
if(isNaN(v) || v < _min)
|
||||||
@@ -112,4 +114,5 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -48,11 +48,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
function taskFillGraphic(xml) { };
|
function taskFillGraphic(xml) { };
|
||||||
{% endblock %}
|
|
||||||
</script>
|
</script>
|
||||||
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
|||||||
@@ -21,17 +21,17 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
|
<script type="text/javascript">
|
||||||
function taskFillGraphic(xml)
|
function taskFillGraphic(xml)
|
||||||
{
|
{
|
||||||
if (xml) {
|
if (xml) {
|
||||||
xml = $.parseXML(xml);
|
xml = $.parseXML(xml);
|
||||||
xml = $(xml);
|
xml = $(xml);
|
||||||
|
|
||||||
with(document.forms['graphicForm'])
|
var gform = document.forms['graphicForm'];
|
||||||
{
|
gform.cleardoc.checked = Number(xml.find("cleardoc").text()) > 0;
|
||||||
cleardoc.checked = Number(xml.find("cleardoc").text()) > 0;
|
gform.mwg.checked = Number(xml.find("mwg").text()) > 0;
|
||||||
mwg.checked = Number(xml.find("mwg").text()) > 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user