|
|
attempts_to_compute = self.filtered(
lambda user_input: user_input.state == 'done' and not user_input.test_entry and user_input.survey_id.is_attempts_limited
)
for user_input in (self - attempts_to_compute):
user_input.attempts_count = 1
user_input.attempts_number = 1
if attempts_to_compute:
self.flush_model(['email', 'invite_token', 'partner_id', 'state', 'survey_id', 'test_entry'])
self.env.cr.execute("""
SELECT user_input.id,
COUNT(all_attempts_user_input.id) AS attempts_count,
COUNT(CASE WHEN all_attempts_user_input.id < user_input.id THEN all_attempts_user_input.id END) + 1 AS attempts_number
FROM survey_user_input user_input
LEFT OUTER JOIN survey_user_input all_attempts_user_input
ON user_input.survey_id = all_attempts_user_input.survey_id
AND all_attempts_user_input.state = 'done'
AND all_attempts_user_input.test_entry IS NOT TRUE
AND (user_input.invite_token IS NULL OR user_input.invite_token = all_attempts_user_input.invite_token)
AND (user_input.partner_id = all_attempts_user_input.partner_id OR user_input.email = all_attempts_user_input.email)
WHERE user_input.id IN %s
GROUP BY user_input.id;
""", (tuple(attempts_to_compute.ids),))
attempts_number_results = self.env.cr.dictfetchall()
attempts_number_results = {
attempts_number_result['id']: {
'attempts_number': attempts_number_result['attempts_number'],
'attempts_count': attempts_number_result['attempts_count'],
}
for attempts_number_result in attempts_number_results
}
for user_input in attempts_to_compute:
attempts_number_result = attempts_number_results.get(user_input.id, {})
user_input.attempts_number = attempts_number_result.get('attempts_number', 1)
user_input.attempts_count = attempts_number_result.get('attempts_count', 1)
|
|