Skip to content

Commit

Permalink
[fix] Import lsq break if lsq is from 2.5X version
Browse files Browse the repository at this point in the history
- Don't set invalid attributes in question for question import
- Don't set invalid attributes uin group and question for group import
- Show a warning message
  • Loading branch information
Shnoulle committed Dec 6, 2016
1 parent 52f7df5 commit 02ab3f4
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 32 deletions.
17 changes: 10 additions & 7 deletions application/controllers/admin/questions.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,21 @@ public function import()
// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY
Yii::app()->loadHelper('admin/import');

if (strtolower($sExtension) == 'lsq')
if (strtolower($sExtension) == 'lsq'){
$aImportResults = XMLImportQuestion($sFullFilepath, $surveyid, $gid);
else
$this->getController()->error(gT('Unknown file extension'));
}else{
App()->setFlashMessage(gT('Unknown file extension'),'error');
$this->getController()->redirect(array('admin/questions','sa'=>'addquestion','surveyid'=>$surveyid,'gid'=>$gid));
}

fixLanguageConsistency($surveyid);

if (isset($aImportResults['fatalerror']))
{
unlink($sFullFilepath);
$this->getController()->error($aImportResults['fatalerror']);
App()->setFlashMessage($aImportResults['fatalerror'],'error');
$this->getController()->redirect(array('admin/questions','sa'=>'addquestion','surveyid'=>$surveyid,'gid'=>$gid));
//$this->getController()->error($aImportResults['fatalerror']);
}

unlink($sFullFilepath);
Expand All @@ -87,7 +91,6 @@ public function import()
$aData['sExtension'] = $sExtension;
$aViewUrls[] = 'import_view';
}

$this->_renderWrappedTemplate('survey/Question', $aViewUrls, $aData);
}

Expand Down Expand Up @@ -1026,7 +1029,7 @@ public function ajaxchecklabel()
$iLabelID = (int) Yii::app()->request->getParam('lid');
$aNewLanguages = Yii::app()->request->getParam('languages');
$bCheckAssessments = Yii::app()->request->getParam('bCheckAssessments',0);
$arLabelSet=LabelSet::model()->find('lid=:lid',array(':lid' => $iLabelID));
$arLabelSet=LabelSet::model()->find('lid=:lid',array(':lid' => $iLabelID));
$iLabelsWithAssessmentValues=Label::model()->count('lid=:lid AND assessment_value<>0',array(':lid' => $iLabelID));
$aLabelSetLanguages=explode(' ',$arLabelSet->languages);
$aErrorMessages=array();
Expand All @@ -1053,7 +1056,7 @@ public function ajaxchecklabel()
}
}


/**
* Load preview of a question screen.
*
Expand Down
78 changes: 55 additions & 23 deletions application/helpers/admin/import_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,20 @@ function XMLImportGroup($sFullFilePath, $iNewSID)
}
if (isset($insertdata['gid'])) switchMSSQLIdentityInsert('groups',true);

$result = Yii::app()->db->createCommand()->insert('{{groups}}', $insertdata);

if (isset($insertdata['gid'])) switchMSSQLIdentityInsert('groups',false);
$group=New QuestionGroup;
foreach($insertdata as $k=>$v){
if(!in_array($k,$group->getTableSchema()->getColumnNames())){
$results['importwarnings'][]=sprintf(gT("%s : Unknow %s Attribute (not imported)."),$group['group_name'],$k);
}else{
$group->$k = $v;
}
}
if (!$group->save())
{
$results['fatalerror'] = CHtml::errorSummary($group,gT("The group could not be imported for the following reasons:"));
return $results;
}
$results['groups']++;

if (!isset($aGIDReplacements[$oldgid]))
{
$newgid=getLastInsertID('{{groups}}');
Expand Down Expand Up @@ -135,10 +144,19 @@ function XMLImportGroup($sFullFilePath, $iNewSID)
{
$insertdata['qid']=$aQIDReplacements[$oldqid];
}
if (isset($insertdata['qid'])) switchMSSQLIdentityInsert('questions',true);

$result = Yii::app()->db->createCommand()->insert('{{questions}}', $insertdata);
if (isset($insertdata['qid'])) switchMSSQLIdentityInsert('questions',false);
$ques= New Question;
foreach ($insertdata as $k => $v){
if(!in_array($k,$ques->getTableSchema()->getColumnNames())){
$results['importwarnings'][]=sprintf(gT("%s : Unknow %s Attribute (not imported)."),$insertdata['title'],$k);
}else{
$ques->$k = $v;
}
}
if (!$ques->save())
{
$results['fatalerror'] = CHtml::errorSummary($ques,gT("The question could not be imported for the following reasons:"));
return $results;
}
if (!isset($aQIDReplacements[$oldqid]))
{
$newqid=getLastInsertID('{{questions}}');
Expand Down Expand Up @@ -342,11 +360,9 @@ function XMLImportGroup($sFullFilePath, $iNewSID)
*/
function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
{
$sBaseLanguage=Survey::model()->findByPk($iNewSID)->language;
$aLanguagesSupported=Survey::model()->findByPk($iNewSID)->getAllLanguages();

$aLanguagesSupported = array(); // this array will keep all the languages supported for the survey
$sBaseLanguage = Survey::model()->findByPk($iNewSID)->language;
$aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages
$aLanguagesSupported=array_merge($aLanguagesSupported,Survey::model()->findByPk($iNewSID)->additionalLanguages);
$sXMLdata = file_get_contents($sFullFilePath);
$xml = simplexml_load_string($sXMLdata,'SimpleXMLElement',LIBXML_NONET);
if ($xml->LimeSurveyDocType!='Question') safeDie('This is not a valid LimeSurvey question structure XML file.');
Expand All @@ -358,7 +374,7 @@ function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
$results['answers']=0;
$results['question_attributes']=0;
$results['subquestions']=0;

$results['importwarnings']=array();
$importlanguages=array();
foreach ($xml->languages->language as $language)
{
Expand Down Expand Up @@ -421,12 +437,17 @@ function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
}

$ques = new Question;
if ($insertdata)
if ($insertdata){
XSSFilterArray($insertdata);
foreach ($insertdata as $k => $v)
$ques->$k = $v;
$result = $ques->save();
if (!$result)
}
foreach ($insertdata as $k => $v){
if(!in_array($k,$ques->getTableSchema()->getColumnNames())){
$results['importwarnings'][]=sprintf(gT("%s : Unknow %s Attribute (not imported)."),$insertdata['title'],$k);
}else{
$ques->$k = $v;
}
}
if (!$ques->save())
{
$results['fatalerror'] = CHtml::errorSummary($ques,gT("The question could not be imported for the following reasons:"));
return $results;
Expand Down Expand Up @@ -466,8 +487,13 @@ function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
if ($insertdata)
XSSFilterArray($insertdata);
$ques = new Question;
foreach ($insertdata as $k => $v)
$ques->$k = $v;
foreach ($insertdata as $k => $v){
if(!in_array($k,$ques->getTableSchema()->getColumnNames())){
$results['importwarnings'][]=sprintf(gT("Unknow %s Attribute (not imported)."),$k);
}else{
$ques->$k = $v;
}
}
$result = $ques->save();
if ($result)
{
Expand Down Expand Up @@ -499,8 +525,13 @@ function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
$answers = new Answer;
if ($insertdata)
XSSFilterArray($insertdata);
foreach ($insertdata as $k => $v)
$answers->$k = $v;
foreach ($insertdata as $k => $v){
if(!in_array($k,$answers->getTableSchema()->getColumnNames())){
$results['importwarnings'][]=sprintf(gT("Unknow %s Attribute (not imported)."),$k);
}else{
$answers->$k = $v;
}
}
$result = $answers->save();
$results['answers']++;
}
Expand Down Expand Up @@ -531,8 +562,9 @@ function XMLImportQuestion($sFullFilePath, $iNewSID, $newgid)
$attributes = new QuestionAttribute;
if ($insertdata)
XSSFilterArray($insertdata);
foreach ($insertdata as $k => $v)
foreach ($insertdata as $k => $v){
$attributes->$k = $v;
}
$result = $attributes->save();
}
}
Expand Down
4 changes: 4 additions & 0 deletions application/models/Question.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
class Question extends LSActiveRecord
{

/**
* Default values
*/

/**
* Returns the static model of Settings table
*
Expand Down
15 changes: 13 additions & 2 deletions application/views/admin/survey/Question/import_view.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<?php eT("File upload succeeded.") ?><br /><br />
<?php eT("Reading file..") ?><br /><br />
<div class='successheader'><?php eT("Success") ?></div><br />
<strong><u><?php eT("Question import summary") ?></u></strong><br />
<strong><?php eT("Question import summary") ?></strong><br />
<ul style="text-align:left;">
<li><?php echo gT("Questions") . ": " . $aImportResults['questions'] ?></li>
<li><?php echo gT("Subquestions") . ": " . $aImportResults['subquestions'] ?></li>
Expand All @@ -19,6 +19,17 @@
?>
<li><?php echo gT("Question attributes:") . $aImportResults['question_attributes'] ?></li>
</ul>
<?php if (!empty($aImportResults['importwarnings'])): ?>
<div class='warningheader'><?php eT("Warnings");?>:</div>
<ul class="list-unstyled">
<?php
foreach ($aImportResults['importwarnings'] as $warning)
{ ?>
<li><?php echo $warning; ?></li>
<?php
} ?>
</ul>
<?php endif; ?>
<strong><?php eT("Question import is complete.") ?></strong><br />
<input type='submit' value='<?php eT("Go to question") ?>' onclick="window.open('<?php echo $this->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $aImportResults['newqid']) ?>', '_top')" />
</div>
</div>
11 changes: 11 additions & 0 deletions application/views/admin/survey/QuestionGroups/import_view.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,17 @@
}?>
<li><?php echo gT("Question attributes:") . $aImportResults['question_attributes'] ?></li>
</ul><br/>
<?php if (!empty($aImportResults['importwarnings'])): ?>
<div class='warningheader'><?php eT("Warnings");?>:</div>
<ul class="list-unstyled">
<?php
foreach ($aImportResults['importwarnings'] as $warning)
{ ?>
<li><?php echo $warning; ?></li>
<?php
} ?>
</ul>
<?php endif; ?>
<p><strong><?php eT("Question group import is complete.") ?></strong></p><br />
<input type='submit' value="<?php eT("Go to question group") ?>" onclick="window.open('<?php echo $this->createUrl('admin/survey/sa/view/surveyid/'.$surveyid.'/gid/'.$aImportResults['newgid']) ?>', '_top')" />
</div><br />

0 comments on commit 02ab3f4

Please sign in to comment.