diff --git a/nominations/admin.py b/nominations/admin.py index 92c426431..f84bad1c8 100644 --- a/nominations/admin.py +++ b/nominations/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from nominations.models import (Election, Nominee, Nomination) +from nominations.models import Election, Nominee, Nomination @admin.register(Election) diff --git a/nominations/forms.py b/nominations/forms.py index 69f5c21ed..688ad6e64 100644 --- a/nominations/forms.py +++ b/nominations/forms.py @@ -6,7 +6,6 @@ class NominationForm(forms.ModelForm): - class Meta: model = Nomination fields = ( diff --git a/nominations/migrations/0002_auto_20190514_1435.py b/nominations/migrations/0002_auto_20190514_1435.py new file mode 100644 index 000000000..336a0ce8f --- /dev/null +++ b/nominations/migrations/0002_auto_20190514_1435.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.13 on 2019-05-14 14:35 + +from django.db import migrations, models +import markupfield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('nominations', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='election', + name='_description_rendered', + field=models.TextField(editable=False, null=True), + ), + migrations.AddField( + model_name='election', + name='description', + field=markupfield.fields.MarkupField(null=True, rendered_field=True), + ), + migrations.AddField( + model_name='election', + name='description_markup_type', + field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='markdown', editable=False, max_length=30), + ), + ] diff --git a/nominations/models.py b/nominations/models.py index 3001d67a1..789e6791a 100644 --- a/nominations/models.py +++ b/nominations/models.py @@ -9,7 +9,6 @@ class Election(models.Model): - class Meta: ordering = ["-date"] @@ -20,15 +19,20 @@ def __str__(self): date = models.DateField() nominations_open_at = models.DateTimeField(blank=True, null=True) nominations_close_at = models.DateTimeField(blank=True, null=True) + description = MarkupField( + escape_html=True, markup_type="markdown", blank=False, null=True + ) slug = models.SlugField(max_length=255, blank=True, null=True) @property def nominations_open(self): if self.nominations_open_at and self.nominations_close_at: - return self.nominations_open_at < datetime.datetime.now( - datetime.timezone.utc - ) < self.nominations_close_at + return ( + self.nominations_open_at + < datetime.datetime.now(datetime.timezone.utc) + < self.nominations_close_at + ) return False @@ -57,7 +61,6 @@ def save(self, *args, **kwargs): class Nominee(models.Model): - class Meta: unique_together = ("user", "election") @@ -86,15 +89,19 @@ def name(self): @property def nominations_received(self): - return self.nominations.filter(accepted=True, approved=True).exclude( - nominator=self.user - ).all() + return ( + self.nominations.filter(accepted=True, approved=True) + .exclude(nominator=self.user) + .all() + ) @property def nominations_pending(self): - return self.nominations.exclude(accepted=False, approved=False).exclude( - nominator=self.user - ).all() + return ( + self.nominations.exclude(accepted=False, approved=False) + .exclude(nominator=self.user) + .all() + ) @property def self_nomination(self): @@ -106,7 +113,10 @@ def display_name(self): @property def display_previous_board_service(self): - if self.self_nomination is not None and self.self_nomination.previous_board_service: + if ( + self.self_nomination is not None + and self.self_nomination.previous_board_service + ): return self.self_nomination.previous_board_service return self.nominations.first().previous_board_service @@ -143,7 +153,6 @@ def save(self, *args, **kwargs): class Nomination(models.Model): - def __str__(self): return f"{self.name} <{self.email}>" @@ -173,12 +182,18 @@ def __str__(self): approved = models.BooleanField(null=False, default=False) def editable(self, user=None): - if self.nominee and user == self.nominee.user and self.election.nominations_open: + if ( + self.nominee + and user == self.nominee.user + and self.election.nominations_open + ): return True - if user == self.nominator and not ( - self.accepted or self.approved - ) and self.election.nominations_open: + if ( + user == self.nominator + and not (self.accepted or self.approved) + and self.election.nominations_open + ): return True return False diff --git a/nominations/views.py b/nominations/views.py index 8acdc922d..e9ccc43a5 100644 --- a/nominations/views.py +++ b/nominations/views.py @@ -14,7 +14,6 @@ class ElectionsList(ListView): class NominationMixin: - def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) self.election = Election.objects.get(slug=self.kwargs["election"]) @@ -30,16 +29,13 @@ def get_queryset(self, *args, **kwargs): if election.nominations_complete or self.request.user.is_superuser: return Nominee.objects.filter( accepted=True, approved=True, election=election - ).exclude( - user=None - ) + ).exclude(user=None) elif self.request.user.is_authenticated: return Nominee.objects.filter(user=self.request.user) class NomineeDetail(NominationMixin, DetailView): - def get(self, request, *args, **kwargs): self.object = self.get_object() if not self.object.visible(user=request.user): @@ -126,7 +122,6 @@ def get_context_data(self, **kwargs): class NominationView(DetailView): - def get(self, request, *args, **kwargs): self.object = self.get_object() if not self.object.visible(user=request.user): diff --git a/templates/nominations/election_list.html b/templates/nominations/election_list.html index 82bbe0a8d..75c5e5528 100644 --- a/templates/nominations/election_list.html +++ b/templates/nominations/election_list.html @@ -1,5 +1,6 @@ {% extends "psf/default.html" %} {% load boxes %} +{% load tz %} {% block page_title %}Elections | {{ SITE_INFO.site_name }}{% endblock %} @@ -16,26 +17,33 @@