def get_current_organisation(): """Return current organisation from context.""" if has_request_context() and not hasattr(_request_ctx_stack.top, 'organisation_record'): ctx = _request_ctx_stack.top ctx.organisation_record = None if ( not current_user_record or not current_user_record.get('organisation') ) else OrganisationRecord.get_record_by_ref_link( current_user_record['organisation']['$ref']) return getattr(_request_ctx_stack.top, 'organisation_record', None)
def guess_organisation(self, data, **kwargs): """Guess organisation from current logged user. :param data: Dict of record data. :returns: Modified dict of record data. """ # Organisation already attached to document, we do nothing. if data.get('organisation'): return data # Store current user organisation in new document. if current_user_record.get('organisation'): data['organisation'] = [current_user_record['organisation']] return data
def guess_organisation(self, data, **kwargs): """Guess organisation from current logged user. :param dict data: Record data :return: Modified data :rtype: dict """ # Organisation already attached to project, we do nothing. if data.get('organisation'): return data # Store current user organisation in new project. if current_user_record.get('organisation'): data['organisation'] = current_user_record['organisation'] return data
def create(cls, data, id_=None, dbcommit=False, with_bucket=True, **kwargs): """Create deposit record.""" if not data.get('diffusion', {}).get('subdivisions'): # Guess from submitter if ( current_user_record and current_user_record.is_submitter and current_user_record.get('subdivision') ): data.setdefault('diffusion', {})['subdivisions'] = [current_user_record['subdivision']] record = super(DepositRecord, cls).create(data, id_=id_, dbcommit=dbcommit, with_bucket=with_bucket, **kwargs) return record
def create_document(self): """Create document from deposit.""" metadata = {} # Organisation if current_user_record and current_user_record.get('organisation'): metadata['organisation'] = [current_user_record['organisation']] # Document type metadata['documentType'] = self['metadata']['documentType'] # Language language = self['metadata'].get('language', 'eng') # Title metadata['title'] = [{ 'type': 'bf:Title', 'mainTitle': [{ 'language': language, 'value': self['metadata']['title'] }] }] # Subtitle if self['metadata'].get('subtitle'): metadata['title'][0]['subtitle'] = [{ 'language': language, 'value': self['metadata']['subtitle'] }] # Other title if self['metadata'].get('otherLanguageTitle', {}).get('title'): metadata['title'][0]['mainTitle'].append({ 'language': self['metadata']['otherLanguageTitle'].get( 'language', language), 'value': self['metadata']['otherLanguageTitle']['title'] }) # Languages metadata['language'] = [{'value': language, 'type': 'bf:Language'}] # Document date metadata['provisionActivity'] = [{ 'type': 'bf:Publication', 'startDate': self['metadata']['documentDate'] }] metadata['provisionActivity'][0]['statement'] = [] # Publication place if self['metadata'].get('publicationPlace'): metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['publicationPlace'] }], 'type': 'bf:Place' }) # Publisher if self['metadata'].get('publisher'): metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['publisher'] }], 'type': 'bf:Agent' }) # Add a statement for date metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['documentDate'] }], 'type': 'Date' }) # Published in if self['metadata'].get('publication'): part_of = { 'numberingYear': self['metadata']['publication']['year'], 'document': { 'title': self['metadata']['publication']['publishedIn'] } } if self['metadata']['publication'].get('pages'): part_of['numberingPages'] = self['metadata']['publication'][ 'pages'] if self['metadata']['publication'].get('volume'): part_of['numberingVolume'] = self['metadata']['publication'][ 'volume'] if self['metadata']['publication'].get('number'): part_of['numberingIssue'] = self['metadata']['publication'][ 'number'] if self['metadata']['publication'].get('editors'): part_of['document']['contribution'] = self['metadata'][ 'publication']['editors'] if self['metadata']['publication'].get('publisher'): part_of['document']['publication'] = { 'statement': self['metadata']['publication']['publisher'] } metadata['partOf'] = [part_of] # Other electronic versions if self['metadata'].get('otherElectronicVersions'): metadata['otherEdition'] = [{ 'document': { 'electronicLocator': link['url'] }, 'publicNote': link['publicNote'] } for link in self['metadata']['otherElectronicVersions']] # Specific collections if self['metadata'].get('specificCollections'): metadata['specificCollections'] = self['metadata'][ 'specificCollections'] # Classification if self['metadata'].get('classification'): metadata['classification'] = [{ 'type': 'bf:ClassificationUdc', 'classificationPortion': self['metadata']['classification'] }] # Abstracts if self['metadata'].get('abstracts'): metadata['abstracts'] = [{ 'language': abstract.get('language', language), 'value': abstract['abstract'] } for abstract in self['metadata']['abstracts']] # Dissertation if self['metadata'].get('dissertation'): metadata['dissertation'] = self['metadata']['dissertation'] # Subjects if self['metadata'].get('subjects'): metadata['subjects'] = [{ 'label': { 'language': subject.get('language', language), 'value': subject['subjects'] } } for subject in self['metadata']['subjects']] # Identifiers identifiers = [] if self['metadata'].get('identifiedBy'): for identifier in self['metadata']['identifiedBy']: data = { 'type': identifier['type'], 'value': identifier['value'], } if identifier.get('source'): data['source'] = identifier['source'] # Special for PMID if identifier['type'] == 'pmid': data['source'] = 'PMID' data['type'] = 'bf:Local' identifiers.append(data) if identifiers: metadata['identifiedBy'] = identifiers # Contributors contributors = [] for contributor in self.get('contributors', []): data = { 'agent': { 'type': 'bf:Person', 'preferred_name': contributor['name'] }, 'role': [contributor['role']] } if contributor.get('affiliation'): data['affiliation'] = contributor['affiliation'] # ORCID for contributor if contributor.get('orcid'): data['agent']['identifiedBy'] = { 'type': 'bf:Local', 'source': 'ORCID', 'value': contributor['orcid'] } contributors.append(data) if contributors: metadata['contribution'] = contributors # Projects if self.get('projects'): projects = [] for project in self['projects']: # Create a new project if not project.get('$ref'): data = project.copy() # Store user data['user'] = self['user'] # Store organisation data['organisation'] = current_user_record['organisation'] # Project identifier if project.get('identifier'): data['identifiedBy'] = { 'type': 'bf:Identifier', 'value': project['identifier'] } data.pop('identifier') # Investigators if project.get('investigators'): data['investigators'] = [] for investigator in project['investigators']: investigator_data = { 'agent': { 'preferred_name': investigator['name'] }, 'role': [investigator['role']], } if investigator.get('affiliation'): investigator_data[ 'affiliation'] = investigator.get( 'affiliation') if investigator.get('orcid'): investigator_data['identifiedBy'] = { 'type': 'bf:Local', 'source': 'ORCID', 'value': investigator.get('orcid') } data['investigators'].append(investigator_data) # Funding organisations if project.get('funding_organisations'): data['funding_organisations'] = [] for funding_organisation in project[ 'funding_organisations']: funding_organisation_data = { 'agent': { 'preferred_name': funding_organisation['name'] } } if funding_organisation.get('identifier'): funding_organisation_data['identifiedBy'] = { 'type': 'bf:Identifier', 'value': funding_organisation['identifier'] } data['funding_organisations'].append( funding_organisation_data) project_record = ProjectRecord.create(data, dbcommit=True) project_record.reindex() project = { '$ref': project_record.get_ref_link('projects', project_record['pid']) } projects.append(project) if projects: metadata['projects'] = projects # License metadata['usageAndAccessPolicy'] = { 'license': self['diffusion']['license'] } document = DocumentRecord.create(metadata, dbcommit=True, with_bucket=True) current_order = 2 for file in self.files: with file.file.storage().open() as pdf_file: content = pdf_file.read() if file.get('category', 'main') == 'main': order = 1 else: order = current_order current_order += 1 kwargs = { 'label': file.get('label', file['key']), 'order': order } if file.get('embargo', False) and file.get('embargoDate'): kwargs['access'] = 'coar:c_f1cf' # Embargoed access kwargs['embargo_date'] = file['embargoDate'] kwargs['restricted_outside_organisation'] = file.get( 'exceptInOrganisation', False) document.add_file(content, file['key'], **kwargs) document.commit() document.reindex() self['document'] = { '$ref': DocumentRecord.get_ref_link('documents', document['pid']) } return document
def create_document(self): """Create document from deposit.""" metadata = {} # Organisation if current_user_record and current_user_record.get('organisation'): metadata['organisation'] = current_user_record['organisation'] # Document type metadata['documentType'] = self['metadata']['documentType'] # Language language = self['metadata'].get('language', 'eng') # Title metadata['title'] = [{ 'type': 'bf:Title', 'mainTitle': [{ 'language': language, 'value': self['metadata']['title'] }] }] # Subtitle if self['metadata'].get('subtitle'): metadata['title'][0]['subtitle'] = [{ 'language': language, 'value': self['metadata']['subtitle'] }] # Other title if self['metadata'].get('otherLanguageTitle', {}).get('title'): metadata['title'][0]['mainTitle'].append({ 'language': self['metadata']['otherLanguageTitle'].get( 'language', language), 'value': self['metadata']['otherLanguageTitle']['title'] }) # Languages metadata['language'] = [{'value': language, 'type': 'bf:Language'}] # Document date if self['metadata'].get('documentDate'): metadata['provisionActivity'] = [{ 'type': 'bf:Publication', 'startDate': self['metadata']['documentDate'] }] # Published in if self['metadata'].get('publication'): part_of = { 'numberingYear': self['metadata']['publication']['year'], 'document': { 'title': self['metadata']['publication']['publishedIn'] } } if self['metadata']['publication'].get('pages'): part_of['numberingPages'] = self['metadata']['publication'][ 'pages'] if self['metadata']['publication'].get('volume'): part_of['numberingVolume'] = self['metadata']['publication'][ 'volume'] if self['metadata']['publication'].get('number'): part_of['numberingIssue'] = self['metadata']['publication'][ 'number'] if self['metadata']['publication'].get('editors'): part_of['document']['contribution'] = self['metadata'][ 'publication']['editors'] if self['metadata']['publication'].get('publisher'): part_of['document']['publication'] = { 'statement': self['metadata']['publication']['publisher'] } metadata['partOf'] = [part_of] # Other electronic versions if self['metadata'].get('otherElectronicVersions'): metadata['otherEdition'] = [{ 'document': { 'electronicLocator': link['url'] }, 'publicNote': link['publicNote'] } for link in self['metadata']['otherElectronicVersions']] # Specific collections if self['metadata'].get('specificCollections'): metadata['specificCollections'] = self['metadata'][ 'specificCollections'] # Classification if self['metadata'].get('classification'): metadata['classification'] = [{ 'type': 'bf:ClassificationUdc', 'classificationPortion': self['metadata']['classification'] }] # Abstracts if self['metadata'].get('abstracts'): metadata['abstracts'] = [{ 'language': abstract.get('language', language), 'value': abstract['abstract'] } for abstract in self['metadata']['abstracts']] # Subjects if self['metadata'].get('subjects'): metadata['subjects'] = [{ 'label': { 'language': subject.get('language', language), 'value': subject['subjects'] } } for subject in self['metadata']['subjects']] # Contributors contributors = [] for contributor in self['contributors']: data = { 'agent': { 'type': 'bf:Person', 'preferred_name': contributor['name'] }, 'role': [contributor['role']], 'affiliation': contributor.get('affiliation') } # ORCID for contributor if contributor.get('orcid'): data['agent']['identifiedBy'] = { 'type': 'bf:Doi', 'source': 'ORCID', 'value': contributor['orcid'] } # Resolve controlled affiliations if data.get('affiliation'): affiliations = DocumentRecord.get_affiliations( data['affiliation']) if affiliations: data['controlledAffiliation'] = affiliations else: data.pop('affiliation', None) contributors.append(data) if contributors: metadata['contribution'] = contributors document = DocumentRecord.create(metadata, dbcommit=True, with_bucket=True) current_order = 2 for file in self.files: with file.file.storage().open() as pdf_file: content = pdf_file.read() if file.get('category', 'main') == 'main': order = 1 else: order = current_order current_order += 1 kwargs = { 'label': file.get('label', file['key']), 'order': order } if file.get('embargo', False) and file.get('embargoDate'): kwargs['embargo_date'] = file['embargoDate'] if file.get('exceptInOrganisation'): kwargs['restricted'] = 'organisation' document.add_file(content, file['key'], **kwargs) document.commit() document.reindex() self['document'] = { '$ref': DocumentRecord.get_ref_link('documents', document['pid']) } return document
def create_document(self): """Create document from deposit.""" # TODO : Do this whole process with a marshmallow schema serializer. metadata = {} # Organisation if current_user_record and current_user_record.get('organisation'): metadata['organisation'] = [current_user_record['organisation']] # Document type metadata['documentType'] = self['metadata']['documentType'] # Language language = self['metadata'].get('language', 'eng') # Title metadata['title'] = [{ 'type': 'bf:Title', 'mainTitle': [{ 'language': language, 'value': self['metadata']['title'] }] }] # Subtitle if self['metadata'].get('subtitle'): metadata['title'][0]['subtitle'] = [{ 'language': language, 'value': self['metadata']['subtitle'] }] # Other title if self['metadata'].get('otherLanguageTitle', {}).get('title'): metadata['title'][0]['mainTitle'].append({ 'language': self['metadata']['otherLanguageTitle'].get( 'language', language), 'value': self['metadata']['otherLanguageTitle']['title'] }) # Languages metadata['language'] = [{'value': language, 'type': 'bf:Language'}] # Document date metadata['provisionActivity'] = [{ 'type': 'bf:Publication', 'startDate': self['metadata']['documentDate'] }] metadata['provisionActivity'][0]['statement'] = [] # Publication place if self['metadata'].get('publicationPlace'): metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['publicationPlace'] }], 'type': 'bf:Place' }) # Publisher if self['metadata'].get('publisher'): metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['publisher'] }], 'type': 'bf:Agent' }) # Add a statement for date metadata['provisionActivity'][0]['statement'].append({ 'label': [{ 'value': self['metadata']['statementDate'] if self['metadata'].get('statementDate') else self['metadata']['documentDate'] }], 'type': 'Date' }) # Published in if self['metadata'].get('publication'): year = self['metadata']['publication']['year'] if self['metadata'][ 'publication'].get( 'year') else self['metadata']['documentDate'] part_of = { 'numberingYear': year, 'document': { 'title': self['metadata']['publication']['publishedIn'] } } if self['metadata']['publication'].get('pages'): part_of['numberingPages'] = self['metadata']['publication'][ 'pages'] if self['metadata']['publication'].get('volume'): part_of['numberingVolume'] = self['metadata']['publication'][ 'volume'] if self['metadata']['publication'].get('number'): part_of['numberingIssue'] = self['metadata']['publication'][ 'number'] if self['metadata']['publication'].get('editors'): part_of['document']['contribution'] = self['metadata'][ 'publication']['editors'] if self['metadata']['publication'].get('publisher'): part_of['document']['publication'] = { 'statement': self['metadata']['publication']['publisher'] } if self['metadata']['publication'].get('identifiedBy'): part_of['document']['identifiedBy'] = self['metadata'][ 'publication']['identifiedBy'] metadata['partOf'] = [part_of] # Other electronic versions if self['metadata'].get('otherElectronicVersions'): metadata['otherEdition'] = [{ 'document': { 'electronicLocator': link['url'] }, 'publicNote': link['publicNote'] } for link in self['metadata']['otherElectronicVersions']] # Collections if self['metadata'].get('collections'): collections = [] for collection in self['metadata'].get('collections'): # Create a new project if not collection.get('$ref'): data = collection.copy() # Store organisation data['organisation'] = current_user_record['organisation'] collection_record = CollectionRecord.create(data) collection_record.reindex() collection = { '$ref': SonarRecord.get_ref_link('collections', collection_record['pid']) } collections.append(collection) if collections: metadata['collections'] = collections # Classification if self['metadata'].get('classification'): metadata['classification'] = [{ 'type': 'bf:ClassificationUdc', 'classificationPortion': self['metadata']['classification'] }] # Abstracts if self['metadata'].get('abstracts'): metadata['abstracts'] = [{ 'language': abstract.get('language', language), 'value': abstract['abstract'] } for abstract in self['metadata']['abstracts']] # Dissertation if self['metadata'].get('dissertation'): metadata['dissertation'] = self['metadata']['dissertation'] # Subjects if self['metadata'].get('subjects'): metadata['subjects'] = [{ 'label': { 'language': subject.get('language', language), 'value': subject['subjects'] } } for subject in self['metadata']['subjects']] # Identifiers identifiers = [] if self['metadata'].get('identifiedBy'): for identifier in self['metadata']['identifiedBy']: data = { 'type': identifier['type'], 'value': identifier['value'], } if identifier.get('source'): data['source'] = identifier['source'] # Special for PMID if identifier['type'] == 'pmid': data['source'] = 'PMID' data['type'] = 'bf:Local' identifiers.append(data) if identifiers: metadata['identifiedBy'] = identifiers # Content note if self['metadata'].get('contentNote'): metadata['contentNote'] = self['metadata']['contentNote'] # Extent if self['metadata'].get('extent'): metadata['extent'] = self['metadata']['extent'] # Additional materials if self['metadata'].get('additionalMaterials'): metadata['additionalMaterials'] = self['metadata'][ 'additionalMaterials'] # Formats if self['metadata'].get('formats'): metadata['formats'] = self['metadata']['formats'] # Other material characteristics if self['metadata'].get('otherMaterialCharacteristics'): metadata['otherMaterialCharacteristics'] = self['metadata'][ 'otherMaterialCharacteristics'] # Edition statement if self['metadata'].get('editionStatement'): metadata['editionStatement'] = self['metadata']['editionStatement'] # Notes if self['metadata'].get('notes'): metadata['notes'] = self['metadata']['notes'] # Series if self['metadata'].get('series'): metadata['series'] = self['metadata']['series'] # Custom fields for field_number in range(1, 4): field = f'customField{field_number}' document_field = self['metadata'].get(field) if document_field: metadata[field] = document_field # Contributors contributors = [] for contributor in self.get('contributors', []): data = { 'agent': { 'type': 'bf:Person', 'preferred_name': contributor['name'] }, 'role': [contributor['role']] } if contributor.get('date_of_birth'): data['agent']['date_of_birth'] = contributor['date_of_birth'] if contributor.get('date_of_death'): data['agent']['date_of_death'] = contributor['date_of_death'] if contributor.get('affiliation'): data['affiliation'] = contributor['affiliation'] # ORCID for contributor if contributor.get('orcid'): data['agent']['identifiedBy'] = { 'type': 'bf:Local', 'source': 'ORCID', 'value': contributor['orcid'] } contributors.append(data) if contributors: metadata['contribution'] = contributors # Projects if self.get('projects'): projects = [] for project in self['projects']: # Create a new project if not project.get('$ref'): data = project.copy() # Store user data['user'] = self['user'] # Store organisation data['organisation'] = current_user_record['organisation'] project_record = sonar.service('projects').create( g.identity, {'metadata': data}) project = { '$ref': SonarRecord.get_ref_link('projects', project_record['id']) } projects.append(project) if projects: metadata['projects'] = projects # License metadata['usageAndAccessPolicy'] = { 'license': self['diffusion']['license'] } # Open access status if self['diffusion'].get('oa_status'): metadata['oa_status'] = self['diffusion']['oa_status'] # Subdivisions if self['diffusion'].get('subdivisions'): metadata['subdivisions'] = self['diffusion']['subdivisions'] # Masked if self['diffusion'].get('masked') is not None: metadata['masked'] = self['diffusion']['masked'] document = DocumentRecord.create(metadata, dbcommit=True, with_bucket=True) current_order = 2 for file in self.files: with file.file.storage().open() as pdf_file: content = pdf_file.read() if file.get('category', 'main') == 'main': order = 1 else: order = current_order current_order += 1 kwargs = { 'label': file.get('label', file['key']), 'order': order } if file.get('embargo', False) and file.get('embargoDate'): kwargs['access'] = 'coar:c_f1cf' # Embargoed access kwargs['embargo_date'] = file['embargoDate'] kwargs['restricted_outside_organisation'] = file.get( 'exceptInOrganisation', False) document.add_file(content, file['key'], **kwargs) document.commit() document.reindex() self['document'] = { '$ref': DocumentRecord.get_ref_link('documents', document['pid']) } return document