def collection_dump(user, identifier, stream=None, prefix=None): # export collection collection = filter_by_access(user, Collection).get(id=identifier) # export collection items and records collectionitems = list( CollectionItem.objects .select_related('record', 'collection') .filter(collection__id=identifier) ) ids = [collectionitem.record_id for collectionitem in collectionitems] records = list(Record.filter_by_access(user, *ids).filter(owner=None)) ids = [record.id for record in records] collectionitems = [collectionitem for collectionitem in collectionitems if collectionitem.record_id in ids] # export all fieldvalues fieldvalues = FieldValue.objects.select_related('record', 'field').filter( record__id__in=ids) used_fields = set(fieldvalue.field_id for fieldvalue in fieldvalues) # export all used fields fields = list(Field.objects.filter(id__in=used_fields).distinct()) # export equivalent fields more = True while more: eq_ids = set( id for field in fields for id in field.equivalent.values_list('id', flat=True) if id not in used_fields ) more = len(eq_ids) > 0 if more: eq_fields = Field.objects.filter(id__in=eq_ids) fields.extend(eq_fields) used_fields = used_fields.union(eq_ids) # export all used standards standards = MetadataStandard.objects.filter(id__in=set( field.standard_id for field in fields if field.standard_id )) objects = [collection] objects.extend(standards) objects.extend(fields) objects.extend(collectionitem.record for collectionitem in collectionitems) objects.extend(collectionitems) objects.extend(fieldvalues) serializer = RenamingSerializer(prefix) kwargs = dict() if stream: kwargs['stream'] = stream return serializer.serialize(objects, use_natural_keys=True, **kwargs)
def checkAccess(self, record, reader, writer, manager, owner, admin, user=False): self.assertEqual( reader, Record.filter_by_access(self.collectionreader, record.id).count() == 1) self.assertEqual( writer, Record.filter_by_access(self.collectionwriter, record.id).count() == 1) self.assertEqual( manager, Record.filter_by_access(self.collectionmanager, record.id).count() == 1) self.assertEqual( owner, Record.filter_by_access(self.owner, record.id).count() == 1) self.assertEqual( admin, Record.filter_by_access(self.admin, record.id).count() == 1) self.assertEqual( user, Record.filter_by_access(self.user, record.id).count() == 1)
def checkAccess(self, record, reader, writer, manager, owner, admin, user=False): self.assertEqual(reader, Record.filter_by_access(self.collectionreader, record.id).count() == 1) self.assertEqual(writer, Record.filter_by_access(self.collectionwriter, record.id).count() == 1) self.assertEqual(manager, Record.filter_by_access(self.collectionmanager, record.id).count() == 1) self.assertEqual(owner, Record.filter_by_access(self.owner, record.id).count() == 1) self.assertEqual(admin, Record.filter_by_access(self.admin, record.id).count() == 1) self.assertEqual(user, Record.filter_by_access(self.user, record.id).count() == 1)