SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 448842f3 authored by George Katsikas's avatar George Katsikas :goat:
Browse files

create red flags model

parent f147a30f
No related branches found
No related tags found
No related merge requests found
...@@ -3,8 +3,10 @@ __license__ = "AGPL v3" ...@@ -3,8 +3,10 @@ __license__ = "AGPL v3"
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.forms import ChoiceField
from .models import CompetingInterest from .models import CompetingInterest, RedFlag
class CompetingInterestAdmin(admin.ModelAdmin): class CompetingInterestAdmin(admin.ModelAdmin):
...@@ -34,3 +36,35 @@ class CompetingInterestAdmin(admin.ModelAdmin): ...@@ -34,3 +36,35 @@ class CompetingInterestAdmin(admin.ModelAdmin):
admin.site.register(CompetingInterest, CompetingInterestAdmin) admin.site.register(CompetingInterest, CompetingInterestAdmin)
class ConcerningObjectExistingFilter(admin.SimpleListFilter):
title = "concerning object type"
parameter_name = "concerning_object_type"
def lookups(self, request, model_admin):
return [
(ct, ContentType.objects.get(id=ct).name.title())
for ct in model_admin.model.objects.values_list(
"concerning_object_type", flat=True
).distinct()
]
def queryset(self, request, queryset):
if self.value():
return queryset.filter(concerning_object_type=self.value())
else:
return queryset
@admin.register(RedFlag)
class RedFlagAdmin(admin.ModelAdmin):
search_fields = ("concerning_object_id", "raised_by__last_name")
list_filter = ["resolved", ConcerningObjectExistingFilter]
list_display = (
"concerning_object",
"raised_by",
"description",
"raised_on",
"resolved",
)
# Generated by Django 3.2.18 on 2023-10-26 13:59
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('scipost', '0040_auto_20210310_2026'),
('ethics', '0003_auto_20230119_1520'),
]
operations = [
migrations.CreateModel(
name='RedFlag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('concerning_object_id', models.PositiveIntegerField()),
('description', models.TextField(blank=True)),
('raised_on', models.DateField(default=django.utils.timezone.now)),
('resolved', models.BooleanField(default=False)),
('concerning_object_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
('raised_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='red_flags_raised', to='scipost.contributor')),
],
),
]
...@@ -2,6 +2,8 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" ...@@ -2,6 +2,8 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3" __license__ = "AGPL v3"
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
...@@ -122,3 +124,24 @@ class CompetingInterest(models.Model): ...@@ -122,3 +124,24 @@ class CompetingInterest(models.Model):
def __str__(self): def __str__(self):
return f"{self.profile} - {self.related_profile} ({self.get_nature_display()})" return f"{self.profile} - {self.related_profile} ({self.get_nature_display()})"
class RedFlag(models.Model):
concerning_object_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
concerning_object_id = models.PositiveIntegerField()
concerning_object = GenericForeignKey(
"concerning_object_type", "concerning_object_id"
)
description = models.TextField(blank=True)
raised_by = models.ForeignKey(
"scipost.Contributor",
on_delete=models.CASCADE,
related_name="red_flags_raised",
)
raised_on = models.DateField(default=timezone.now)
resolved = models.BooleanField(default=False)
def __str__(self):
return f"Red flag for {self.concerning_object} raised by {self.raised_by.profile} on {self.raised_on}"
...@@ -3,6 +3,7 @@ __license__ = "AGPL v3" ...@@ -3,6 +3,7 @@ __license__ = "AGPL v3"
import datetime import datetime
from django.contrib.contenttypes.fields import GenericRelation
from django.db.models import Q from django.db.models import Q
from django.urls import reverse from django.urls import reverse
...@@ -79,6 +80,13 @@ class Profile(models.Model): ...@@ -79,6 +80,13 @@ class Profile(models.Model):
accepts_SciPost_emails = models.BooleanField(default=True) accepts_SciPost_emails = models.BooleanField(default=True)
accepts_refereeing_requests = models.BooleanField(default=True) accepts_refereeing_requests = models.BooleanField(default=True)
red_flags = GenericRelation(
"ethics.RedFlag",
object_id_field="concerning_object_id",
content_type_field="concerning_object_type",
related_query_name="profile",
)
objects = ProfileQuerySet.as_manager() objects = ProfileQuerySet.as_manager()
class Meta: class Meta:
......
...@@ -399,6 +399,13 @@ class Submission(models.Model): ...@@ -399,6 +399,13 @@ class Submission(models.Model):
# Temporary # Temporary
invitation_order = models.IntegerField(default=0) invitation_order = models.IntegerField(default=0)
red_flags = GenericRelation(
"ethics.RedFlag",
object_id_field="concerning_object_id",
content_type_field="concerning_object_type",
related_query_name="submission",
)
class Meta: class Meta:
app_label = "submissions" app_label = "submissions"
ordering = ["-submission_date"] ordering = ["-submission_date"]
......
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