def test_save(self):
     eval_id = Evaluation.create('Edit Test Name', self.card_id).id()
     category1_id = EvalCategory.create('Eval Save Test Cat 1', self.card_id).id()
     category2_id = EvalCategory.create('Eval Save Test Cat 2', self.card_id).id()
     item1_id = EvalItem.create('Eval Save Test Item 1', category1_id).id()
     item2_id = EvalItem.create('Eval Save Test Item 2', category1_id).id()
     item3_id = EvalItem.create('Eval Save Test Item 3', category2_id).id()
     text_line1_id = TextLine.create('Eval Save Test Text Line 1', self.card_id).id()
     text_line2_id = TextLine.create('Eval Save Test Text Line 2', self.card_id).id()
     
     response = self.testapp.post('/eval/%d/save' % eval_id, 
         {'comments': 'Comments', 
          'item_%d_score' % item1_id: '1', 
          'item_%d_score' % item2_id: '2', 
          'item_%d_score' % item3_id: '3',
          'text_%d_value' % text_line1_id: 'Text 1',
          'text_%d_value' % text_line2_id: 'Text 2',
         }
     )
     self.assertRedirect('/eval/\d*/fill$', response)
     eval = Evaluation.find_by_id(eval_id)
     data = eval.all_data()
     self.assertEqual('Comments', data['comments'])
     self.assertEqual('1', data['items'][item1_id])
     self.assertEqual('2', data['items'][item2_id])
     self.assertEqual('3', data['items'][item3_id])
     self.assertEqual('Text 1', data['text'][text_line1_id])
     self.assertEqual('Text 2', data['text'][text_line2_id])
 def create_or_update(self, evaluation_id, value):
     evaluation = Evaluation.find_by_id(evaluation_id)
     
     data = CommentData.gql('WHERE evaluation = :1', evaluation).fetch(1)
     if len(data) == 0:
         data = CommentData(parent=self.report_key())
         data.evaluation = evaluation
     else:
         data = data[0]
     
     data.value = value
     return data.put()
         
 def create_or_update(self, text_line_id, evaluation_id, value):
     line = TextLine.find_by_id(text_line_id)
     evaluation = Evaluation.find_by_id(evaluation_id)
     
     data = TextLineData.gql('WHERE text_line = :1 AND evaluation = :2', line, evaluation).fetch(1)
     if len(data) == 0:
         data = TextLineData(parent=self.report_key())
         data.text_line = line
         data.evaluation = evaluation
     else:
         data = data[0]
     
     data.value = value
     return data.put()
         
 def create_or_update(self, eval_item_id, evaluation_id, value):
     item = EvalItem.find_by_id(eval_item_id)
     evaluation = Evaluation.find_by_id(evaluation_id)
     
     data = EvalItemData.gql('WHERE eval_item = :1 AND evaluation = :2', item, evaluation).fetch(1)
     if len(data) == 0:
         data = EvalItemData(parent=self.report_key())
         data.eval_item = item
         data.evaluation = evaluation
     else:
         data = data[0]
     
     data.value = value
     return data.put()
         
 def save(self, eval_id):
     eval = Evaluation.find_by_id(int(eval_id))
     if eval.card.is_authorized():
         for cat in eval.card.categories():
             for item in cat.items():
                 val = self.request.get('item_%s_score' % item.key().id())
                 if val is not None:
                     EvalItemData.create_or_update(item.key().id(), int(eval_id), val)
         for line in eval.card.text_lines():
             val = self.request.get('text_%s_value' % line.key().id())
             if val is not None:
                 TextLineData.create_or_update(line.key().id(), int(eval_id), val)
         val = self.request.get('comments')
         if val is not None:
             CommentData.create_or_update(int(eval_id), val)
         return webapp2.redirect_to('eval-fill', eval_id=int(eval_id))
 def preview(self, eval_id):
     eval = Evaluation.find_by_id(int(eval_id))
     if eval.card.is_authorized():
         template = JinjaEnv.get().get_template('templates/eval/preview.html')
         self.response.out.write(template.render({'eval': eval, 'data': eval.all_data()}))