F
Jan. 5, 2023, 10:35 p.m.

A voting site with Django

  1. ----------------------------Model----------------------------------------
  2. class Voter(models.Model):
  3. gender_type = (('male', 'Male'), ('female', 'Female'))
  4. admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
  5. gender = models.CharField(max_length=10, choices=gender_type)
  6. country_region = models.CharField(max_length=255, choices=Countries.choices, default=Countries.Pakistan)
  7. phone = PhoneNumberField(blank=True, unique=True)
  8. otp = models.CharField(max_length=10, null=True)
  9. verified = models.BooleanField(default=False)
  10. voted = models.BooleanField(default=False)
  11. otp_sent = models.IntegerField(default=0) # Control how many OTPs are sent
  12. ip_address = models.GenericIPAddressField(unique=True, default='ABC')
  13.  
  14.  
  15. def __str__(self):
  16. return self.admin.first_name
  17.  
  18.  
  19. class Position(models.Model):
  20. ACTIVE = 0
  21. INACTIVE = 1
  22.  
  23. status_choice = ((ACTIVE, 'Active'), (INACTIVE, 'Inactive'))
  24. name = models.CharField(max_length=50, unique=True)
  25. max_vote = models.IntegerField()
  26. priority = models.IntegerField()
  27. description = models.TextField(null=True, blank=True)
  28. status = models.PositiveBigIntegerField(default=0, choices=status_choice)
  29.  
  30. def __str__(self):
  31. return self.name
  32.  
  33.  
  34. class Candidate(models.Model):
  35. fullname = models.CharField(max_length=50)
  36. photo = models.ImageField(upload_to="candidates")
  37. bio = models.TextField()
  38. position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='candidates')
  39.  
  40. def __str__(self):
  41. return self.fullname
  42.  
  43. def modify_points(self, added_points):
  44. self.points += added_points
  45. self.save()
  46.  
  47.  
  48. class Votes(models.Model):
  49. voter = models.ForeignKey(Voter, on_delete=models.CASCADE)
  50. position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='positions')
  51. candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='votes')
  52.  
  53.  
  54. class BlockIP(models.Model):
  55. voter = models.ForeignKey(Voter, on_delete=models.CASCADE, related_name='ip')
  56. position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='positions_ip', null=True, blank=True)
  57. ip_address = models.GenericIPAddressField(default='abc')
  58.  
  59.  
  60. @receiver(post_save, sender=Voter)
  61. def default_to_non_active(sender, instance, created, **kwargs):
  62. if created:
  63. instance = BlockIP.objects.create(voter=instance, ip_address=instance.ip_address)
  64. instance.save()
  65.  
  66. -------------------------------------------- End of model-----------------------------------
  67.  
  68. def submit_ballot(request):
  69. if not request.user.is_authenticated:
  70. return redirect(reverse('index'))
  71.  
  72. if request.method != 'POST':
  73. messages.error(request, "Please, browse the system properly")
  74. return redirect(reverse('index'))
  75.  
  76. # Verify if the voter has voted or not
  77. voter = request.user.voter
  78. blocked = BlockIP.objects.filter(voter=voter)
  79. if voter.voted and blocked:
  80. messages.error(request, "You have voted already")
  81. return redirect(reverse('index'))
  82.  
  83. form = dict(request.POST)
  84. form.pop('csrfmiddlewaretoken', None) # Pop CSRF Token
  85. form.pop('submit_vote', None) # Pop Submit Button
  86.  
  87. # Ensure at least one vote is selected
  88. if len(form.keys()) < 1:
  89. messages.error(request, "Please select at least one candidate")
  90. return redirect(reverse('index'))
  91. positions = Position.objects.all()
  92. form_count = 0
  93. for position in positions:
  94. max_vote = position.max_vote
  95. pos = slugify(position.name)
  96. pos_id = position.id
  97. if position.max_vote > 1:
  98. this_key = pos + "[]"
  99. form_position = form.get(this_key)
  100. if form_position is None:
  101. continue
  102. if len(form_position) > max_vote:
  103. messages.error(request, "You can only choose " +
  104. str(max_vote) + " candidates for " + position.name)
  105. return redirect(reverse('index'))
  106. else:
  107. for form_candidate_id in form_position:
  108. form_count += 1
  109. try:
  110. candidate = Candidate.objects.get(id=form_candidate_id, position=position)
  111. vote = Votes()
  112. vote.candidate = candidate
  113. vote.voter = voter
  114. vote.position = position
  115. vote.save()
  116.  
  117. except Exception as e:
  118. messages.error(
  119. request, "Please, browse the system properly " + str(e))
  120. return redirect(reverse('index'))
  121. else:
  122. this_key = pos
  123. form_position = form.get(this_key)
  124. if form_position is None:
  125. continue
  126. # Max Vote == 1
  127. form_count += 1
  128. try:
  129. form_position = form_position[0]
  130. candidate = Candidate.objects.get(position=position, id=form_position)
  131. vote = Votes()
  132. vote.candidate = candidate
  133. vote.voter = voter
  134. vote.position = position
  135. vote.save()
  136. except Exception as e:
  137. messages.error(
  138. request, "Please, browse the system properly " + str(e))
  139. return redirect(reverse('index'))
  140.  
  141. # Count total number of records inserted
  142. # Check it viz-a-viz form_count
  143. inserted_votes = Votes.objects.filter(voter=voter)
  144. if (inserted_votes.count() != form_count):
  145. # Delete
  146. inserted_votes.delete()
  147. messages.error(request, "Please try voting again!")
  148. return redirect(reverse('index'))
  149. else:
  150. # Update Voter profile to voted
  151. voter.voted = True
  152. voter.save()
  153. messages.success(request, "Thanks for voting")
  154. return redirect(reverse('index'))

When a poll is create, and a candidate is added to that poll, a voter can vote any candidate, my problem now is if a voter already voted, that voter cannot vote again even when another poll is created, what i want is a voter can still vote in another poll regardless of voting on a poll already

2

Do you like it? Share on social networks!

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
  • A
    Oct. 19, 2024, 5:19 p.m.
    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html