aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/staff
diff options
context:
space:
mode:
authorGravatar scragly <[email protected]>2020-09-18 03:33:35 +1000
committerGravatar scragly <[email protected]>2020-09-18 03:33:35 +1000
commit357b20145b2784d9334b941fc25bcb8ce7b64c11 (patch)
treeccd446b4841ad69ae22fdc91f4c246823e0f811e /pydis_site/apps/staff
parentAdd new test for deleted message context log_url. (diff)
parentMerge pull request #390 from python-discord/allow_blank_or_null_for_nominatio... (diff)
Merge branch 'master' into admin-api-pages-improvements
# Conflicts: # pydis_site/apps/api/admin.py
Diffstat (limited to 'pydis_site/apps/staff')
-rw-r--r--pydis_site/apps/staff/migrations/0002_add_is_staff_to_role_mappings.py18
-rw-r--r--pydis_site/apps/staff/models/role_mapping.py5
-rw-r--r--pydis_site/apps/staff/templatetags/deletedmessage_filters.py15
-rw-r--r--pydis_site/apps/staff/tests/test_deletedmessage_filters.py43
-rw-r--r--pydis_site/apps/staff/tests/test_logs_view.py20
5 files changed, 92 insertions, 9 deletions
diff --git a/pydis_site/apps/staff/migrations/0002_add_is_staff_to_role_mappings.py b/pydis_site/apps/staff/migrations/0002_add_is_staff_to_role_mappings.py
new file mode 100644
index 00000000..0404d270
--- /dev/null
+++ b/pydis_site/apps/staff/migrations/0002_add_is_staff_to_role_mappings.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.6 on 2019-10-20 14:19
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('staff', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='rolemapping',
+ name='is_staff',
+ field=models.BooleanField(default=False, help_text='Whether this role mapping relates to a Django staff group'),
+ ),
+ ]
diff --git a/pydis_site/apps/staff/models/role_mapping.py b/pydis_site/apps/staff/models/role_mapping.py
index 10c09cf1..8a1fac2e 100644
--- a/pydis_site/apps/staff/models/role_mapping.py
+++ b/pydis_site/apps/staff/models/role_mapping.py
@@ -21,6 +21,11 @@ class RoleMapping(models.Model):
unique=True, # Unique in order to simplify group assignment logic
)
+ is_staff = models.BooleanField(
+ help_text="Whether this role mapping relates to a Django staff group",
+ default=False
+ )
+
def __str__(self):
"""Returns the mapping, for display purposes."""
return f"@{self.role.name} -> {self.group.name}"
diff --git a/pydis_site/apps/staff/templatetags/deletedmessage_filters.py b/pydis_site/apps/staff/templatetags/deletedmessage_filters.py
index f950870f..8e14ced6 100644
--- a/pydis_site/apps/staff/templatetags/deletedmessage_filters.py
+++ b/pydis_site/apps/staff/templatetags/deletedmessage_filters.py
@@ -7,11 +7,22 @@ register = template.Library()
@register.filter
def hex_colour(color: int) -> str:
- """Converts an integer representation of a colour to the RGB hex value."""
- return f"#{color:0>6X}"
+ """
+ Converts an integer representation of a colour to the RGB hex value.
+
+ As we are using a Discord dark theme analogue, black colours are returned as white instead.
+ """
+ colour = f"#{color:0>6X}"
+ return colour if colour != "#000000" else "#FFFFFF"
@register.filter
def footer_datetime(timestamp: str) -> datetime:
"""Takes an embed timestamp and returns a timezone-aware datetime object."""
return datetime.fromisoformat(timestamp)
+
+
+def visible_newlines(text: str) -> str:
+ """Takes an embed timestamp and returns a timezone-aware datetime object."""
+ return text.replace("\n", " <span class='has-text-grey'>↵</span><br>")
diff --git a/pydis_site/apps/staff/tests/test_deletedmessage_filters.py b/pydis_site/apps/staff/tests/test_deletedmessage_filters.py
index d9179044..31215784 100644
--- a/pydis_site/apps/staff/tests/test_deletedmessage_filters.py
+++ b/pydis_site/apps/staff/tests/test_deletedmessage_filters.py
@@ -18,16 +18,49 @@ class Colour(enum.IntEnum):
class DeletedMessageFilterTests(TestCase):
def test_hex_colour_filter(self):
- self.assertEqual(deletedmessage_filters.hex_colour(Colour.BLACK), "#000000")
- self.assertEqual(deletedmessage_filters.hex_colour(Colour.BLUE), "#0000FF")
- self.assertEqual(deletedmessage_filters.hex_colour(Colour.GREEN), "#00FF00")
- self.assertEqual(deletedmessage_filters.hex_colour(Colour.RED), "#FF0000")
- self.assertEqual(deletedmessage_filters.hex_colour(Colour.WHITE), "#FFFFFF")
+ """The filter should produce the correct hex values from the integer representations."""
+ test_values = (
+ (Colour.BLUE, "#0000FF"),
+ (Colour.GREEN, "#00FF00"),
+ (Colour.RED, "#FF0000"),
+ (Colour.WHITE, "#FFFFFF"),
+
+ # Since we're using a "Discord dark theme"-like front-end, show black text as white.
+ (Colour.BLACK, "#FFFFFF"),
+ )
+
+ for colour, hex_value in test_values:
+ with self.subTest(colour=colour, hex_value=hex_value):
+ self.assertEqual(deletedmessage_filters.hex_colour(colour), hex_value)
def test_footer_datetime_filter(self):
+ """The filter should parse the ISO-datetime string and return a timezone-aware datetime."""
datetime_aware = timezone.now()
iso_string = datetime_aware.isoformat()
datetime_returned = deletedmessage_filters.footer_datetime(iso_string)
self.assertTrue(timezone.is_aware(datetime_returned))
self.assertEqual(datetime_aware, datetime_returned)
+
+ def test_visual_newlines_filter(self):
+ """The filter should replace newline characters by newline character and html linebreak."""
+ html_br = " <span class='has-text-grey'>↵</span><br>"
+
+ test_values = (
+ (
+ "Hello, this line does not contain a linebreak",
+ "Hello, this line does not contain a linebreak"
+ ),
+ (
+ "A single linebreak\nin a string",
+ f"A single linebreak{html_br}in a string"
+ ),
+ (
+ "Consecutive linebreaks\n\n\nwork, too",
+ f"Consecutive linebreaks{html_br}{html_br}{html_br}work, too"
+ )
+ )
+
+ for input_, expected_output in test_values:
+ with self.subTest(input=input_, expected_output=expected_output):
+ self.assertEqual(deletedmessage_filters.visible_newlines(input_), expected_output)
diff --git a/pydis_site/apps/staff/tests/test_logs_view.py b/pydis_site/apps/staff/tests/test_logs_view.py
index 5036363b..00e0ab2f 100644
--- a/pydis_site/apps/staff/tests/test_logs_view.py
+++ b/pydis_site/apps/staff/tests/test_logs_view.py
@@ -21,10 +21,9 @@ class TestLogsView(TestCase):
id=12345678901,
name='Alan Turing',
discriminator=1912,
- avatar_hash=None
)
- cls.author.roles.add(cls.developers_role)
+ cls.author.roles.append(cls.developers_role.id)
cls.deletion_context = MessageDeletionContext.objects.create(
actor=cls.actor,
@@ -37,6 +36,7 @@ class TestLogsView(TestCase):
channel_id=1984,
content='<em>I think my tape has run out...</em>',
embeds=[],
+ attachments=[],
deletion_context=cls.deletion_context,
)
@@ -101,6 +101,7 @@ class TestLogsView(TestCase):
channel_id=1984,
content='Does that mean this thing will halt?',
embeds=[cls.embed_one, cls.embed_two],
+ attachments=['https://http.cat/100', 'https://http.cat/402'],
deletion_context=cls.deletion_context,
)
@@ -149,6 +150,21 @@ class TestLogsView(TestCase):
self.assertInHTML(embed_colour_needle.format(colour=embed_one_colour), html_response)
self.assertInHTML(embed_colour_needle.format(colour=embed_two_colour), html_response)
+ def test_if_both_attachments_are_included_html_response(self):
+ url = reverse('logs', host="staff", args=(self.deletion_context.id,))
+ response = self.client.get(url)
+
+ html_response = response.content.decode()
+ attachment_needle = '<img alt="Attachment" class="discord-attachment" src="{url}">'
+ self.assertInHTML(
+ attachment_needle.format(url=self.deleted_message_two.attachments[0]),
+ html_response
+ )
+ self.assertInHTML(
+ attachment_needle.format(url=self.deleted_message_two.attachments[1]),
+ html_response
+ )
+
def test_if_html_in_content_is_properly_escaped(self):
url = reverse('logs', host="staff", args=(self.deletion_context.id,))
response = self.client.get(url)