Skip to content

Commit

Permalink
enforce consistent fields in project user/author metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
Jake Rosenberg committed Nov 20, 2023
1 parent 471c8ab commit 6ecf334
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 7 deletions.
45 changes: 42 additions & 3 deletions designsafe/apps/projects/models/agave/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,20 @@
from designsafe.apps.data.models.elasticsearch import IndexedPublication, IndexedPublicationLegacy
from designsafe.libs.elasticsearch.exceptions import DocumentNotFound
logger = logging.getLogger(__name__)
user_model = get_user_model()

def get_user_info(username, role=None):
user_obj = user_model.objects.get(username=username)
user_info = {
"username": username,
"fname": user_obj.first_name,
"lname": user_obj.last_name,
"email": user_obj.email,
"inst": user_obj.profile.institution,
}
if role:
user_info["role"] = role
return user_info


class RelatedEntity(MetadataModel):
Expand Down Expand Up @@ -78,9 +92,11 @@ class Project(MetadataModel):
team_members = fields.ListField('Team Members')
guest_members = fields.ListField('Guest Members')
co_pis = fields.ListField('Co PIs')
users = fields.ListField('Users')
project_type = fields.CharField('Project Type', max_length=255, default=None)
data_type = fields.CharField('Data Type', max_length=255, default='')
team_order = fields.ListField('Team Order')
authors = fields.ListField('Authors')
project_id = fields.CharField('Project Id')
description = fields.CharField('Description', max_length=1024, default='')
title = fields.CharField('Title', max_length=255, default='')
Expand Down Expand Up @@ -199,12 +215,35 @@ def add_admin(self, username):
systemId=self.system,
body={'username': username, 'role': 'USER'})

def save(self, ag):
def save(self, agave_client):
if self.uuid:
prj = self.manager().get(ag, self.uuid)
prj = self.manager().get(agave_client, self.uuid)
if prj.project_id and prj.project_id != 'None':
self.project_id = prj.project_id
super(Project, self).save(ag)

_users = []
_users.append(get_user_info(self.pi, "pi"))
for co_pi in self.co_pis:
_users.append(get_user_info(co_pi, "co_pi"))
for team_member in self.team_members:
_users.append(get_user_info(team_member, "team_member"))
for guest_member in self.guest_members:
_users.append({**guest_member, "username": guest_member["user"], "role": "guest"})

_team_order = getattr(self, 'team_order', [])
_authors = []
for author in sorted(_team_order, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["user"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})

self.users = _users
if len(_authors):
self.authors = _authors


return super(Project, self).save(agave_client)

def related_entities(self, offset=0, limit=100):
from designsafe.apps.projects.models.utils import lookup_model
Expand Down
12 changes: 11 additions & 1 deletion designsafe/apps/projects/models/agave/experimental.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import six
from designsafe.apps.data.models.agave.base import Model as MetadataModel
from designsafe.apps.data.models.agave import fields
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project, get_user_info

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -100,6 +100,16 @@ def to_datacite_json(self):
del attributes['relatedIdentifiers']

return attributes

def save(self, agave_client):
_authors = []
for author in sorted(self.authors, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["name"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})
self.authors = _authors
return super(Experiment, self).save(agave_client)

def to_dataset_json(self):
"""Serialize object to dataset JSON."""
Expand Down
12 changes: 11 additions & 1 deletion designsafe/apps/projects/models/agave/hybrid_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import six
from designsafe.apps.data.models.agave.base import Model as MetadataModel
from designsafe.apps.data.models.agave import fields
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project, get_user_info

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -73,6 +73,16 @@ class HybridSimulation(RelatedEntity):
project = fields.RelatedObjectField(HybridSimulationProject)
dois = fields.ListField('Dois')

def save(self, agave_client):
_authors = []
for author in sorted(self.authors, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["name"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})
self.authors = _authors
return super().save(agave_client)

def to_datacite_json(self):
"""Serialize object to datacite JSON."""
attributes = super(HybridSimulation, self).to_datacite_json()
Expand Down
62 changes: 61 additions & 1 deletion designsafe/apps/projects/models/agave/rapid.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import json
from designsafe.apps.data.models.agave.base import Model as MetadataModel
from designsafe.apps.data.models.agave import fields
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project, get_user_info

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -76,6 +76,16 @@ class Mission(RelatedEntity):
project = fields.RelatedObjectField(FieldReconProject)
dois = fields.ListField('Dois')

def save(self, agave_client):
_authors = []
for author in sorted(self.authors, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["name"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})
self.authors = _authors
return super().save(agave_client)

def to_datacite_json(self):
"""Serialize object to datacite JSON."""
attributes = super(Mission, self).to_datacite_json()
Expand Down Expand Up @@ -151,6 +161,16 @@ class Collection(RelatedEntity):
files = fields.RelatedObjectField(FileModel, multiple=True)
file_tags = fields.ListField('File Tags', list_cls=DataTag)

def save(self, agave_client):
_data_collectors = []
for author in sorted(self.data_collectors, key=lambda u: u["order"]):
if author.get("guest", False):
_data_collectors.append({**author, "role": "guest", "username": author["name"]})
else:
_data_collectors.append({**author, **get_user_info(author["name"], "team_member")})
self.data_collectors = _data_collectors
return super().save(agave_client)

class SocialScience(RelatedEntity):
model_name = 'designsafe.project.field_recon.social_science'
title = fields.CharField('Title', max_length=1024)
Expand All @@ -173,6 +193,16 @@ class SocialScience(RelatedEntity):
files = fields.RelatedObjectField(FileModel, multiple=True)
file_tags = fields.ListField('File Tags', list_cls=DataTag)

def save(self, agave_client):
_data_collectors = []
for author in sorted(self.data_collectors, key=lambda u: u["order"]):
if author.get("guest", False):
_data_collectors.append({**author, "role": "guest", "username": author["name"]})
else:
_data_collectors.append({**author, **get_user_info(author["name"], "team_member")})
self.data_collectors = _data_collectors
return super().save(agave_client)

class Planning(RelatedEntity):
model_name = 'designsafe.project.field_recon.planning'
title = fields.CharField('Title', max_length=1024)
Expand All @@ -184,6 +214,16 @@ class Planning(RelatedEntity):
files = fields.RelatedObjectField(FileModel, multiple=True)
file_tags = fields.ListField('File Tags', list_cls=DataTag)

def save(self, agave_client):
_data_collectors = []
for author in sorted(self.data_collectors, key=lambda u: u["order"]):
if author.get("guest", False):
_data_collectors.append({**author, "role": "guest", "username": author["name"]})
else:
_data_collectors.append({**author, **get_user_info(author["name"], "team_member")})
self.data_collectors = _data_collectors
return super().save(agave_client)

class Geoscience(RelatedEntity):
model_name = 'designsafe.project.field_recon.geoscience'
title = fields.CharField('Title', max_length=1024)
Expand All @@ -202,6 +242,16 @@ class Geoscience(RelatedEntity):
files = fields.RelatedObjectField(FileModel, multiple=True)
file_tags = fields.ListField('File Tags', list_cls=DataTag)

def save(self, agave_client):
_data_collectors = []
for author in sorted(self.data_collectors, key=lambda u: u["order"]):
if author.get("guest", False):
_data_collectors.append({**author, "role": "guest", "username": author["name"]})
else:
_data_collectors.append({**author, **get_user_info(author["name"], "team_member")})
self.data_collectors = _data_collectors
return super().save(agave_client)

class Report(RelatedEntity):
model_name = 'designsafe.project.field_recon.report'
title = fields.CharField('Title', max_length=1024)
Expand All @@ -214,6 +264,16 @@ class Report(RelatedEntity):
file_tags = fields.ListField('File Tags', list_cls=DataTag)
dois = fields.ListField('Dois')

def save(self, agave_client):
_authors = []
for author in sorted(self.authors, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["name"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})
self.authors = _authors
return super().save(agave_client)

def to_datacite_json(self):
"""Serialize object to datacite JSON."""
attributes = super(Report, self).to_datacite_json()
Expand Down
12 changes: 11 additions & 1 deletion designsafe/apps/projects/models/agave/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import six
from designsafe.apps.data.models.agave.base import Model as MetadataModel
from designsafe.apps.data.models.agave import fields
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project
from designsafe.apps.projects.models.agave.base import RelatedEntity, Project, get_user_info

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -57,6 +57,16 @@ class Simulation(RelatedEntity):
project = fields.RelatedObjectField(SimulationProject)
dois = fields.ListField('Dois')

def save(self, agave_client):
_authors = []
for author in sorted(self.authors, key=lambda u: u["order"]):
if author.get("guest", False):
_authors.append({**author, "role": "guest", "username": author["name"]})
else:
_authors.append({**author, **get_user_info(author["name"], "team_member")})
self.authors = _authors
return super().save(agave_client)

def to_datacite_json(self):
"""Serialize object to datacite JSON."""
attributes = super(Simulation, self).to_datacite_json()
Expand Down

0 comments on commit 6ecf334

Please sign in to comment.