SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 639148a6 authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Re-add nomination events

parent a4702d4c
No related branches found
No related tags found
No related merge requests found
...@@ -10,6 +10,7 @@ from .models import ( ...@@ -10,6 +10,7 @@ from .models import (
PotentialFellowship, PotentialFellowship,
PotentialFellowshipEvent, PotentialFellowshipEvent,
FellowshipNomination, FellowshipNomination,
FellowshipNominationEvent,
FellowshipNominationComment, FellowshipNominationComment,
FellowshipNominationVotingRound, FellowshipNominationVotingRound,
FellowshipNominationVote, FellowshipNominationVote,
...@@ -70,6 +71,11 @@ class PotentialFellowshipAdmin(admin.ModelAdmin): ...@@ -70,6 +71,11 @@ class PotentialFellowshipAdmin(admin.ModelAdmin):
admin.site.register(PotentialFellowship, PotentialFellowshipAdmin) admin.site.register(PotentialFellowship, PotentialFellowshipAdmin)
class FellowshipNominationEventInline(admin.TabularInline):
model = FellowshipNominationEvent
extra = 0
class FellowshipNominationCommentInline(admin.TabularInline): class FellowshipNominationCommentInline(admin.TabularInline):
model = FellowshipNominationComment model = FellowshipNominationComment
extra = 0 extra = 0
...@@ -92,6 +98,7 @@ class FellowshipInvitationInline(admin.TabularInline): ...@@ -92,6 +98,7 @@ class FellowshipInvitationInline(admin.TabularInline):
class FellowshipNominationAdmin(admin.ModelAdmin): class FellowshipNominationAdmin(admin.ModelAdmin):
inlines = [ inlines = [
FellowshipNominationEventInline,
FellowshipNominationCommentInline, FellowshipNominationCommentInline,
FellowshipNominationVotingRoundInline, FellowshipNominationVotingRoundInline,
FellowshipNominationDecisionInline, FellowshipNominationDecisionInline,
......
# Generated by Django 3.2.12 on 2022-03-09 06:17
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import scipost.models
class Migration(migrations.Migration):
dependencies = [
('scipost', '0040_auto_20210310_2026'),
('colleges', '0037_alter_fellowshipinvitation_postpone_start_to'),
]
operations = [
migrations.CreateModel(
name='FellowshipNominationEvent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('description', models.TextField()),
('on', models.DateTimeField(default=django.utils.timezone.now)),
('by', models.ForeignKey(blank=True, null=True, on_delete=models.SET(scipost.models.get_sentinel_user), to='scipost.contributor')),
('nomination', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='events', to='colleges.fellowshipnomination')),
],
options={
'verbose_name_plural': 'Fellowhip Nomination Events',
'ordering': ['nomination', '-on'],
},
),
]
# Generated by Django 3.2.12 on 2022-03-09 06:35
from django.db import migrations
def add_events(apps, schema_editor):
FellowshipNomination = apps.get_model("colleges", "FellowshipNomination")
FellowshipNominationEvent = apps.get_model("colleges", "FellowshipNominationEvent")
for n in FellowshipNomination.objects.exclude(events__description="Nominated"):
event = FellowshipNominationEvent(
nomination=n,
description="Nominated",
on=n.nominated_on,
by=n.nominated_by,
)
event.save()
class Migration(migrations.Migration):
dependencies = [
('colleges', '0038_fellowshipnominationevent'),
]
operations = [
migrations.RunPython(add_events, reverse_code=migrations.RunPython.noop),
]
...@@ -8,6 +8,7 @@ from .fellowship import Fellowship ...@@ -8,6 +8,7 @@ from .fellowship import Fellowship
from .nomination import ( from .nomination import (
FellowshipNomination, FellowshipNomination,
FellowshipNominationEvent,
FellowshipNominationComment, FellowshipNominationComment,
FellowshipNominationVotingRound, FellowshipNominationVotingRound,
FellowshipNominationVote, FellowshipNominationVote,
......
...@@ -11,6 +11,8 @@ from ..managers import ( ...@@ -11,6 +11,8 @@ from ..managers import (
FellowshipNominationVoteQuerySet, FellowshipNominationVoteQuerySet,
) )
from scipost.models import get_sentinel_user
class FellowshipNomination(models.Model): class FellowshipNomination(models.Model):
...@@ -64,6 +66,14 @@ class FellowshipNomination(models.Model): ...@@ -64,6 +66,14 @@ class FellowshipNomination(models.Model):
f'on {self.nominated_on.strftime("%Y-%m-%d")}' f'on {self.nominated_on.strftime("%Y-%m-%d")}'
) )
def add_event(self, description="", by=None):
event = FellowshipNominationEvent(
nomination=self,
description=description,
by=by,
)
event.save()
@property @property
def ongoing_voting_round(self): def ongoing_voting_round(self):
return self.voting_rounds.ongoing().first() return self.voting_rounds.ongoing().first()
...@@ -92,6 +102,28 @@ class FellowshipNomination(models.Model): ...@@ -92,6 +102,28 @@ class FellowshipNomination(models.Model):
return "No voting round found." return "No voting round found."
class FellowshipNominationEvent(models.Model):
nomination = models.ForeignKey(
"colleges.FellowshipNomination", on_delete=models.CASCADE, related_name="events"
)
description = models.TextField()
on = models.DateTimeField(default=timezone.now)
by = models.ForeignKey(
"scipost.Contributor",
on_delete=models.SET(get_sentinel_user),
blank=True, null=True,
)
class Meta:
ordering = ["nomination", "-on"]
verbose_name_plural = "Fellowhip Nomination Events"
def __str__(self):
return (f"Event for {self.nomination.profile} by {self.by} on {self.on}: "
f"{self.description}")
class FellowshipNominationComment(models.Model): class FellowshipNominationComment(models.Model):
nomination = models.ForeignKey( nomination = models.ForeignKey(
......
...@@ -69,6 +69,32 @@ ...@@ -69,6 +69,32 @@
</tr> </tr>
</table> </table>
<hr>
{% if "edadmin" in user_roles or "active_senior_fellow" in user_roles %}
<details class="m-2 mt-4 border border-danger">
<summary class="p-2 bg-light">Events</summary>
<table class="table m-2">
<thead>
<tr>
<th>Date and time</th>
<th>Description</th>
<th>By</th>
</tr>
</thead>
<tbody>
{% for event in nomination.events.all %}
<tr>
<td>{{ event.on }}</td>
<td>{{ event.description }}</td>
<td>{{ event.by }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</details>
{% endif %}
<div class="card m-2 mt-4"> <div class="card m-2 mt-4">
<div class="card-header"> <div class="card-header">
Comments Comments
...@@ -216,4 +242,5 @@ ...@@ -216,4 +242,5 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% include 'colleges/_hx_nominations_invitations_tablist.html' with selected=selected %} {% include 'colleges/_hx_nominations_invitations_tablist.html' with selected=selected %}
{% for invitation in invitations.all %} {% for invitation in invitations.all %}
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
......
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
</summary> </summary>
<div class="p-2 mt-2"> <div class="p-2 mt-2">
<div id="invitations_tablist" <div id="invitations_tablist"
hx-get="{% url 'colleges:_hx_nominations_invitations' %}?response='notyetinvited'" hx-get="{% url 'colleges:_hx_nominations_invitations' %}?response=notyetinvited"
hx-trigger="load" hx-trigger="load"
hx-target="this" hx-target="this"
hx-swap="innerHTML" hx-swap="innerHTML"
......
...@@ -663,6 +663,13 @@ def _hx_nomination_form(request, profile_id): ...@@ -663,6 +663,13 @@ def _hx_nomination_form(request, profile_id):
nomination_form = FellowshipNominationForm(request.POST or None, profile=profile) nomination_form = FellowshipNominationForm(request.POST or None, profile=profile)
if nomination_form.is_valid(): if nomination_form.is_valid():
nomination = nomination_form.save() nomination = nomination_form.save()
nomination.add_event(description="Nominated", by=request.user.contributor)
event = FellowshipNominationEvent(
nomination=nomination,
description="Nominated",
by=request.user.contributor,
)
event.save()
return HttpResponse( return HttpResponse(
f'<div class="bg-success text-white p-2 ">{nomination.profile} ' f'<div class="bg-success text-white p-2 ">{nomination.profile} '
f"successfully nominated to {nomination.college}.</div>" f"successfully nominated to {nomination.college}.</div>"
...@@ -723,6 +730,7 @@ def _hx_nomination_comments(request, nomination_id): ...@@ -723,6 +730,7 @@ def _hx_nomination_comments(request, nomination_id):
form = FellowshipNominationCommentForm(request.POST or None, initial=initial) form = FellowshipNominationCommentForm(request.POST or None, initial=initial)
if form.is_valid(): if form.is_valid():
form.save() form.save()
nomination.add_event(description="Comment added", by=request.user.contributor)
form = FellowshipNominationCommentForm(initial=initial) form = FellowshipNominationCommentForm(initial=initial)
context = {"nomination": nomination, "form": form,} context = {"nomination": nomination, "form": form,}
return render(request, "colleges/_hx_nomination_comments.html", context) return render(request, "colleges/_hx_nomination_comments.html", context)
...@@ -777,6 +785,10 @@ def _hx_nomination_vote(request, voting_round_id): ...@@ -777,6 +785,10 @@ def _hx_nomination_vote(request, voting_round_id):
"on": timezone.now(), "on": timezone.now(),
} }
) )
if created:
nomination.add_event(description="Vote received", by=request.user.contributor)
else:
nomination.add_event(description="Vote updated", by=request.user.contributor)
context = {"voting_round": voting_round, "vote_object": vote_object,} context = {"voting_round": voting_round, "vote_object": vote_object,}
return render(request, "colleges/_hx_nomination_vote.html", context) return render(request, "colleges/_hx_nomination_vote.html", context)
...@@ -788,12 +800,14 @@ def _hx_nomination_decision(request, nomination_id): ...@@ -788,12 +800,14 @@ def _hx_nomination_decision(request, nomination_id):
decision_form = FellowshipNominationDecisionForm(request.POST or None) decision_form = FellowshipNominationDecisionForm(request.POST or None)
if decision_form.is_valid(): if decision_form.is_valid():
decision = decision_form.save() decision = decision_form.save()
nomination.add_event(description="Decision fixed", by=request.user.contributor)
if decision.outcome == FellowshipNominationDecision.OUTCOME_ELECTED: if decision.outcome == FellowshipNominationDecision.OUTCOME_ELECTED:
invitation = FellowshipInvitation( invitation = FellowshipInvitation(
nomination=nomination, nomination=nomination,
response=FellowshipInvitation.RESPONSE_NOT_YET_INVITED, response=FellowshipInvitation.RESPONSE_NOT_YET_INVITED,
) )
invitation.save() invitation.save()
nomination.add_event(description="Invitation created", by=request.user.contributor)
else: else:
decision_form.fields["nomination"].initial = nomination decision_form.fields["nomination"].initial = nomination
context = { context = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment