Hello,

I am writing a poll application, which has two XML files:

1) survey.xml

<?xml version="1.0" encoding="UTF-8"?>
<survey>
<question code="a1" type="MCQ">
<title>Is an augumented assignment such as 'x = x + 1' the same as x += 1?</title>
  <option>Yes</option>
  <option>No</option>
  <option>Don't know</option>
</question>
<question code="a2" type="MAQ">
  <title>The statement 'x *= y + 1' is equivalent to:</title>
  <option>'x = (x * y) + 1'</option>
  <option>'x = x * (y + 1)</option>
  <option>'x = (y + 1) * x'</option>
  <option>All of the above</option>
</question>
</survey>

2) respons.xml

<?xml version="1.0" encoding="UTF-8"?>
<response>
<attempt username="1" date="2008-07-28 14:40">
  <question code="a1">
    <answer>1</answer>
  </question>
  <question code="a2">
    <answer>2</answer>
    <answer>3</answer>
  </question>
</attempt>
<attempt username="5" date="2008-07-28 15:00">
  <question code="a1">
    <answer>1</answer>
  </question>
  <question code="a2">
    <answer>1</answer>
    <answer>2</answer>
  </question>
</attempt>
<attempt username="3" date="2008-07-28 14:47">
  <question code="a1">
    <answer>3</answer>
  </question>
  <question code="a2">
    <answer>4</answer>
  </question>
</attempt>
</response>

Here is the code I have so far, poll.py:

####

from folder import Folder
from handlers import Text
...

class Survey(Text):
    """
    Here we create the actual survey.xml file
    """

    def new(self):
        self.questions = {}

    def _load_state_from_file(self, file):
        ....

    def to_str(self, encoding='UTF-8'):
        lines = ['<?xml version="1.0" encoding="%s"?>\n' % encoding,
                 '<survey>\n']
        # Business functions
        # Questions
        questions = self.questions
        codes = questions.keys()
        codes.sort()
        for code in codes:
            lines.append(questions[code].to_str(encoding))
        lines.append('</survey>')
        return ''.join(lines)


class Response(Text):
    """
    Here we create the actual response.xml file
    """

    def new(self):
        self.attempts = {}

    def _load_state_from_file(self, file):
        # TEST 015
        attempts = {}

    def to_str(self, encoding='UTF-8'):
        lines = ['<?xml version="1.0" encoding="%s"?>' % encoding,
                 '<response>']
        attempts = self.attempts
        for username in attempts:
            for attempt in attempts[username]:
                lines.append(
                    '<attempt username="%s" date="%s" mark="%2.2f">'
% (username, attempt.date.strftime('%Y-%m-%d %H:%M'), attempt.mark))
                questions = attempt.questions
                for question_code in questions:
                    lines.append('  <question code="%s">' % question_code)
                    for answer in questions[question_code]:
                        lines.append('    <answer>%s</answer>' % answer)
                    lines.append('  </question>')
                lines.append('</attempt>')
        lines.append('</response>')
        return '\n'.join(lines)

    def get_analysis(self):
        attempts = self.attempts
        for username in attempts:
            user = []
            question = []
            for attempt in attempts[username]:
                user.append(username)
                questions = attempt.questions
                answers = []
                for question_code in questions:
                    for answer in questions[question_code]:
                        answers.append(answer)
                        question.append(question_code)

            # [SEE NOTE 1]
            print user, question, answers


class Attempt(object):

    def __init__(self, username=None, date=None):
        self.username = username
        self.date = date
        self.questions = {}


class Poll(Folder):

    def new(self):
        Folder.new(self)
        self.cache['.survey'] = Survey()
        self.cache['.response'] = Response()

    def get_definition(self):
        return self.get_handler('.survey')
    definition = property(get_definition, None, None, '')

    def get_results(self):
        return self.get_handler('.response')
    results = property(get_results, None, None, '')

    def fill_form(self, context):
        user = context.user
        ...

    def analyse(self, context):
        user, root = context.user, context.root
        questions = self.definition.questions

        results = [{'question': x,
                    'title': y.title,
                    'options': [y.options]}
                         for x, y in questions.items()]
        # [SEE NOTE 2]
        print results


####

[NOTE 1] In the Response class I have a function 'get_analysis':

    def get_analysis(self):
            attempts = self.attempts
            ....

This returns:
['1'] ['1', '2', '2', '2'] [1, 1, 2, 4]
['0'] ['1', '2', '2'] [2, 2, 3]


[NOTE 2] In the Poll class, I have a function 'analyse':

   def analyse(self, context):
        user, root = context.user, context.root
        questions = self.definition.questions
        ...
This returns:

[{'question': 'a1', 'options': [[u'Yes', u'No', u"Don't know"]], 'title': u"Is an augumented assignment such as 'x = x + 1' the same as x += 1?"}, {'question': 'a2', 'options': [[u"'x = (x * y) + 1'", u"'x = x * (y + 1)", u"'x = (y + 1) * x'", u'All of the above']], 'title': u"The statement 'x *= y + 1' is equivalent to:"}]


This is where I get stuck and can't see the solution so that I can link both
.xml files and be able to return the totals for each answered question.

I would like to count the totals for each answer, so that:

options | yes | no | don't know | 'x = (x * y) + 1' | 'x = x * (y + 1)' |etc... user 0 | 0 | 1 | 0 | 0 | 1 |etc... user 1 | 1 | 0 | 0 | 1 | 1 |etc... ---------------------------------------------------------- ------------------- total | 1 | 1 | 0 | 1 | 2 |etc... ---------------------------------------------------------- -------------------

Ultimately, I would like to display the results as:

a1. Is an augumented assignment....
    [yes]         [1] [50%] *****
    [no]          [1] [50%] *****
    [don't know]  [0] [0%]

a2. The statement 'x *=....
    ['x = (x * y) + 1']         [1] [33%] ***
    ['x = x * (y + 1)']         [2] [77%] *******
   ....

Perhaps I would need a dictionary containing a list with totals for each, such as:

{'question': 'a1',
  'options': [{'option':  u'Yes',  'total': 1,
                'option':  u'No',  'total': 1,
                'option': u"Don't know", 'total: 0}],
  'title': u"Is an augumented assignment ...",
  'question': 'a2',
  'options': [{'option':  u'x = (x * y) + 1',  'total': 1,
                'option':  u'x = x * (y + 1)',  'total': 2,
                'option': u"...", 'total: 0}],
  'title': u"The statement..."}

But how do I calculate the total value for each option?

Any advise or suggestions and guidance in improving this much appreciated.

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to