Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 55 additions & 31 deletions editorialboard/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,22 @@ class EditorialBoardMember(CommonControlField, ClusterableModel, Orderable):
Journal, related_name="editorial_board_member_journal", null=True
)
researcher = models.ForeignKey(
NewResearcher, null=True, blank=True, related_name="+", on_delete=models.SET_NULL
NewResearcher,
null=True,
blank=True,
related_name="+",
on_delete=models.SET_NULL,
)
image = models.ForeignKey(
"wagtailimages.Image",
"wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
help_text=_("Upload a profile photo of the editorial board member."),
)
area = models.TextField(null=True, blank=True)

# Manual input fields for creating/updating researcher data
manual_given_names = models.CharField(
_("Given names"),
Expand Down Expand Up @@ -116,7 +120,7 @@ class EditorialBoardMember(CommonControlField, ClusterableModel, Orderable):
null=True,
help_text=_("Enter email address"),
)

class Meta:
unique_together = [("journal", "researcher")]
indexes = [
Expand Down Expand Up @@ -165,21 +169,30 @@ def __str__(self):
if self.researcher:
return f"{self.researcher.fullname} {', '.join(self.role_names)}"
elif self.manual_given_names or self.manual_last_name:
name = f"{self.manual_given_names or ''} {self.manual_last_name or ''}".strip()
return f"{name} {', '.join(self.role_names)}" if name else "Editorial Board Member"
name = (
f"{self.manual_given_names or ''} {self.manual_last_name or ''}".strip()
)
return (
f"{name} {', '.join(self.role_names)}"
if name
else "Editorial Board Member"
)
return "Editorial Board Member"

@property
def role_names(self):
return [
role.role_name
for role in self.role_editorial_board.filter(role__role__isnull=False)
for role in self.role_editorial_board.all()
if role.role_id is not None
]

@staticmethod
def autocomplete_custom_queryset_filter(search_term):
return EditorialBoardMember.objects.filter(researcher__fullname__icontains=search_term).prefetch_related("researcher")

return EditorialBoardMember.objects.filter(
researcher__fullname__icontains=search_term
).prefetch_related("researcher")

def autocomplete_label(self):
return str(self)

Expand All @@ -194,8 +207,10 @@ def _get(
researcher=researcher,
)
if researcher and journal:
return cls.objects.get(**params)
raise ValueError("EditorialBoardMember._get requires journal and researcher and role")
return cls.objects.get(**params)
raise ValueError(
"EditorialBoardMember._get requires journal and researcher and role"
)

@classmethod
def _create(
Expand All @@ -214,21 +229,25 @@ def _create(
return obj
except IntegrityError:
return cls._get(journal, researcher)
raise ValueError("EditorialBoardMember._create requires journal and researcher and role")
raise ValueError(
"EditorialBoardMember._create requires journal and researcher and role"
)

@classmethod
def _create_or_update(
cls,
user,
journal,
researcher,
researcher,
):
if researcher and journal:
try:
return cls._get(journal, researcher)
except cls.DoesNotExist:
return cls._create(user, journal, researcher)
raise ValueError("EditorialBoardMember._create requires journal and researcher and journal")
raise ValueError(
"EditorialBoardMember._create requires journal and researcher and journal"
)

@classmethod
def create_or_update(
Expand All @@ -241,7 +260,7 @@ def create_or_update(
editorial_board_initial_year=None,
editorial_board_final_year=None,
):

role = None
if std_role or declared_role:
role = RoleModel.create_or_update(
Expand Down Expand Up @@ -275,18 +294,21 @@ def _get_journal(journal_title):
@classmethod
def get_editorial_board_with_role(cls, journal):
editorial_board_by_latest_role = {}
editorial_board_members = cls.objects.filter(journal=journal) \
.prefetch_related(
"role_editorial_board",
"researcher__orcid",
"researcher__affiliation__location"
)
editorial_board_members = cls.objects.filter(journal=journal).prefetch_related(
"role_editorial_board",
"researcher__orcid",
"researcher__affiliation__location",
)
for member in editorial_board_members:
member_role = member.role_editorial_board.filter(
role__role__std_role__isnull=False
).order_by("-initial_year").first()
member_role = (
member.role_editorial_board.filter(role__std_role__isnull=False)
.order_by("-initial_year")
.first()
)
researcher = member.researcher
editorial_board_by_latest_role[member_role.role_name].append(researcher.data)
editorial_board_by_latest_role[member_role.role_name].append(
researcher.data
)
return editorial_board_by_latest_role


Expand Down Expand Up @@ -323,7 +345,7 @@ def get(
role,
initial_year,
final_year,
):
):
params = dict(
editorial_board=editorial_board_member,
role=role,
Expand All @@ -332,16 +354,18 @@ def get(
)
if editorial_board_member and role:
return cls.objects.get(**params)
raise ValueError("RoleEditorialBoard.get requires editorial_board_member and role")

raise ValueError(
"RoleEditorialBoard.get requires editorial_board_member and role"
)

@classmethod
def create(
cls,
editorial_board_member,
role,
initial_year,
final_year,
):
):
obj = cls()
obj.editorial_board = editorial_board_member
obj.role = role
Expand All @@ -357,7 +381,7 @@ def create_or_update(
role,
initial_year,
final_year,
):
):
try:
return cls.get(editorial_board_member, role, initial_year, final_year)
except cls.DoesNotExist:
Expand Down Expand Up @@ -469,7 +493,7 @@ def _create(
obj.std_role = std_role
obj.save()
return obj
except IntegrityError as e:
except IntegrityError:
return cls.objects.get(declared_role=declared_role, std_role=std_role)

raise ValueError("RoleModel.create requires declared_role or std_role")
Expand Down
Loading