Skip to content
1 change: 1 addition & 0 deletions tom_targets/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ def create(self, validated_data):
f'Alias \'{alias_value}\' conflicts with Target name \'{target.name}\'.')
tns.save(target=target)

targetextras = [e for e in targetextras if e['key'] not in [field.name for field in target._meta.fields]]
tes = TargetExtraSerializer(data=targetextras, many=True)
if tes.is_valid():
tes.save(target=target)
Expand Down
22 changes: 21 additions & 1 deletion tom_targets/sharing.py
Original file line number Diff line number Diff line change
@@ -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)

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@
<div class="col-sm-4 offset-sm-1" style="align-content:end;">
{% bootstrap_field form.share_existing_data %}
</div>
<div class="col-sm-1">
<div class="row">
<div class="col-sm-1">
{% if target %}
<input type="button" class="btn btn-primary" value="Create" onclick="createPersistentShare('{% url 'targets:persistent-share' %}', '{% url 'targets:target-persistent-share-manage-table' target.pk %}')" style="position:absolute; bottom:1rem"/>
<input type="button" class="btn btn-primary mb-3" value="Create" onclick="createPersistentShare('{% url 'targets:persistent-share' %}', '{% url 'targets:target-persistent-share-manage-table' target.pk %}')" />
{% else %}
<input type="button" class="btn btn-primary" value="Create" onclick="createPersistentShare('{% url 'targets:persistent-share' %}', '{% url 'targets:persistent-share-manage-table' %}')" style="position:absolute; bottom:1rem"/>
<input type="button" class="btn btn-primary mb-3" value="Create" onclick="createPersistentShare('{% url 'targets:persistent-share' %}', '{% url 'targets:persistent-share-manage-table' %}')"/>
{% endif %}
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="alert alert-danger" role="alert" id="create_persistent_share_error" style="display:none">
<div class="row">
Expand Down
6 changes: 3 additions & 3 deletions tom_targets/templates/tom_targets/target_share.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,16 @@ <h3> Share <a href="{% url 'targets:detail' pk=target.id %}" title="Back">{{ tar
<div class="tab-pane active" id="share">
<div class="col-md-12">
<form method="post" class="form" id='target-share-form'>
<div class="row" style="padding-inline:1rem">
<div class="row align-items-end" style="padding-inline:1rem">
<div class="col-sm-3">
{% bootstrap_field form.share_destination %}
</div>
<div class="col-sm-5">
{% bootstrap_field form.share_title %}
</div>
<div class="col-sm-1">
<input type="submit" class="btn btn-primary" formaction="{% url 'targets:share' pk=target.id %}"
id="submit_target" value="Submit" name="share_target_form" style="position:absolute; bottom:1rem"
<input type="submit" class="btn btn-primary mb-3" formaction="{% url 'targets:share' pk=target.id %}"
id="submit_target" value="Submit" name="share_target_form"
onclick="setTarget('')">
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions tom_targets/templatetags/targets_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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}


Expand All @@ -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:
Expand Down
Loading