diff --git a/designsafe/apps/projects/models/agave/base.py b/designsafe/apps/projects/models/agave/base.py index 8bbd1a813c..4d2c3037ce 100644 --- a/designsafe/apps/projects/models/agave/base.py +++ b/designsafe/apps/projects/models/agave/base.py @@ -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): @@ -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='') @@ -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 diff --git a/designsafe/apps/projects/models/agave/experimental.py b/designsafe/apps/projects/models/agave/experimental.py index cdba8797fb..f05a24ac60 100644 --- a/designsafe/apps/projects/models/agave/experimental.py +++ b/designsafe/apps/projects/models/agave/experimental.py @@ -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__) @@ -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.""" diff --git a/designsafe/apps/projects/models/agave/hybrid_simulation.py b/designsafe/apps/projects/models/agave/hybrid_simulation.py index 24244e4289..b970348304 100644 --- a/designsafe/apps/projects/models/agave/hybrid_simulation.py +++ b/designsafe/apps/projects/models/agave/hybrid_simulation.py @@ -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__) @@ -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() diff --git a/designsafe/apps/projects/models/agave/rapid.py b/designsafe/apps/projects/models/agave/rapid.py index d626cb5d25..a769fcb66e 100644 --- a/designsafe/apps/projects/models/agave/rapid.py +++ b/designsafe/apps/projects/models/agave/rapid.py @@ -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__) @@ -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() @@ -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) @@ -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) @@ -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) @@ -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) @@ -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() diff --git a/designsafe/apps/projects/models/agave/simulation.py b/designsafe/apps/projects/models/agave/simulation.py index a9227b98c4..313debd8e5 100644 --- a/designsafe/apps/projects/models/agave/simulation.py +++ b/designsafe/apps/projects/models/agave/simulation.py @@ -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__) @@ -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()