Skip to content

Commit

Permalink
Fixed issue #6735: remove a response line doesn't remove timings
Browse files Browse the repository at this point in the history
Fixed issue : Download files in zip in browse response broken
Dev: Add a function in responses to delete files
Dev: correct the primaryKey for Survey_dynamics and add one for Survey_timings to use deleteByPk
DEV: todo create a new Survey_dynamic to do all the job (delete responses line, delete files, delete timing lines)
  • Loading branch information
Shnoulle committed Oct 19, 2012
1 parent ed8e49d commit f348926
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 73 deletions.
147 changes: 76 additions & 71 deletions application/controllers/admin/responses.php
Expand Up @@ -320,80 +320,32 @@ function browse($iSurveyID)
if (Yii::app()->request->getPost('deleteanswer') && Yii::app()->request->getPost('deleteanswer') != '' && Yii::app()->request->getPost('deleteanswer') != 'marked' && hasSurveyPermission($iSurveyID, 'responses', 'delete'))
{
$iResponseID = (int) Yii::app()->request->getPost('deleteanswer'); // sanitize the value
// delete the files as well if its a fuqt

$fieldmap = createFieldMap($iSurveyID,'full',false,false,$oBrowseLanguage->langcode);
$fuqtquestions = array();
// find all fuqt questions
foreach ($fieldmap as $field)
{
if ($field['type'] == "|" && strpos($field['fieldname'], "_filecount") == 0)
$fuqtquestions[] = $field['fieldname'];
}

if (!empty($fuqtquestions))
{
// find all responses (filenames) to the fuqt questions
$responses = Survey_dynamic::model($iSurveyID)->findAllByAttributes(array('id' => Yii::app()->request->getPost('deleteanswer')));

foreach ($responses as $json)
{
foreach ($fuqtquestions as $fieldname)
{
$phparray = json_decode_ls($json[$fieldname]);
foreach ($phparray as $metadata)
{
$path = Yii::app()->getConfig('uploaddir') . "/surveys/" . $iSurveyID . "/files/";
unlink($path . $metadata->filename); // delete the file
}
}
}
}

// delete the files
$this->_deleteFiles($iSurveyID,array($iResponseID),$aData['language']);
// delete the row
Survey_dynamic::model($iSurveyID)->deleteAllByAttributes(array('id' => $iResponseID));
Survey_dynamic::model($iSurveyID)->deleteByPk($iResponseID);
// delete timings if savetimings is set
if($aData['surveyinfo']['savetimings'] == "Y"){
Survey_timings::model($iSurveyID)->deleteByPk($iResponseID);
}
Yii::app()->session['flashmessage'] = sprintf($clang->gT("Response ID %s was successfully deleted."),$iResponseID);

}
// Marked responses -> deal with the whole batch of marked responses
if (Yii::app()->request->getPost('markedresponses') && count(Yii::app()->request->getPost('markedresponses')) > 0 && hasSurveyPermission($iSurveyID, 'responses', 'delete'))
if (Yii::app()->request->getPost('markedresponses') && count(Yii::app()->request->getPost('markedresponses')) > 0)
{
// Delete the marked responses - checked
if (Yii::app()->request->getPost('deleteanswer') && Yii::app()->request->getPost('deleteanswer') === 'marked')
if (Yii::app()->request->getPost('deleteanswer') && Yii::app()->request->getPost('deleteanswer') === 'marked' && hasSurveyPermission($iSurveyID, 'responses', 'delete'))
{
$fieldmap = createFieldMap($iSurveyID,'full',false,false,$oBrowseLanguage->langcode);
$fuqtquestions = array();
// find all fuqt questions
foreach ($fieldmap as $field)
{
if ($field['type'] == "|" && strpos($field['fieldname'], "_filecount") == 0)
$fuqtquestions[] = $field['fieldname'];
}

$this->_deleteFiles($iSurveyID,Yii::app()->request->getPost('markedresponses'),$aData['language']);
foreach (Yii::app()->request->getPost('markedresponses') as $iResponseID)
{
$iResponseID = (int) $iResponseID; // sanitize the value

if (!empty($fuqtquestions))
{
// find all responses (filenames) to the fuqt questions
$responses = Survey_dynamic::model($iSurveyID)->findAllByAttributes(array('id' => $iResponseID));

foreach ($responses as $json)
{
foreach ($fuqtquestions as $fieldname)
{
$phparray = json_decode_ls($json[$fieldname]);
foreach ($phparray as $metadata)
{
$path = $this->getController()->getConfig('uploaddir') . "/surveys/{$iSurveyID}/files/";
unlink($path . $metadata->filename); // delete the file
}
}
}
$iResponseID= (int) $iResponseID;
Survey_dynamic::model($iSurveyID)->deleteByPk($iResponseID);
// delete timings if savetimings is set
if($aData['surveyinfo']['savetimings'] == "Y"){
Survey_timings::model($iSurveyID)->deleteByPk($iResponseID);
}

Survey_dynamic::model($iSurveyID)->deleteAllByAttributes(array('id' => $iResponseID));
}
Yii::app()->session['flashmessage'] = sprintf($clang->ngT("%s response was successfully deleted.","%s responses were successfully deleted.",count(Yii::app()->request->getPost('markedresponses'))),count(Yii::app()->request->getPost('markedresponses')));

Expand All @@ -403,15 +355,15 @@ function browse($iSurveyID)
{
// Now, zip all the files in the filelist
$zipfilename = "Responses_for_survey_{$iSurveyID}.zip";
$this->_zipFiles($iSurveyID, Yii::app()->request->getPost('markedresponses'), $zipfilename);
$this->_zipFiles($iSurveyID, Yii::app()->request->getPost('markedresponses'), $zipfilename,$aData['language']);
}
}
// Download all files for this entry - checked
else if (Yii::app()->request->getPost('downloadfile') && Yii::app()->request->getPost('downloadfile') != '' && Yii::app()->request->getPost('downloadfile') !== true)
{
// Now, zip all the files in the filelist
$zipfilename = "Files_for_responses_" . Yii::app()->request->getPost('downloadfile') . ".zip";
$this->_zipFiles($iSurveyID, Yii::app()->request->getPost('downloadfile'), $zipfilename);
$this->_zipFiles($iSurveyID, Yii::app()->request->getPost('downloadfile'), $zipfilename,$aData['language']);
}
else if (Yii::app()->request->getPost('downloadindividualfile') != '')
{
Expand Down Expand Up @@ -624,16 +576,23 @@ public function time($iSurveyID)
if ($aData['surveyinfo']['savetimings'] != "Y")
die();

if (Yii::app()->request->getPost('deleteanswer') != '')
if (Yii::app()->request->getPost('deleteanswer') && Yii::app()->request->getPost('deleteanswer') != '' && Yii::app()->request->getPost('deleteanswer') != 'marked' && hasSurveyPermission($iSurveyID, 'responses', 'delete'))
{
Survey_dynamic::model($iSurveyID)->deleteByAttributes(array('id' => (int) Yii::app()->request->getPost('deleteanswer'))) or die("Could not delete response");
$iResponseID=(int) Yii::app()->request->getPost('deleteanswer');
Survey_dynamic::model($iSurveyID)->deleteByPk($iResponseID);
Survey_timings::model($iSurveyID)->deleteByPk($iResponseID);
}

if (Yii::app()->request->getPost('markedresponses') && count(Yii::app()->request->getPost('markedresponses')) > 0)
{
foreach (Yii::app()->request->getPost('markedresponses') as $iResponseID)
if (Yii::app()->request->getPost('deleteanswer') && Yii::app()->request->getPost('deleteanswer') === 'marked' && hasSurveyPermission($iSurveyID, 'responses', 'delete'))
{
Survey_dynamic::model($iSurveyID)->deleteByAttributes(array('id' => (int) $iResponseID)) or die("Could not delete response");
foreach (Yii::app()->request->getPost('markedresponses') as $iResponseID)
{
$iResponseID=(int) $iResponseID;
Survey_dynamic::model($iSurveyID)->deleteByPk($iResponseID);
Survey_timings::model($iSurveyID)->deleteByPk($iResponseID);
}
}
}

Expand Down Expand Up @@ -774,22 +733,68 @@ public function time($iSurveyID)
$this->_renderWrappedTemplate('',$aViewUrls, $aData);
}

/**
* Supply an array with the responseIds and all files of this responses was deleted
*
* @param array $responseIds
* @param string $language
*/
private function _deleteFiles($iSurveyID, $responseIds,$language)
{
$uploaddir = Yii::app()->getConfig('uploaddir') ."/surveys/{$iSurveyID}/files/";
$fieldmap = createFieldMap($iSurveyID, 'full' ,false, false, $language);
$fuqtquestions = array();
// find all fuqt questions
foreach ($fieldmap as $field)
{
if ($field['type'] == "|" && strpos($field['fieldname'], "_filecount") == 0)
$fuqtquestions[] = $field['fieldname'];
}

foreach ($responseIds as $responseId)
{
$responseId = (int) $responseId; // sanitize the value

if (!empty($fuqtquestions))
{
// find all responses (filenames) to the fuqt questions
$filearray = Survey_dynamic::model($iSurveyID)->findAllByAttributes(array('id' => $responseId));
$filecount = 0;
foreach ($filearray as $metadata)
{
foreach ($metadata as $aData)
{
$phparray = json_decode_ls($aData);
if (is_array($phparray))
{
foreach ($phparray as $file)
{
@unlink($uploaddir . $file['filename']);
}
}
}
}
}
}
}
/**
* Supply an array with the responseIds and all files will be added to the zip
* and it will be be spit out on success
*
* @param array $responseIds
* @param string $zipfilename
* @param string $language
* @return ZipArchive
*/
private function _zipFiles($iSurveyID, $responseIds, $zipfilename)
private function _zipFiles($iSurveyID, $responseIds, $zipfilename,$language)
{

Yii::app()->loadLibrary('admin/pclzip/pclzip');

$tmpdir = Yii::app()->getConfig('uploaddir') . DIRECTORY_SEPARATOR."surveys". DIRECTORY_SEPARATOR . $iSurveyID . DIRECTORY_SEPARATOR."files".DIRECTORY_SEPARATOR;

$filelist = array();
$fieldmap = createFieldMap($iSurveyID, 'full' ,false, false, Yii::app()->session['browselang']);
$fieldmap = createFieldMap($iSurveyID, 'full' ,false, false, $language);

foreach ($fieldmap as $field)
{
Expand Down
2 changes: 1 addition & 1 deletion application/models/Survey_dynamic.php
Expand Up @@ -73,7 +73,7 @@ public function tableName()
*/
public function primaryKey()
{
return 'sid';
return 'id';
}

/**
Expand Down
26 changes: 25 additions & 1 deletion application/models/Survey_timings.php
Expand Up @@ -47,6 +47,30 @@ public static function sid($sid)
self::$sid = (int) $sid;
}

/**
* Returns the primary key of this table
*
* @access public
* @return string
*/
public function primaryKey()
{
return 'id';
}

/**
* Defines the relations for this model
*
* @access public
* @return array
*/
public function relations()
{
return array(
'id' => array(self::BELONGS_TO, 'Survey_dynamic', 'id'),
);
}

/**
* Returns the setting's table name to be used by the model
*
Expand Down Expand Up @@ -87,7 +111,7 @@ public function statistics()
->queryAll();
$middleval = intval($statistics['count'] / 2);
$statistics['middleval'] = $middleval;
if ($statistics['count'] % 2)
if ($statistics['count'] % 2 && $statistics['count']>1)
{
$median=($queryAll[$middleval]['interviewtime'] + $queryAll[$middleval-1]['interviewtime']) / 2;
}
Expand Down

0 comments on commit f348926

Please sign in to comment.