Skip to content

Commit

Permalink
Adding Choice model and votes
Browse files Browse the repository at this point in the history
- Adding Choice model that stores choice options of a poll and votes
- Adding tests

Adding migrations
  • Loading branch information
OmerCS8 committed Apr 6, 2022
1 parent 36f516a commit 9667e60
Show file tree
Hide file tree
Showing 6 changed files with 438 additions and 7 deletions.
6 changes: 4 additions & 2 deletions posts/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.contrib import admin
from .models import Resume
from .models import Rating
from .models import Resume, Rating, Poll, PollFile, Choice

admin.site.register(Resume)
admin.site.register(Rating)
admin.site.register(Poll)
admin.site.register(PollFile)
admin.site.register(Choice)
27 changes: 27 additions & 0 deletions posts/migrations/0004_poll.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 4.0.3 on 2022-04-05 15:30

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('posts', '0003_rating'),
]

operations = [
migrations.CreateModel(
name='Poll',
fields=[
('post_ptr', models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to='posts.post')),
],
bases=('posts.post',),
),
]
26 changes: 26 additions & 0 deletions posts/migrations/0005_pollfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 4.0.3 on 2022-03-31 11:01

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('posts', '0004_poll'),
]

operations = [
migrations.CreateModel(
name='PollFile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.FileField(
default=None, upload_to='files',
validators=[django.core.validators.FileExtensionValidator(
allowed_extensions=['pdf', 'png', 'jpg', 'jpeg'])])),
('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='posts.poll')),
],
),
]
25 changes: 25 additions & 0 deletions posts/migrations/0006_choice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.0.3 on 2022-04-03 09:50

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('posts', '0005_pollfile'),
]

operations = [
migrations.CreateModel(
name='Choice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='posts.poll')),
('voters', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)),
],
),
]
53 changes: 53 additions & 0 deletions posts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,56 @@ def __str__(self):

def get_rating_average(self):
return (self.design_rating + self.skill_relevance_rating + self.grammar_rating + self.conciseness_rating) / 4


# -----------------------------------Poll model inherited from Post-----------------------------------


class Poll(Post):

def __str__(self):
return f"Poll {self.post_id} by {self.author}"

def get_amount_of_votes(self):
votes_amount = 0
for choice in self.choice_set.all():
votes_amount += choice.get_amount_of_votes()
return votes_amount


# -----------------------------PollFile model that saves a file of a Poll-----------------------------


class PollFile(models.Model):
poll = models.ForeignKey(Poll, on_delete=models.CASCADE)
file = models.FileField(
default=None,
upload_to='files',
validators=[FileExtensionValidator(allowed_extensions=['pdf', 'png', 'jpg', 'jpeg'])]
)

def __str__(self):
return f"File {self.pk} of {self.poll}"


# ------------------------Choice model that stores one choice option of a Poll------------------------


class Choice(models.Model):
poll = models.ForeignKey(Poll, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
voters = models.ManyToManyField(User, blank=True)

def __str__(self):
return f"'{self.choice_text}' of {self.poll}"

def get_amount_of_votes(self):
return len(self.voters.all())

# get percentage of voters who voted to this choice
def get_percentage(self):
total_votes_amount = self.poll.get_amount_of_votes()
if total_votes_amount <= 0:
return 0
else:
return (self.get_amount_of_votes() / total_votes_amount) * 100
Loading

0 comments on commit 9667e60

Please sign in to comment.