Survey
* SurveyProcessListener angefangen * SurveyAnswerCollection erzeugt * SurveyResponseCollection erzeugt Diverse Anpassungen in survey.pdl git-svn-id: https://svn.libreccm.org/ccm/trunk@357 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
3d0cf2aee4
commit
b7f5b05a1e
|
|
@ -10,22 +10,22 @@ object type Survey extends ContentPage {
|
|||
Boolean[0..1] responsesPublic = ct_surveys.responses_public;
|
||||
component FormSection[1..1] form = join ct_surveys.form_id
|
||||
to bebop_form_sections.form_section_id;
|
||||
component SurveyResponse[0..n] responses = join ct_surveys.survey_id
|
||||
to ct_surveys_responses.survey_id;
|
||||
reference key ( ct_surveys.survey_id );
|
||||
}
|
||||
|
||||
object type SurveyResponse extends ContentItem {
|
||||
|
||||
Date[1..1] entryDate = ct_surveys_responses.entry_date DATE;
|
||||
Survey[1..1] survey = join ct_surveys_responses.survey_id
|
||||
to ct_surveys.survey_id;
|
||||
User[1..1] user = join ct_surveys_responses.user_id
|
||||
User[0..1] user = join ct_surveys_responses.user_id
|
||||
to users.user_id;
|
||||
component SurveyAnswer[1..n] answers = join ct_surveys_responses.response_id
|
||||
to ct_surveys_answers.response_id;
|
||||
|
||||
// XXX hack to allow us to filter a data query
|
||||
BigDecimal[1..1] surveyID = ct_surveys_responses.survey_id INTEGER;
|
||||
BigDecimal[1..1] userID = ct_surveys_responses.user_id INTEGER;
|
||||
// BigDecimal[1..1] surveyID = ct_surveys_responses.survey_id INTEGER;
|
||||
// BigDecimal[1..1] userID = ct_surveys_responses.user_id INTEGER;
|
||||
|
||||
reference key (ct_surveys_responses.response_id);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,11 +10,12 @@ import com.arsdigita.domain.DataObjectNotFoundException;
|
|||
|
||||
import com.arsdigita.formbuilder.PersistentForm;
|
||||
|
||||
import com.arsdigita.kernel.User;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* A survey content type that represents a survey. This is
|
||||
* based on the simplesurvey application.
|
||||
* A survey content type that represents a survey. This is partially based on
|
||||
* the simplesurvey application and CT FormItem.
|
||||
*
|
||||
* @author Sören Bernstein
|
||||
*
|
||||
|
|
@ -23,6 +24,8 @@ public class Survey extends ContentPage {
|
|||
|
||||
/** PDL property name for formSection */
|
||||
public static final String FORM = "form";
|
||||
/** PDL property name for surveyResponses */
|
||||
public static final String RESPONSES = "responses";
|
||||
/** PDL property name for startDate */
|
||||
public static final String START_DATE = "startDate";
|
||||
/** PDL property name for endDate */
|
||||
|
|
@ -43,7 +46,6 @@ public class Survey extends ContentPage {
|
|||
return s_config;
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Default constructor. This creates a new (empty) Survey.
|
||||
**/
|
||||
|
|
@ -98,17 +100,6 @@ public class Survey extends ContentPage {
|
|||
super(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* For new content items, sets the associated content type if it
|
||||
* has not been already set.
|
||||
*/
|
||||
/* @Override
|
||||
public void beforeSave() {
|
||||
super.beforeSave();
|
||||
|
||||
Assert.exists(getContentType(), ContentType.class);
|
||||
}
|
||||
*/
|
||||
/**
|
||||
* This will handle the mandatory FormSection. If there is no
|
||||
* FormSection set it will create an empty new form and assign it
|
||||
|
|
@ -123,7 +114,9 @@ public class Survey extends ContentPage {
|
|||
form.setAdminName(getName());
|
||||
setAssociation(FORM, form);
|
||||
}
|
||||
|
||||
/*
|
||||
// Preset the responsesPublic
|
||||
if (getResponsesPublic() == null) {
|
||||
setResponsesPublic(false);
|
||||
}
|
||||
|
|
@ -166,39 +159,31 @@ public class Survey extends ContentPage {
|
|||
set(RESPONSES_PUBLIC, responsesPublic);
|
||||
}
|
||||
|
||||
/* Class methods *********************************************************/
|
||||
public static Survey retrieve(BigDecimal id)
|
||||
throws DataObjectNotFoundException {
|
||||
|
||||
Survey survey = new Survey(id);
|
||||
|
||||
return survey;
|
||||
public SurveyResponse addResponse() {
|
||||
SurveyResponse surveyResponse = new SurveyResponse();
|
||||
addResponse(surveyResponse);
|
||||
return surveyResponse;
|
||||
}
|
||||
|
||||
public static Survey retrieve(DataObject obj) {
|
||||
Survey survey = new Survey(obj);
|
||||
|
||||
return survey;
|
||||
protected void addResponse(SurveyResponse surveyResponse) {
|
||||
add(RESPONSES, surveyResponse);
|
||||
}
|
||||
/*
|
||||
|
||||
public SurveyResponseCollection getResponses() {
|
||||
return SurveyResponse.retrieveBySurvey(this);
|
||||
return new SurveyResponseCollection ((DataCollection) get(RESPONSES));
|
||||
}
|
||||
|
||||
public SurveyResponseCollection getUserResponses(User user) {
|
||||
return SurveyResponse.retrieveBySurvey(this, user);
|
||||
public SurveyResponseCollection getResponses(User user) {
|
||||
return new SurveyResponseCollection ((DataCollection) get(RESPONSES), user);
|
||||
}
|
||||
|
||||
public boolean hasUserResponded(User user) {
|
||||
SurveyResponseCollection responses = getUserResponses(user);
|
||||
public boolean hasResponses() {
|
||||
return !this.getResponses().isEmpty();
|
||||
}
|
||||
|
||||
if (responses.next()) {
|
||||
responses.close();
|
||||
return true;
|
||||
public boolean hasResponses(User user) {
|
||||
return !this.getResponses(user).isEmpty();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public DataQuery getLabelDataQuery() {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,41 @@
|
|||
|
||||
package com.arsdigita.cms.contenttypes;
|
||||
|
||||
import com.arsdigita.domain.DomainCollection;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Sören Bernstein
|
||||
*/
|
||||
public class SurveyAnswerCollection extends DomainCollection {
|
||||
|
||||
/**
|
||||
* Creates a new instance of SurveyAnswerCollection
|
||||
*/
|
||||
public SurveyAnswerCollection(DataCollection dataCollection) {
|
||||
super(dataCollection);
|
||||
|
||||
// m_dataCollection.addOrder(ORDER);
|
||||
}
|
||||
|
||||
// Get the label
|
||||
public String getLabel() {
|
||||
return (String) m_dataCollection.get(SurveyAnswer.LABEL);
|
||||
}
|
||||
|
||||
// Get the widget
|
||||
public String getWidget() {
|
||||
return (String) m_dataCollection.get(SurveyAnswer.WIDGET);
|
||||
}
|
||||
|
||||
// Get the value
|
||||
public String getValue() {
|
||||
return (String) m_dataCollection.get(SurveyAnswer.VALUE);
|
||||
}
|
||||
|
||||
public SurveyAnswer getSurveyAnswer() {
|
||||
return new SurveyAnswer(m_dataCollection.getDataObject());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ import com.arsdigita.domain.DataObjectNotFoundException;
|
|||
import com.arsdigita.formbuilder.PersistentLabel;
|
||||
import com.arsdigita.formbuilder.PersistentWidget;
|
||||
import com.arsdigita.kernel.User;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
import java.math.BigDecimal;
|
||||
|
|
@ -33,17 +34,28 @@ public class SurveyResponse extends ContentItem {
|
|||
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.SurveyResponse";
|
||||
|
||||
/**
|
||||
* Default constructor. This creates a new (empty) Survey.
|
||||
* Default constructor. This creates a new SurveyResponse. There can't be a
|
||||
* SurveyResponse without a proper Survey object
|
||||
*
|
||||
* @param survey The <code>survey</code> for this SurveyResponse.
|
||||
**/
|
||||
public SurveyResponse() {
|
||||
this(BASE_DATA_OBJECT_TYPE);
|
||||
|
||||
// Save the date
|
||||
setEntryDate();
|
||||
|
||||
// Save the corresponding survey
|
||||
// setSurvey(survey);
|
||||
|
||||
// XXX hack - see pdl file
|
||||
// set(USER + "ID", user.getID());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor. The contained <code>DataObject</code> is retrieved
|
||||
* from the persistent storage mechanism with an <code>OID</code>
|
||||
* specified by <i>id</i> and
|
||||
* <code>Address.BASE_DATA_OBJECT_TYPE</code>.
|
||||
* specified by <i>id</i>.
|
||||
*
|
||||
* @param id The <code>id</code> for the retrieved
|
||||
* <code>DataObject</code>.
|
||||
|
|
@ -87,35 +99,37 @@ public class SurveyResponse extends ContentItem {
|
|||
}
|
||||
|
||||
/* accessors *****************************************************/
|
||||
public void addAnswer(PersistentLabel label, PersistentWidget widget, String value) {
|
||||
|
||||
SurveyAnswer answer = SurveyAnswer.create(label, widget, value);
|
||||
add(ANSWERS, answer);
|
||||
private void setEntryDate() {
|
||||
set(ENTRY_DATE, new Date());
|
||||
}
|
||||
|
||||
public Date getEntryDate() {
|
||||
return (Date) get(ENTRY_DATE);
|
||||
}
|
||||
|
||||
/* Class methods **********************************************************/
|
||||
public static SurveyResponse create(Survey survey, User user) {
|
||||
SurveyResponse response = new SurveyResponse();
|
||||
response.setup(survey, user);
|
||||
return response;
|
||||
}
|
||||
|
||||
protected void setup(Survey survey, User user) {
|
||||
set(ENTRY_DATE, new Date());
|
||||
|
||||
// XXX hack - see pdl file
|
||||
set(USER + "ID", user.getID());
|
||||
private void setSurvey(Survey survey) {
|
||||
// set(SURVEY, survey);
|
||||
set(SURVEY + "ID", survey.getID());
|
||||
}
|
||||
|
||||
public static SurveyResponse retrieve(DataObject obj) {
|
||||
return new SurveyResponse(obj);
|
||||
public Survey getSurvey() {
|
||||
return (Survey) get(SURVEY);
|
||||
}
|
||||
|
||||
public void addAnswer(PersistentLabel label, PersistentWidget widget, String value) {
|
||||
SurveyAnswer answer = SurveyAnswer.create(label, widget, value);
|
||||
add(ANSWERS, answer);
|
||||
}
|
||||
|
||||
public SurveyAnswerCollection getAnswers() {
|
||||
return new SurveyAnswerCollection ((DataCollection) get(ANSWERS));
|
||||
}
|
||||
|
||||
public boolean hasAnswers() {
|
||||
return !this.getAnswers().isEmpty();
|
||||
}
|
||||
|
||||
/* Class methods **********************************************************/
|
||||
/*
|
||||
public static SurveyResponseCollection retrieveBySurvey(Survey survey) {
|
||||
DataCollection responses =
|
||||
|
|
|
|||
|
|
@ -0,0 +1,44 @@
|
|||
|
||||
package com.arsdigita.cms.contenttypes;
|
||||
|
||||
import com.arsdigita.domain.DomainCollection;
|
||||
import com.arsdigita.kernel.User;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Sören Bernstein
|
||||
*/
|
||||
public class SurveyResponseCollection extends DomainCollection {
|
||||
|
||||
/**
|
||||
* Creates a new instance of SurveyResponseCollection
|
||||
*/
|
||||
public SurveyResponseCollection(DataCollection dataCollection) {
|
||||
super(dataCollection);
|
||||
|
||||
m_dataCollection.addOrder(SurveyResponse.ENTRY_DATE);
|
||||
}
|
||||
|
||||
public SurveyResponseCollection(DataCollection dataCollection, User user) {
|
||||
this(dataCollection);
|
||||
|
||||
// m_dataCollection.addFilter(SurveyResponse.USER);
|
||||
}
|
||||
|
||||
// Get the entry date
|
||||
public Date getEntryDate() {
|
||||
return (Date) m_dataCollection.get(SurveyResponse.ENTRY_DATE);
|
||||
}
|
||||
|
||||
// Get the user
|
||||
public User getUser() {
|
||||
return (User) m_dataCollection.get(SurveyResponse.USER);
|
||||
}
|
||||
|
||||
public SurveyResponse getSurveyResponse() {
|
||||
return new SurveyResponse(m_dataCollection.getDataObject());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,21 +1,3 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.contenttypes.ui;
|
||||
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
|
|
@ -46,6 +28,7 @@ import java.util.Iterator;
|
|||
|
||||
import com.arsdigita.formbuilder.util.FormBuilderUtil;
|
||||
|
||||
import com.arsdigita.kernel.Kernel;
|
||||
import com.arsdigita.kernel.User;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
|
@ -53,18 +36,18 @@ import java.math.BigDecimal;
|
|||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* The process lister that processes a survey response entered by a user.
|
||||
* A process listener to save the responses from a user to the database.
|
||||
*
|
||||
* @author Sören Bernstein
|
||||
*/
|
||||
public class SurveyProcessListener
|
||||
implements FormProcessListener {
|
||||
public class SurveyProcessListener implements FormProcessListener {
|
||||
|
||||
public static final String SURVEY_ID_NAME = "__ss_survey_id__";
|
||||
public static final String RESPONSE_ID = "__ss_response_id__";
|
||||
public static final BigDecimal THE_PUBLIC_USER = new BigDecimal(-200);
|
||||
private static final String KNOWLEDGE_TEST = "knowledge_test";
|
||||
protected RequestLocal m_persistentForm = new RequestLocal();
|
||||
private RequestLocal m_nameQuestionMap = new RequestLocal();
|
||||
public static final String SURVEY_ID = "SurveyID";
|
||||
// public static final String RESPONSE_ID = "__ss_response_id__";
|
||||
// public static final BigDecimal THE_PUBLIC_USER = new BigDecimal(-200);
|
||||
// private static final String KNOWLEDGE_TEST = "knowledge_test";
|
||||
// protected RequestLocal m_persistentForm = new RequestLocal();
|
||||
// private RequestLocal m_nameQuestionMap = new RequestLocal();
|
||||
private RequestLocal m_response;
|
||||
private static org.apache.log4j.Logger s_log =
|
||||
Logger.getLogger(SurveyProcessListener.class.getName());
|
||||
|
|
@ -79,81 +62,70 @@ public class SurveyProcessListener
|
|||
|
||||
public void process(FormSectionEvent event) {
|
||||
|
||||
Survey survey = null;
|
||||
SurveyResponse surveyResponse = null;
|
||||
|
||||
// Get the form data
|
||||
FormData formData = event.getFormData();
|
||||
PageState ps = event.getPageState();
|
||||
|
||||
BigDecimal surveyID = (BigDecimal) formData.get(SURVEY_ID_NAME);
|
||||
BigDecimal responseID = (BigDecimal) formData.get(RESPONSE_ID);
|
||||
m_response.set(ps, responseID);
|
||||
// Read the needed information to create a new response and create
|
||||
// a new instance of SurveyResponse to store this information
|
||||
BigDecimal surveyID = (BigDecimal) formData.get(formData.getParameter(SURVEY_ID));
|
||||
|
||||
Survey survey = (Survey) FormBuilderUtil.instantiateObjectOneArg(Survey.class.getName(), surveyID);
|
||||
SurveyResponse response = null;
|
||||
try {
|
||||
response = (SurveyResponse) DomainObjectFactory.newInstance(new OID(SurveyResponse.class.getName(), responseID));
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
// s_log.warn("Can't create this object" + responseID);
|
||||
}
|
||||
|
||||
//Let's not save the data twice in the case of a double-click
|
||||
if (response.questionsAnswered()) {
|
||||
// Try to get the corresponding Survey object
|
||||
survey = new Survey(surveyID);
|
||||
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
|
||||
// Strange, there is no survey with this id. Someone is messing aroound
|
||||
s_log.warn("Can't find survey object with ID " + surveyID + ". Someone is messing around.");
|
||||
|
||||
// Abort processing
|
||||
return;
|
||||
}
|
||||
|
||||
m_persistentForm.set(ps, survey.getForm());
|
||||
// Get the user
|
||||
User user = (User) Kernel.getContext().getParty();
|
||||
|
||||
// Get the responding user
|
||||
User user = KernelHelper.getCurrentUser(ps.getRequest());
|
||||
// Create the new SurveyResponse object
|
||||
surveyResponse = survey.addResponse();
|
||||
|
||||
|
||||
|
||||
// Process the answers by iteration over the form widget parameters
|
||||
Iterator parameterIterator = formData.getParameters().iterator();
|
||||
while (parameterIterator.hasNext()) {
|
||||
|
||||
ParameterData parameterData = (ParameterData) parameterIterator.next();
|
||||
addAnswer(surveyResponse, parameterData.getName(), parameterData.getValue());
|
||||
|
||||
// Use the generic user "The Public" if the user is not registered
|
||||
if (user == null) {
|
||||
try {
|
||||
user = User.retrieve(THE_PUBLIC_USER);
|
||||
} catch (DataObjectNotFoundException e) {
|
||||
s_log.error("Public User does not exist.");
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate over the widget parameters and insert the answers to the survey response
|
||||
Iterator parameterIter = formData.getParameters().iterator();
|
||||
while (parameterIter.hasNext()) {
|
||||
s_log.warn("Found some formData");
|
||||
ParameterData parameterData = (ParameterData) parameterIter.next();
|
||||
|
||||
String parameterName = (String) parameterData.getName();
|
||||
|
||||
Object parameterValue = parameterData.getValue();
|
||||
if (parameterValue instanceof java.lang.String[]) {
|
||||
// This is a multi-answer question - iterate over the
|
||||
// answer values and add them one by one
|
||||
String[] valueArray = (String[]) parameterValue;
|
||||
for (int i = 0; i < valueArray.length; ++i) {
|
||||
// addAnswer(response, ps, valueArray[i], parameterName);
|
||||
private void addAnswer(SurveyResponse surveyResponse, Object name, Object value) {
|
||||
|
||||
// Test if value is a string array
|
||||
if(value instanceof String[]) {
|
||||
// This is a multi-answer question, so iterate over the answers
|
||||
for (int i = 0; i < ((String[]) value).length; i++) {
|
||||
addAnswer(surveyResponse, name, ((String[]) value)[i]);
|
||||
}
|
||||
} else {
|
||||
// Single answer question
|
||||
|
||||
// addAnswer(response, ps, parameterValue, parameterName);
|
||||
// Create new SurveyAnswer object
|
||||
// surveyResponse.addAnswer(,, (String) value);
|
||||
}
|
||||
}
|
||||
// Save the survey response to the database
|
||||
response.save();
|
||||
// saveScore(survey, response);
|
||||
}
|
||||
|
||||
/*
|
||||
private void saveScore(Survey survey, SurveyResponse response) {
|
||||
PageState ps = event.getPageState();
|
||||
|
||||
BigDecimal responseID = (BigDecimal) formData.get(RESPONSE_ID);
|
||||
m_response.set(ps, responseID);
|
||||
|
||||
m_persistentForm.set(ps, survey.getForm());
|
||||
|
||||
String query;
|
||||
if (survey.getQuizType().equals(KNOWLEDGE_TEST)) {
|
||||
query = "com.arsdigita.simplesurvey.saveScore";
|
||||
} else {
|
||||
query = "com.arsdigita.simplesurvey.saveAssessmentScore";
|
||||
}
|
||||
DataOperation dao = SessionManager.getSession().retrieveDataOperation(query);
|
||||
dao.setParameter("responseID", response.getID());
|
||||
dao.execute();
|
||||
}
|
||||
*/
|
||||
/*
|
||||
private void addAnswer(SurveyResponse surveyResponse,
|
||||
|
|
@ -233,5 +205,4 @@ public class SurveyProcessListener
|
|||
return question;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue