diff options
| author | 2022-01-31 00:42:55 +0400 | |
|---|---|---|
| committer | 2022-01-31 00:45:32 +0400 | |
| commit | 77a2b731c1b7132ab56a7f27ac665e4d71e0d169 (patch) | |
| tree | 0c371647c53f249b769d5e2d1e0688cf472ff261 /pydis_site | |
| parent | Revert ugly deploy preview redirect hack. (diff) | |
| parent | Merge pull request #649 from python-discord/update-pyfakefs (diff) | |
Merge branch 'main' into swfarnsworth/smarter-resources/merge-with-main
Signed-off-by: Hassan Abouelela <[email protected]>
# Conflicts:
#	poetry.lock
#	pyproject.toml
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/migrations/0074_voice_mute.py | 36 | ||||
| -rw-r--r-- | pydis_site/apps/api/migrations/0079_merge_20220125_2022.py | 14 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/infraction.py | 3 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_users.py | 32 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/user.py | 14 | ||||
| -rw-r--r-- | pydis_site/apps/content/resources/guides/pydis-guides/contributing/bot.md | 7 | ||||
| -rw-r--r-- | pydis_site/templates/content/dropdown.html | 2 | 
8 files changed, 88 insertions, 22 deletions
diff --git a/pydis_site/apps/api/migrations/0074_voice_mute.py b/pydis_site/apps/api/migrations/0074_voice_mute.py new file mode 100644 index 00000000..937557bc --- /dev/null +++ b/pydis_site/apps/api/migrations/0074_voice_mute.py @@ -0,0 +1,36 @@ +# Generated by Django 3.0.14 on 2021-10-09 18:52 +from django.apps.registry import Apps +from django.db import migrations, models +from django.db.backends.base.schema import BaseDatabaseSchemaEditor + + +def migrate_infractions(apps: Apps, schema_editor: BaseDatabaseSchemaEditor) -> None: +    Infraction = apps.get_model("api", "Infraction") + +    for infraction in Infraction.objects.filter(type="voice_ban"): +        infraction.type = "voice_mute" +        infraction.save() + + +def unmigrate_infractions(apps: Apps, schema_editor: BaseDatabaseSchemaEditor) -> None: +    Infraction = apps.get_model("api", "Infraction") + +    for infraction in Infraction.objects.filter(type="voice_mute"): +        infraction.type = "voice_ban" +        infraction.save() + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0073_otn_allow_GT_and_LT'), +    ] + +    operations = [ +        migrations.AlterField( +            model_name='infraction', +            name='type', +            field=models.CharField(choices=[('note', 'Note'), ('warning', 'Warning'), ('watch', 'Watch'), ('mute', 'Mute'), ('kick', 'Kick'), ('ban', 'Ban'), ('superstar', 'Superstar'), ('voice_ban', 'Voice Ban'), ('voice_mute', 'Voice Mute')], help_text='The type of the infraction.', max_length=10), +        ), +        migrations.RunPython(migrate_infractions, unmigrate_infractions) +    ] diff --git a/pydis_site/apps/api/migrations/0079_merge_20220125_2022.py b/pydis_site/apps/api/migrations/0079_merge_20220125_2022.py new file mode 100644 index 00000000..9b9d9326 --- /dev/null +++ b/pydis_site/apps/api/migrations/0079_merge_20220125_2022.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1.14 on 2022-01-25 20:22 + +from django.db import migrations + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0078_merge_20211213_0552'), +        ('api', '0074_voice_mute'), +    ] + +    operations = [ +    ] diff --git a/pydis_site/apps/api/models/bot/infraction.py b/pydis_site/apps/api/models/bot/infraction.py index 913631d4..c9303024 100644 --- a/pydis_site/apps/api/models/bot/infraction.py +++ b/pydis_site/apps/api/models/bot/infraction.py @@ -17,6 +17,7 @@ class Infraction(ModelReprMixin, models.Model):          ("ban", "Ban"),          ("superstar", "Superstar"),          ("voice_ban", "Voice Ban"), +        ("voice_mute", "Voice Mute"),      )      inserted_at = models.DateTimeField(          default=timezone.now, @@ -45,7 +46,7 @@ class Infraction(ModelReprMixin, models.Model):          help_text="The user which applied the infraction."      )      type = models.CharField( -        max_length=9, +        max_length=10,          choices=TYPE_CHOICES,          help_text="The type of the infraction."      ) diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index ac05ebd4..4a702d61 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -177,7 +177,7 @@ class InfractionSerializer(ModelSerializer):              raise ValidationError({'expires_at': [f'{infr_type} infractions cannot expire.']})          hidden = attrs.get('hidden') -        if hidden and infr_type in ('superstar', 'warning', 'voice_ban'): +        if hidden and infr_type in ('superstar', 'warning', 'voice_ban', 'voice_mute'):              raise ValidationError({'hidden': [f'{infr_type} infractions cannot be hidden.']})          if not hidden and infr_type in ('note', ): diff --git a/pydis_site/apps/api/tests/test_users.py b/pydis_site/apps/api/tests/test_users.py index 9b91380b..e21bb32b 100644 --- a/pydis_site/apps/api/tests/test_users.py +++ b/pydis_site/apps/api/tests/test_users.py @@ -1,10 +1,9 @@ -from unittest.mock import patch +from unittest.mock import Mock, patch -from django.core.exceptions import ObjectDoesNotExist  from django.urls import reverse  from .base import AuthenticatedAPITestCase -from ..models import Role, User +from ..models import Infraction, Role, User  from ..models.bot.metricity import NotFoundError  from ..viewsets.bot.user import UserListPagination @@ -424,7 +423,7 @@ class UserMetricityTests(AuthenticatedAPITestCase):          self.assertCountEqual(response.json(), {              "joined_at": joined_at,              "total_messages": total_messages, -            "voice_banned": False, +            "voice_gate_blocked": False,              "activity_blocks": total_blocks          }) @@ -451,23 +450,36 @@ class UserMetricityTests(AuthenticatedAPITestCase):          self.assertEqual(response.status_code, 404)      def test_metricity_voice_banned(self): +        queryset_with_values = Mock(spec=Infraction.objects) +        queryset_with_values.filter.return_value = queryset_with_values +        queryset_with_values.exists.return_value = True + +        queryset_without_values = Mock(spec=Infraction.objects) +        queryset_without_values.filter.return_value = queryset_without_values +        queryset_without_values.exists.return_value = False          cases = [ -            {'exception': None, 'voice_banned': True}, -            {'exception': ObjectDoesNotExist, 'voice_banned': False}, +            {'voice_infractions': queryset_with_values, 'voice_gate_blocked': True}, +            {'voice_infractions': queryset_without_values, 'voice_gate_blocked': False},          ]          self.mock_metricity_user("foo", 1, 1, [["bar", 1]])          for case in cases: -            with self.subTest(exception=case['exception'], voice_banned=case['voice_banned']): -                with patch("pydis_site.apps.api.viewsets.bot.user.Infraction.objects.get") as p: -                    p.side_effect = case['exception'] +            with self.subTest( +                voice_infractions=case['voice_infractions'], +                voice_gate_blocked=case['voice_gate_blocked'] +            ): +                with patch("pydis_site.apps.api.viewsets.bot.user.Infraction.objects.filter") as p: +                    p.return_value = case['voice_infractions']                      url = reverse('api:bot:user-metricity-data', args=[0])                      response = self.client.get(url)                      self.assertEqual(response.status_code, 200) -                    self.assertEqual(response.json()["voice_banned"], case["voice_banned"]) +                    self.assertEqual( +                        response.json()["voice_gate_blocked"], +                        case["voice_gate_blocked"] +                    )      def test_metricity_review_data(self):          # Given diff --git a/pydis_site/apps/api/viewsets/bot/user.py b/pydis_site/apps/api/viewsets/bot/user.py index 1a5e79f8..a867a80f 100644 --- a/pydis_site/apps/api/viewsets/bot/user.py +++ b/pydis_site/apps/api/viewsets/bot/user.py @@ -1,7 +1,7 @@  import typing  from collections import OrderedDict -from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Q  from rest_framework import status  from rest_framework.decorators import action  from rest_framework.pagination import PageNumberPagination @@ -261,12 +261,10 @@ class UserViewSet(ModelViewSet):          """Request handler for metricity_data endpoint."""          user = self.get_object() -        try: -            Infraction.objects.get(user__id=user.id, active=True, type="voice_ban") -        except ObjectDoesNotExist: -            voice_banned = False -        else: -            voice_banned = True +        has_voice_infraction = Infraction.objects.filter( +            Q(user__id=user.id, active=True), +            Q(type="voice_ban") | Q(type="voice_mute") +        ).exists()          with Metricity() as metricity:              try: @@ -275,7 +273,7 @@ class UserViewSet(ModelViewSet):                  data["total_messages"] = metricity.total_messages(user.id)                  data["activity_blocks"] = metricity.total_message_blocks(user.id) -                data["voice_banned"] = voice_banned +                data["voice_gate_blocked"] = has_voice_infraction                  return Response(data, status=status.HTTP_200_OK)              except NotFoundError:                  return Response(dict(detail="User not found in metricity"), diff --git a/pydis_site/apps/content/resources/guides/pydis-guides/contributing/bot.md b/pydis_site/apps/content/resources/guides/pydis-guides/contributing/bot.md index b9589def..ed9e3db3 100644 --- a/pydis_site/apps/content/resources/guides/pydis-guides/contributing/bot.md +++ b/pydis_site/apps/content/resources/guides/pydis-guides/contributing/bot.md @@ -196,6 +196,7 @@ guild:          big_brother:                            �          dev_log:                                �          duck_pond:                              � +        incidents:                              �          incidents_archive:                      �          python_news:        &PYNEWS_WEBHOOK     �          talent_pool:                            � @@ -350,7 +351,7 @@ style:          trashcan: "<:trashcan:�>" -##### <<  Optional - If you don't care about the filtering and help channel cogs, ignore the rest of this file  >> ##### +##### <<  Optional - If you don't care about the filtering, help channel and py-news cogs, ignore the rest of this file  >> #####  filter:      # What do we filter?      filter_domains:        true @@ -426,6 +427,10 @@ help_channels:      notify_roles:          - *HELPERS_ROLE +python_news: +    channel: *DEV_PY_NEWS +    webhook: *PYNEWS_WEBHOOK +  ##### <<  Add any additional sections you need to override from config-default.yml  >> #####              </code>            </pre> diff --git a/pydis_site/templates/content/dropdown.html b/pydis_site/templates/content/dropdown.html index d81e29dc..13c89c68 100644 --- a/pydis_site/templates/content/dropdown.html +++ b/pydis_site/templates/content/dropdown.html @@ -1,4 +1,4 @@ -<div class="dropdown is-pulled-right is-right" id="dropdown"> +<div class="dropdown is-pulled-right is-right" id="dropdown" style="z-index: 1">      <div class="dropdown-trigger">          <a aria-haspopup="true" aria-controls="subarticle-menu">              <span>Sub-Articles</span>  |