diff options
Diffstat (limited to 'pydis_site/apps')
| -rw-r--r-- | pydis_site/apps/api/migrations/0085_add_thread_id_to_nominations.py | 18 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/nomination.py | 4 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 10 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_nominations.py | 32 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/nomination.py | 21 | 
5 files changed, 77 insertions, 8 deletions
| diff --git a/pydis_site/apps/api/migrations/0085_add_thread_id_to_nominations.py b/pydis_site/apps/api/migrations/0085_add_thread_id_to_nominations.py new file mode 100644 index 00000000..56a24cc3 --- /dev/null +++ b/pydis_site/apps/api/migrations/0085_add_thread_id_to_nominations.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.2 on 2022-11-12 14:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0084_infraction_last_applied'), +    ] + +    operations = [ +        migrations.AddField( +            model_name='nomination', +            name='thread_id', +            field=models.BigIntegerField(help_text="The nomination vote's thread id.", null=True), +        ), +    ] diff --git a/pydis_site/apps/api/models/bot/nomination.py b/pydis_site/apps/api/models/bot/nomination.py index 221d8534..58e70a83 100644 --- a/pydis_site/apps/api/models/bot/nomination.py +++ b/pydis_site/apps/api/models/bot/nomination.py @@ -35,6 +35,10 @@ class Nomination(ModelReprMixin, models.Model):          default=False,          help_text="Whether a review was made."      ) +    thread_id = models.BigIntegerField( +        help_text="The nomination vote's thread id.", +        null=True, +    )      def __str__(self):          """Representation that makes the target and state of the nomination immediately evident.""" diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index 9228c1f4..4303e7d0 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -432,7 +432,15 @@ class NominationSerializer(ModelSerializer):          model = Nomination          fields = ( -            'id', 'active', 'user', 'inserted_at', 'end_reason', 'ended_at', 'reviewed', 'entries' +            'id', +            'active', +            'user', +            'inserted_at', +            'end_reason', +            'ended_at', +            'reviewed', +            'entries', +            'thread_id'          ) diff --git a/pydis_site/apps/api/tests/test_nominations.py b/pydis_site/apps/api/tests/test_nominations.py index 62b2314c..b3742cdd 100644 --- a/pydis_site/apps/api/tests/test_nominations.py +++ b/pydis_site/apps/api/tests/test_nominations.py @@ -524,3 +524,35 @@ class NominationTests(AuthenticatedAPITestCase):          self.assertEqual(response.json(), {              'actor': ["The actor doesn't exist or has not nominated the user."]          }) + +    def test_patch_nomination_set_thread_id_of_active_nomination(self): +        url = reverse('api:bot:nomination-detail', args=(self.active_nomination.id,)) +        data = {'thread_id': 9876543210} +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 200) + +    def test_patch_nomination_set_thread_id_and_reviewed_of_active_nomination(self): +        url = reverse('api:bot:nomination-detail', args=(self.active_nomination.id,)) +        data = {'thread_id': 9876543210, "reviewed": True} +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 200) + +    def test_modifying_thread_id_when_ending_nomination(self): +        url = reverse('api:bot:nomination-detail', args=(self.active_nomination.id,)) +        data = {'thread_id': 9876543210, 'active': False, 'end_reason': "What?"} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'thread_id': ['This field cannot be set when ending a nomination.'] +        }) + +    def test_patch_thread_id_for_inactive_nomination(self): +        url = reverse('api:bot:nomination-detail', args=(self.inactive_nomination.id,)) +        data = {'thread_id': 9876543210} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'thread_id': ['This field cannot be set if the nomination is inactive.'] +        }) diff --git a/pydis_site/apps/api/viewsets/bot/nomination.py b/pydis_site/apps/api/viewsets/bot/nomination.py index 6af42bcb..78687e0e 100644 --- a/pydis_site/apps/api/viewsets/bot/nomination.py +++ b/pydis_site/apps/api/viewsets/bot/nomination.py @@ -273,6 +273,11 @@ class NominationViewSet(CreateModelMixin, RetrieveModelMixin, ListModelMixin, Ge                      {'reviewed': ['This field cannot be set while you are ending a nomination.']}                  ) +            if 'thread_id' in request.data: +                raise ValidationError( +                    {'thread_id': ['This field cannot be set when ending a nomination.']} +                ) +              instance.ended_at = timezone.now()          elif 'active' in data: @@ -281,13 +286,15 @@ class NominationViewSet(CreateModelMixin, RetrieveModelMixin, ListModelMixin, Ge                  {'active': ['This field can only be used to end a nomination']}              ) -        # This is actually covered, but for some reason coverage don't think so. -        elif 'reviewed' in request.data:  # pragma: no cover -            # 4. We are altering the reviewed state of the nomination. -            if not instance.active: -                raise ValidationError( -                    {'reviewed': ['This field cannot be set if the nomination is inactive.']} -                ) +        elif not instance.active and 'reviewed' in request.data: +            raise ValidationError( +                {'reviewed': ['This field cannot be set if the nomination is inactive.']} +            ) + +        elif not instance.active and 'thread_id' in request.data: +            raise ValidationError( +                {'thread_id': ['This field cannot be set if the nomination is inactive.']} +            )          if 'reason' in request.data:              if 'actor' not in request.data: | 
