mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-24 10:23:17 +00:00
PHRAS-524
close #1378 task subdef - fix filter on document type - add filter on multiple databoxes
This commit is contained in:
committed by
Benoît Burnichon
parent
3b1d5aff10
commit
a7af07b00c
@@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
namespace Alchemy\Phrasea\TaskManager\Editor;
|
namespace Alchemy\Phrasea\TaskManager\Editor;
|
||||||
|
|
||||||
|
use Alchemy\Phrasea\Application;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||||
use Alchemy\Phrasea\Core\Configuration\PropertyAccess;
|
use Alchemy\Phrasea\Core\Configuration\PropertyAccess;
|
||||||
|
|
||||||
class SubdefsEditor extends AbstractEditor
|
class SubdefsEditor extends AbstractEditor
|
||||||
@@ -40,7 +44,7 @@ class SubdefsEditor extends AbstractEditor
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<tasksettings>
|
<tasksettings>
|
||||||
<embedded>1</embedded>
|
<embedded>1</embedded>
|
||||||
<sbas>0</sbas>
|
<sbas/>
|
||||||
<type_image>1</type_image>
|
<type_image>1</type_image>
|
||||||
<type_video>1</type_video>
|
<type_video>1</type_video>
|
||||||
<type_audio>1</type_audio>
|
<type_audio>1</type_audio>
|
||||||
@@ -70,7 +74,77 @@ EOF;
|
|||||||
'flush' => static::FORM_TYPE_INTEGER,
|
'flush' => static::FORM_TYPE_INTEGER,
|
||||||
'maxrecs' => static::FORM_TYPE_INTEGER,
|
'maxrecs' => static::FORM_TYPE_INTEGER,
|
||||||
'maxmegs' => static::FORM_TYPE_INTEGER,
|
'maxmegs' => static::FORM_TYPE_INTEGER,
|
||||||
'embedded' => static::FORM_TYPE_BOOLEAN
|
'embedded' => static::FORM_TYPE_BOOLEAN,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function updateXMLWithRequest(Request $request)
|
||||||
|
{
|
||||||
|
$dom = $this->createBlankDom();
|
||||||
|
|
||||||
|
if (false === @$dom->loadXML($request->request->get('xml'))) {
|
||||||
|
throw new BadRequestHttpException('Invalid XML data.');
|
||||||
|
}
|
||||||
|
foreach ($this->getFormProperties() as $name => $type) {
|
||||||
|
|
||||||
|
$values = $request->request->get($name);
|
||||||
|
if($values === null) {
|
||||||
|
$values = array();
|
||||||
|
} elseif(!is_array($values)) {
|
||||||
|
$values = array($values);
|
||||||
|
}
|
||||||
|
|
||||||
|
// erase the former setting but keep the node in place.
|
||||||
|
// in case on multi-valued, keep only the first node (except if no value at all: erase all)
|
||||||
|
foreach($dom->getElementsByTagName($name) as $i=>$node) {
|
||||||
|
if($i > 0 || count($values)==0) {
|
||||||
|
$node->parentNode->removeChild($node);
|
||||||
|
} else {
|
||||||
|
while ($child = $node->firstChild) {
|
||||||
|
$node->removeChild($child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if no setting to write, no reason to create a node
|
||||||
|
if(count($values) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// in case the node did not exist at all, create one
|
||||||
|
if ( ($node = $dom->getElementsByTagName($name)->item(0)) === null) {
|
||||||
|
$node = $dom->documentElement->appendChild($dom->createElement($name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// because dom::insertBefore is used, reverse allows to respect order while serializing.
|
||||||
|
$values = array_reverse($values);
|
||||||
|
|
||||||
|
// write
|
||||||
|
foreach($values as $i=>$value) {
|
||||||
|
if($i>0) {
|
||||||
|
// multi-valued ? add an entry
|
||||||
|
$node = $dom->documentElement->insertBefore($dom->createElement($name), $node);
|
||||||
|
}
|
||||||
|
$node->appendChild($dom->createTextNode($this->toXMLValue($type, $value)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response($dom->saveXML(), 200, ['Content-type' => 'text/xml']);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function toXMLValue($type, $value)
|
||||||
|
{
|
||||||
|
switch ($type) {
|
||||||
|
case static::FORM_TYPE_BOOLEAN:
|
||||||
|
$value = (!$value ? '0' : '1');
|
||||||
|
break;
|
||||||
|
case static::FORM_TYPE_INTEGER:
|
||||||
|
$value = ($value !== null ? (string)((int) $value) : '');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,18 +60,39 @@ class SubdefsJob extends AbstractJob
|
|||||||
|
|
||||||
Image2Image::$lookForEmbeddedPreview = $thumbnailExtraction;
|
Image2Image::$lookForEmbeddedPreview = $thumbnailExtraction;
|
||||||
|
|
||||||
|
$sqlqmark = array();
|
||||||
|
$sqlparms = array();
|
||||||
|
foreach(array('image',
|
||||||
|
'video',
|
||||||
|
'audio',
|
||||||
|
'document',
|
||||||
|
'flash',
|
||||||
|
'unknown') as $type) {
|
||||||
|
if (!isset($settings->{"type_" . $type}) || !\p4field::isno($settings->{"type_" . $type})) {
|
||||||
|
$sqlqmark[] = '?';
|
||||||
|
$sqlparms[] = $type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
|
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
|
||||||
if (!$this->isStarted()) {
|
if (!$this->isStarted()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(count($settings->xpath("sbas[text()=".$databox->get_sbas_id() ."]")) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$conn = $databox->get_connection();
|
$conn = $databox->get_connection();
|
||||||
|
|
||||||
$sql = 'SELECT coll_id, record_id
|
$sql = 'SELECT coll_id, record_id FROM record'
|
||||||
FROM record
|
. ' WHERE jeton & ' . PhraseaTokens::MAKE_SUBDEF . ' > 0';
|
||||||
WHERE jeton & ' . PhraseaTokens::MAKE_SUBDEF . ' > 0
|
if(count($sqlqmark) > 0) {
|
||||||
ORDER BY record_id DESC LIMIT 0, 30';
|
$sql .= ' AND type IN(' . implode(',', $sqlqmark) . ')';
|
||||||
|
}
|
||||||
|
$sql .= ' ORDER BY record_id DESC LIMIT 0, 30';
|
||||||
$stmt = $conn->prepare($sql);
|
$stmt = $conn->prepare($sql);
|
||||||
$stmt->execute();
|
$stmt->execute($sqlparms);
|
||||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
$stmt->closeCursor();
|
$stmt->closeCursor();
|
||||||
|
|
||||||
@@ -89,19 +110,19 @@ class SubdefsJob extends AbstractJob
|
|||||||
$this->log('warning', sprintf("Generate subdefs failed for : sbasid=%s / databox=%s / recordid=%s : %s", $databox->get_sbas_id(), $databox->get_dbname() , $row['record_id'], $e->getMessage()));
|
$this->log('warning', sprintf("Generate subdefs failed for : sbasid=%s / databox=%s / recordid=%s : %s", $databox->get_sbas_id(), $databox->get_dbname() , $row['record_id'], $e->getMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = 'UPDATE record
|
$sql = 'UPDATE record'
|
||||||
SET jeton=(jeton & ~' . PhraseaTokens::MAKE_SUBDEF . '), moddate=NOW()
|
. ' SET jeton=(jeton & ~' . PhraseaTokens::MAKE_SUBDEF . '), moddate=NOW()'
|
||||||
WHERE record_id=:record_id';
|
. ' WHERE record_id=:record_id';
|
||||||
|
|
||||||
$stmt = $conn->prepare($sql);
|
$stmt = $conn->prepare($sql);
|
||||||
$stmt->execute([':record_id' => $row['record_id']]);
|
$stmt->execute([':record_id' => $row['record_id']]);
|
||||||
$stmt->closeCursor();
|
$stmt->closeCursor();
|
||||||
|
|
||||||
// rewrite metadata
|
// rewrite metadata
|
||||||
$sql = 'UPDATE record
|
$sql = 'UPDATE record'
|
||||||
SET status=(status & ~0x03),
|
. ' SET status=(status & ~0x03),'
|
||||||
jeton=(jeton | ' . PhraseaTokens::WRITE_META_SUBDEF . ')
|
. ' jeton=(jeton | ' . PhraseaTokens::WRITE_META_SUBDEF . ')'
|
||||||
WHERE record_id=:record_id';
|
. ' WHERE record_id=:record_id';
|
||||||
$stmt = $conn->prepare($sql);
|
$stmt = $conn->prepare($sql);
|
||||||
$stmt->execute([':record_id' => $row['record_id']]);
|
$stmt->execute([':record_id' => $row['record_id']]);
|
||||||
$stmt->closeCursor();
|
$stmt->closeCursor();
|
||||||
@@ -117,4 +138,5 @@ class SubdefsJob extends AbstractJob
|
|||||||
|
|
||||||
$app['elasticsearch.indexer']->flushQueue();
|
$app['elasticsearch.indexer']->flushQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,11 @@
|
|||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label"> {{ 'Databox' | trans }}</label>
|
<label class="control-label"> {{ 'Databox' | trans }}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<select name="sbas">
|
{% for databox in app['phraseanet.appbox'].get_databoxes() %}
|
||||||
<option value="">{{ 'All' | trans }}</option>
|
<label class="checkbox inline">
|
||||||
{% for databox in app['phraseanet.appbox'].get_databoxes() %}
|
<input type="checkbox" name="sbas[]" value="{{ databox.get_sbas_id() }}"> {{ databox.get_viewname() }}
|
||||||
<option value="{{ databox.get_sbas_id() }}">
|
</label>
|
||||||
{{ databox.get_viewname() }}
|
{% endfor %}
|
||||||
({{ databox.get_sbas_id() }})
|
|
||||||
</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
@@ -87,29 +83,31 @@
|
|||||||
xml = $.parseXML(xml);
|
xml = $.parseXML(xml);
|
||||||
xml = $(xml);
|
xml = $(xml);
|
||||||
|
|
||||||
with(document.forms['graphicForm'])
|
var gform = document.forms['graphicForm'];
|
||||||
|
|
||||||
|
gform.embedded.checked = !!parseInt(xml.find("embedded").text());
|
||||||
|
gform.type_image.checked = !!parseInt(xml.find("type_image").text());
|
||||||
|
gform.type_video.checked = !!parseInt(xml.find("type_video").text());
|
||||||
|
gform.type_audio.checked = !!parseInt(xml.find("type_audio").text());
|
||||||
|
gform.type_document.checked = !!parseInt(xml.find("type_document").text());
|
||||||
|
gform.type_flash.checked = !!parseInt(xml.find("type_flash").text());
|
||||||
|
gform.type_unknown.checked = !!parseInt(xml.find("type_unknown").text());
|
||||||
|
gform.flush.value = minmax(parseInt(xml.find("flush").text()), 1, 100);
|
||||||
|
gform.maxrecs.value = minmax(parseInt(xml.find("maxrecs").text()), 10, 100);
|
||||||
|
gform.maxmegs.value = minmax(parseInt(xml.find("maxmegs").text()), 64, 512);
|
||||||
|
for(i=0; i < gform['sbas[]'].length; i++)
|
||||||
{
|
{
|
||||||
embedded.checked = !!parseInt(xml.find("embedded").text());
|
var sbid = gform['sbas[]'][i].value;
|
||||||
type_image.checked = !!parseInt(xml.find("type_image").text());
|
|
||||||
type_video.checked = !!parseInt(xml.find("type_video").text());
|
if(xml.find("sbas").filter(function(){return $(this).text()==sbid}).length > 0)
|
||||||
type_audio.checked = !!parseInt(xml.find("type_audio").text());
|
|
||||||
type_document.checked = !!parseInt(xml.find("type_document").text());
|
|
||||||
type_flash.checked = !!parseInt(xml.find("type_flash").text());
|
|
||||||
type_unknown.checked = !!parseInt(xml.find("type_unknown").text());
|
|
||||||
flush.value = minmax(parseInt(xml.find("flush").text()), 1, 100);
|
|
||||||
maxrecs.value = minmax(parseInt(xml.find("maxrecs").text()), 10, 100);
|
|
||||||
maxmegs.value = minmax(parseInt(xml.find("maxmegs").text()), 64, 512);
|
|
||||||
for(i in sbas.options)
|
|
||||||
{
|
{
|
||||||
if(sbas.options[i].value == parseInt(xml.find("sbas").text()) )
|
gform['sbas[]'][i].checked = true;
|
||||||
{
|
|
||||||
sbas.options[i].selected = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sbas.options[i].selected = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gform['sbas[]'][i].checked = false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,16 +55,6 @@
|
|||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
(function( $ ){
|
|
||||||
$.fn.serializeJSON=function() {
|
|
||||||
var json = {};
|
|
||||||
jQuery.map($(this).serializeArray(), function(n, i){
|
|
||||||
json[n['name']] = n['value'];
|
|
||||||
});
|
|
||||||
|
|
||||||
return json;
|
|
||||||
};
|
|
||||||
})( jQuery );
|
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
$("#taskTabs").tabs({
|
$("#taskTabs").tabs({
|
||||||
@@ -126,10 +116,10 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
function xmlFromForm(callback) {
|
function xmlFromForm(callback) {
|
||||||
var data = $("#graphicForm").serializeJSON();
|
var formData = $("#graphicForm").serializeArray();
|
||||||
data["xml"] = $("#txtareaxml").val();
|
formData.push({"name":"xml", "value":$("#txtareaxml").val()});
|
||||||
$.ajax({ url: "{{ path('admin_tasks_xml_from_form', {'task' : task.getId()}) }}"
|
$.ajax({ url: "{{ path('admin_tasks_xml_from_form', {'task' : task.getId()}) }}"
|
||||||
, data: data
|
, data: formData
|
||||||
, dataType:'text'
|
, dataType:'text'
|
||||||
, type:"POST"
|
, type:"POST"
|
||||||
, success:function(data) {
|
, success:function(data) {
|
||||||
|
|||||||
Reference in New Issue
Block a user