Skip to content

Commit

Permalink
Merge branch 'main' into fix-#2340
Browse files Browse the repository at this point in the history
  • Loading branch information
zackkrida authored Apr 8, 2024
2 parents 363046b + 9ab390d commit a759361
Show file tree
Hide file tree
Showing 145 changed files with 5,294 additions and 4,740 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/pr_label_check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
- get_label_groups
steps:
- name: Check aspect label
uses: docker://agilepathway/pull-request-label-checker:v1.6.23
uses: docker://agilepathway/pull-request-label-checker:v1.6.29
with:
any_of: ${{ needs.get_label_groups.outputs.aspect }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -55,7 +55,7 @@ jobs:
- get_label_groups
steps:
- name: Check goal label
uses: docker://agilepathway/pull-request-label-checker:v1.6.23
uses: docker://agilepathway/pull-request-label-checker:v1.6.29
with:
one_of: ${{ needs.get_label_groups.outputs.goal }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -68,7 +68,7 @@ jobs:
- get_label_groups
steps:
- name: Check priority label
uses: docker://agilepathway/pull-request-label-checker:v1.6.23
uses: docker://agilepathway/pull-request-label-checker:v1.6.29
with:
one_of: ${{ needs.get_label_groups.outputs.priority }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -81,7 +81,7 @@ jobs:
- get_label_groups
steps:
- name: Check stack label
uses: docker://agilepathway/pull-request-label-checker:v1.6.23
uses: docker://agilepathway/pull-request-label-checker:v1.6.29
with:
any_of: ${{ needs.get_label_groups.outputs.stack }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion .github/workflows/renovate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
sudo chown -R runneradmin:root /tmp/renovate/
ls -R "$cache_dir"
- uses: renovatebot/github-action@v40.1.5
- uses: renovatebot/github-action@v40.1.7
with:
configurationFile: .github/renovate.json
token: ${{ secrets.ACCESS_TOKEN }}
Expand Down
8 changes: 4 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
exclude: Pipfile\.lock|migrations|\.idea|node_modules|archive|retired
exclude: Pipfile\.lock|migrations|\.idea|node_modules|archive|retired|\.snap

repos:
- repo: local # More local hooks are defined at the bottom.
Expand Down Expand Up @@ -46,7 +46,7 @@ repos:
- id: requirements-txt-fixer

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.0
rev: v0.3.4
hooks:
- id: ruff # replaces Flake8, isort, pydocstyle, pyupgrade
args:
Expand All @@ -66,7 +66,7 @@ repos:
- typescript@5.2.2

- repo: https://github.com/koalaman/shellcheck-precommit
rev: v0.9.0
rev: v0.10.0
hooks:
- id: shellcheck

Expand Down Expand Up @@ -155,7 +155,7 @@ repos:
files: (.vale/.*|.mdx?)$

- repo: https://github.com/renovatebot/pre-commit-hooks
rev: 37.221.1
rev: 37.278.0
hooks:
- id: renovate-config-validator
args:
Expand Down
4 changes: 2 additions & 2 deletions api/Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ verify_ssl = true

[dev-packages]
factory-boy = "~=3.2"
fakeredis = "==2.21.1"
fakeredis = "==2.21.3"
freezegun = "~=1.2"
ipython = "~=8.17"
pgcli = "~=3.5"
Expand Down Expand Up @@ -34,7 +34,7 @@ django-tqdm = "~=1.3"
django-uuslug = "~=2.0"
djangorestframework = "~=3.14"
drf-spectacular = "*"
elasticsearch = "==8.12.1"
elasticsearch = "==8.13.0"
elasticsearch-dsl = "~=8.9"
future = "~=0.18"
limit = "~=0.2"
Expand Down
28 changes: 15 additions & 13 deletions api/Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 8 additions & 15 deletions api/api/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,16 @@ class AudioAdmin(admin.ModelAdmin):


class MediaReportAdmin(admin.ModelAdmin):
list_display = ("reason", "status", "description", "created_at")
media_specific_list_display = ()
list_filter = ("status", "reason")
list_display_links = ("status",)
list_display = ("id", "reason", "is_pending", "description", "created_at", "url")
list_filter = (
("decision", admin.EmptyFieldListFilter), # ~status, i.e. pending or moderated
"reason",
)
list_display_links = ("id",)
search_fields = ("description", "media_obj__identifier")
autocomplete_fields = ("media_obj",)
actions = None

def get_list_display(self, request):
return self.list_display + self.media_specific_list_display

def get_exclude(self, request, obj=None):
# ``identifier`` cannot be edited on an existing report.
if request.path.endswith("/change/"):
Expand All @@ -61,14 +60,8 @@ def get_readonly_fields(self, request, obj=None):
return readonly_fields


@admin.register(ImageReport)
class ImageReportAdmin(MediaReportAdmin):
media_specific_list_display = ("image_url",)


@admin.register(AudioReport)
class AudioReportAdmin(MediaReportAdmin):
media_specific_list_display = ("audio_url",)
admin.site.register(AudioReport, MediaReportAdmin)
admin.site.register(ImageReport, MediaReportAdmin)


class MediaSubreportAdmin(admin.ModelAdmin):
Expand Down
23 changes: 23 additions & 0 deletions api/api/constants/moderation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from django.db import models


class DecisionAction(models.TextChoices):
"""
This enumeration represents the actions that can be taken by a moderator as
a part of a moderation decision.
"""

MARKED_SENSITIVE = "marked_sensitive", "Marked sensitive"

DEINDEXED_COPYRIGHT = "deindexed_copyright", "Deindexed (copyright)"
DEINDEXED_SENSITIVE = "deindexed_sensitive", "Deindexed (sensitive)"

REJECTED_REPORTS = "rejected_reports", "Rejected"
DEDUPLICATED_REPORTS = "deduplicated_reports", "De-duplicated"

REVERSED_MARK_SENSITIVE = "reversed_mark_sensitive", "Reversed mark sensitive"
REVERSED_DEINDEX = "reversed_deindex", "Reversed deindex"

@property
def is_reversal(self):
return self in {self.REVERSED_DEINDEX, self.REVERSED_MARK_SENSITIVE}
56 changes: 56 additions & 0 deletions api/api/migrations/0058_moderation_decision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Generated by Django 4.2.7 on 2024-03-31 12:01

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('api', '0057_alter_sensitiveaudio_options'),
]

operations = [
migrations.CreateModel(
name='ImageDecision',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_on', models.DateTimeField(auto_now_add=True)),
('updated_on', models.DateTimeField(auto_now=True)),
('notes', models.TextField(blank=True, help_text="The moderator's explanation for the decision or additional notes.", max_length=500, null=True)),
('action', models.CharField(choices=[('marked_sensitive', 'Marked sensitive'), ('deindexed_copyright', 'Deindexed (copyright)'), ('deindexed_sensitive', 'Deindexed (sensitive)'), ('rejected_reports', 'Rejected'), ('deduplicated_reports', 'De-duplicated'), ('reversed_mark_sensitive', 'Reversed mark sensitive'), ('reversed_deindex', 'Reversed deindex')], help_text='Action taken by the moderator.', max_length=32)),
('media_objs', models.ManyToManyField(db_constraint=False, help_text='The image items being moderated.', to='api.image')),
('moderator', models.ForeignKey(help_text='The moderator who undertook this decision.', on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='AudioDecision',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_on', models.DateTimeField(auto_now_add=True)),
('updated_on', models.DateTimeField(auto_now=True)),
('notes', models.TextField(blank=True, help_text="The moderator's explanation for the decision or additional notes.", max_length=500, null=True)),
('action', models.CharField(choices=[('marked_sensitive', 'Marked sensitive'), ('deindexed_copyright', 'Deindexed (copyright)'), ('deindexed_sensitive', 'Deindexed (sensitive)'), ('rejected_reports', 'Rejected'), ('deduplicated_reports', 'De-duplicated'), ('reversed_mark_sensitive', 'Reversed mark sensitive'), ('reversed_deindex', 'Reversed deindex')], help_text='Action taken by the moderator.', max_length=32)),
('media_objs', models.ManyToManyField(db_constraint=False, help_text='The audio items being moderated.', to='api.audio')),
('moderator', models.ForeignKey(help_text='The moderator who undertook this decision.', on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
migrations.AddField(
model_name='audioreport',
name='decision',
field=models.ForeignKey(blank=True, help_text='The moderation decision for this report.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.audiodecision'),
),
migrations.AddField(
model_name='imagereport',
name='decision',
field=models.ForeignKey(blank=True, help_text='The moderation decision for this report.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.imagedecision'),
),
]
24 changes: 19 additions & 5 deletions api/api/models/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
AbstractAltFile,
AbstractDeletedMedia,
AbstractMedia,
AbstractMediaDecision,
AbstractMediaList,
AbstractMediaReport,
AbstractSensitiveMedia,
Expand Down Expand Up @@ -289,8 +290,6 @@ class Meta:

class AudioReport(AbstractMediaReport):
media_class = Audio
sensitive_class = SensitiveAudio
deleted_class = DeletedAudio

media_obj = models.ForeignKey(
to="Audio",
Expand All @@ -301,13 +300,28 @@ class AudioReport(AbstractMediaReport):
related_name="audio_report",
help_text="The reference to the audio being reported.",
)
decision = models.ForeignKey(
to="AudioDecision",
on_delete=models.SET_NULL,
blank=True,
null=True,
help_text="The moderation decision for this report.",
)

class Meta:
db_table = "nsfw_reports_audio"

@property
def audio_url(self):
return super().url("audio")

class AudioDecision(AbstractMediaDecision):
"""Represents moderation decisions taken for audio tracks."""

media_class = Audio

media_objs = models.ManyToManyField(
to="Audio",
db_constraint=False,
help_text="The audio items being moderated.",
)


class AudioList(AbstractMediaList):
Expand Down
24 changes: 19 additions & 5 deletions api/api/models/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from api.models.media import (
AbstractDeletedMedia,
AbstractMedia,
AbstractMediaDecision,
AbstractMediaList,
AbstractMediaReport,
AbstractSensitiveMedia,
Expand Down Expand Up @@ -108,8 +109,6 @@ class Meta:

class ImageReport(AbstractMediaReport):
media_class = Image
sensitive_class = SensitiveImage
deleted_class = DeletedImage

media_obj = models.ForeignKey(
to="Image",
Expand All @@ -120,13 +119,28 @@ class ImageReport(AbstractMediaReport):
related_name="image_report",
help_text="The reference to the image being reported.",
)
decision = models.ForeignKey(
to="ImageDecision",
on_delete=models.SET_NULL,
blank=True,
null=True,
help_text="The moderation decision for this report.",
)

class Meta:
db_table = "nsfw_reports"

@property
def image_url(self):
return super().url("images")

class ImageDecision(AbstractMediaDecision):
"""Represents moderation decisions taken for images."""

media_class = Image

media_objs = models.ManyToManyField(
to="Image",
db_constraint=False,
help_text="The image items being moderated.",
)


class ImageList(AbstractMediaList):
Expand Down
Loading

0 comments on commit a759361

Please sign in to comment.