diff --git a/tom_targets/sharing.py b/tom_targets/sharing.py index 8dea14260..8f9b3a311 100644 --- a/tom_targets/sharing.py +++ b/tom_targets/sharing.py @@ -1,10 +1,11 @@ +from tom_targets.base_models import get_target_model_app_label, BaseTarget import requests from django.conf import settings from django.core.exceptions import ImproperlyConfigured from tom_targets.serializers import TargetSerializer -from tom_targets.models import PersistentShare +from tom_targets.models import PersistentShare, get_target_model_class from tom_dataproducts.sharing import (share_data_with_tom, get_destination_target, sharing_feedback_converter) @@ -37,6 +38,20 @@ def continuous_share_data(target, reduced_datums): share_data_with_tom(share_destination, None, None, None, selected_data=reduced_datum_pks) +def custom_target_to_extras(target_id) -> list[dict]: + target_app_label = get_target_model_app_label() + extra_fields = [] + if target_app_label != 'tom_targets': + target = get_target_model_class().objects.get(pk=target_id) + for field in target._meta.get_fields(): + if field not in BaseTarget._meta.get_fields() and field.name not in ['id', 'basetarget_ptr']: + value = getattr(target, field.name, None) + if value is not None: + extra_fields.append({'key': field.name, 'value': str(value)}) + + return extra_fields + + def share_target_with_tom(share_destination, form_data, target_lists=()): """ Share a target with a remote TOM. @@ -76,6 +91,11 @@ def share_target_with_tom(share_destination, form_data, target_lists=()): if destination_target_id is None: # If target is not in Destination, serialize and create new target. serialized_target = TargetSerializer(form_data['target']).data + # If the shared target is a custom model custom fields should still be shared. + # Because the destination TOM might not have the same fields, we convert them to + # target extras. + extra_extras = custom_target_to_extras(serialized_target['id']) + serialized_target['targetextra_set'].extend(extra_extras) # Remove local User Groups serialized_target['groups'] = [] # Add target lists diff --git a/tom_targets/templates/tom_targets/target_share.html b/tom_targets/templates/tom_targets/target_share.html index e191afcf2..de771fa00 100644 --- a/tom_targets/templates/tom_targets/target_share.html +++ b/tom_targets/templates/tom_targets/target_share.html @@ -23,7 +23,7 @@

Share {{ tar
- diff --git a/tom_targets/templatetags/targets_extras.py b/tom_targets/templatetags/targets_extras.py index 0f1effe49..3daa97322 100644 --- a/tom_targets/templatetags/targets_extras.py +++ b/tom_targets/templatetags/targets_extras.py @@ -21,7 +21,7 @@ from tom_observations.utils import get_sidereal_visibility from tom_targets.base_models import BaseTarget -from tom_targets.models import Target, TargetExtra, TargetList +from tom_targets.models import Target, TargetExtra, TargetList, PersistentShare from tom_targets.forms import TargetVisibilityForm, PersistentShareForm from tom_targets.permissions import targets_for_user @@ -473,10 +473,10 @@ def persistent_share_table(context, target): Returns a partial for a table of persistent shares, used in persistent share management forms """ request = context['request'] - persistentshares = get_objects_for_user(request.user, f'{Target._meta.app_label}.view_persistentshare') + persistentshares = get_objects_for_user(request.user, f'{PersistentShare._meta.app_label}.view_persistentshare') if target: persistentshares = persistentshares.filter(target__pk=target.pk) - can_delete = request.user.has_perm(f'{Target._meta.app_label}.delete_persistentshare') + can_delete = request.user.has_perm(f'{PersistentShare._meta.app_label}.delete_persistentshare') return {'persistentshares': persistentshares, 'target': target, 'can_delete': can_delete} @@ -486,7 +486,7 @@ def create_persistent_share(context, target): Returns a partial for a creation form for creating persistent shares """ request = context['request'] - if request.user.has_perm(f'{Target._meta.app_label}.add_persistentshare'): + if request.user.has_perm(f'{PersistentShare._meta.app_label}.add_persistentshare'): if target: form = PersistentShareForm(target_id=target.pk) else: