polls.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.contrib.auth import get_user_model
  2. from django.utils.crypto import get_random_string
  3. from misago.threads.models import Poll, PollVote, Thread
  4. from . import fetch_assoc, localise_datetime, movedids
  5. UserModel = get_user_model()
  6. def move_polls():
  7. for poll in fetch_assoc('SELECT * FROM misago_poll ORDER BY thread_id'):
  8. thread_pk = movedids.get('thread', poll['thread_id'])
  9. thread = Thread.objects.select_related().get(pk=thread_pk)
  10. poster = None
  11. if poll['user_id']:
  12. poster_pk = movedids.get('user', poll['user_id'])
  13. poster = UserModel.objects.get(pk=poster_pk)
  14. choices = []
  15. choices_map = {}
  16. query = 'SELECT * FROM misago_polloption WHERE poll_id = %s ORDER BY id'
  17. for choice in fetch_assoc(query, [poll['thread_id']]):
  18. choices.append({
  19. 'hash': get_random_string(12),
  20. 'label': choice['name'],
  21. 'votes': choice['votes'],
  22. })
  23. choices_map[choice['id']] = choices[-1]['hash']
  24. new_poll = Poll.objects.create(
  25. category=thread.category,
  26. thread=thread,
  27. poster=poster,
  28. poster_name=poll['user_name'],
  29. poster_slug=poll['user_slug'],
  30. poster_ip=thread.post_set.order_by('id').first().poster_ip,
  31. posted_on=localise_datetime(poll['start_date']),
  32. length=poll['length'],
  33. question=poll['question'],
  34. choices=choices,
  35. allowed_choices=poll['max_choices'],
  36. allow_revotes=poll['vote_changing'],
  37. votes=poll['votes'],
  38. is_public=poll['public'],
  39. )
  40. query = 'SELECT * FROM misago_pollvote WHERE poll_id = %s ORDER BY id'
  41. for vote in fetch_assoc(query, [poll['thread_id']]):
  42. if not vote['option_id']:
  43. continue
  44. voter = None
  45. if vote['user_id']:
  46. voter_pk = movedids.get('user', vote['user_id'])
  47. voter = UserModel.objects.get(pk=voter_pk)
  48. PollVote.objects.create(
  49. category=thread.category,
  50. thread=thread,
  51. poll=new_poll,
  52. voter=voter,
  53. voter_name=vote['user_name'],
  54. voter_slug=vote['user_slug'],
  55. voter_ip=vote['ip'],
  56. voted_on=localise_datetime(vote['date']),
  57. choice_hash=choices_map[vote['option_id']],
  58. )