diff --git a/README.md b/README.md index 90be502e8813fd7160be6a991311ba7596c21c33..2eb0728051d61bacaa80d32f8668cb8bf9419f43 100644 --- a/README.md +++ b/README.md @@ -204,11 +204,6 @@ It can also be disabled on a model instance instance.allow_create_backlinks = False ``` -When an instance was created as a reverse-link to an external resource, it is marked with `is_backlink` -```python -instance.is_backlink = True -``` - For situations where you don't want to include federated resources in a queryset, DjangoLDP Models override `models.Manager`, allowing you to write `Todo.objects.local()`, for example: ```python Todo.objects.create(name='Local Todo') diff --git a/djangoldp/activities/services.py b/djangoldp/activities/services.py index 0d076b813c47d5480098d7fe65fe85972f45bd83..3a828c0249400b231d3bd1936dbb28772e4958e0 100644 --- a/djangoldp/activities/services.py +++ b/djangoldp/activities/services.py @@ -182,7 +182,7 @@ class ActivityPubService(object): '@id': actor.urlid } - summary = str(object['@id']) + " was created" + summary = str(object['@id']) + " was updated" activity = { "@context": [ @@ -249,7 +249,7 @@ class ActivityPubService(object): def _check_instance_for_backlinks(sender, instance): - '''Auxiliary function returns a dictionary of backlink targets from paramertised instance''' + '''Auxiliary function returns a set of backlink targets from paramertised instance''' info = model_meta.get_field_info(sender) # bounds checking @@ -257,7 +257,7 @@ def _check_instance_for_backlinks(sender, instance): return {} # check each foreign key for a distant resource - targets = {} + targets = set() for field_name, relation_info in info.relations.items(): if not relation_info.to_many: value = getattr(instance, field_name, None) @@ -268,26 +268,26 @@ def _check_instance_for_backlinks(sender, instance): if target_type is None: continue - targets[value.urlid] = ActivityPubService._discover_inbox(value.urlid) + targets.add(ActivityPubService._discover_inbox(value.urlid)) # append Followers as targets followers = Follower.objects.filter(object=instance.urlid) for follower in followers: - targets[follower.inbox] = follower.inbox + targets.add(follower.inbox) - logger.debug('[Sender] built dict of targets: ' + str(targets)) + logger.debug('[Sender] built set of targets: ' + str(targets)) return targets @receiver([post_save]) def check_save_for_backlinks(sender, instance, created, **kwargs): - if getattr(settings, 'SEND_BACKLINKS', True) and not getattr(instance, 'is_backlink', False) \ - and getattr(instance, 'allow_create_backlink', False)\ + if getattr(settings, 'SEND_BACKLINKS', True) and getattr(instance, 'allow_create_backlink', False) \ + and not Model.is_external(instance) \ and getattr(instance, 'username', None) != 'hubl-workaround-493': logger.debug("[Sender] Received created non-backlink instance " + str(instance) + "(" + str(sender) + ")") targets = _check_instance_for_backlinks(sender, instance) - if len(targets.items()) > 0: + if len(targets) > 0: obj = ActivityPubService.build_object_tree(instance) actor = { "type": "Service", @@ -295,15 +295,15 @@ def check_save_for_backlinks(sender, instance, created, **kwargs): } # Create Activity if created: - for key in targets.keys(): - ActivityPubService.send_create_activity(actor, obj, targets[key]) - Follower.objects.create(object=obj['@id'], inbox=targets[key]) + for target in targets: + ActivityPubService.send_create_activity(actor, obj, target) + Follower.objects.create(object=obj['@id'], inbox=target) # Update Activity else: - for key in targets.keys(): - ActivityPubService.send_update_activity(actor, obj, targets[key]) - if not Follower.objects.filter(object=obj['@id'], inbox=targets[key]).exists(): - Follower.objects.create(object=obj['@id'], inbox=targets[key]) + for target in targets: + ActivityPubService.send_update_activity(actor, obj, target) + if not Follower.objects.filter(object=obj['@id'], inbox=target).exists(): + Follower.objects.create(object=obj['@id'], inbox=target) @receiver([post_delete]) @@ -313,15 +313,15 @@ def check_delete_for_backlinks(sender, instance, **kwargs): logger.debug("[Sender] Received deleted non-backlink instance " + str(instance) + "(" + str(sender) + ")") targets = _check_instance_for_backlinks(sender, instance) - if len(targets.items()) > 0: - for key in targets.keys(): + if len(targets) > 0: + for target in targets: ActivityPubService.send_delete_activity({ "type": "Service", "name": "Backlinks Service" }, { "@id": instance.urlid, "@type": Model.get_model_rdf_type(sender) - }, targets[key]) + }, target) # remove any Followers on this resource urlid = getattr(instance, 'urlid', None) @@ -339,7 +339,7 @@ def check_m2m_for_backlinks(sender, instance, action, *args, **kwargs): for obj in query_set: condition = Model.is_external(obj) and getattr(obj, 'allow_create_backlink', False) if action == "post_add": - condition = condition and not getattr(instance, 'is_backlink', False) + condition = condition and not Model.is_external(instance) if condition: targets.append({ diff --git a/djangoldp/models.py b/djangoldp/models.py index 5cc1c3eb7724abb797403826b0a0ae4b6f11ba76..f5f2d6a3d764992035e416684d98c40983fbf7dd 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -31,7 +31,8 @@ class LDPModelManager(models.Manager): class Model(models.Model): urlid = LDPUrlField(blank=True, null=True, unique=True) - is_backlink = models.BooleanField(default=False, help_text='set automatically to indicate the Model is a backlink') + is_backlink = models.BooleanField(default=False, + help_text='(DEPRECIATED) set automatically to indicate the Model is a backlink') allow_create_backlink = models.BooleanField(default=True, help_text='set to False to disable backlink creation after Model save') objects = LDPModelManager() diff --git a/djangoldp/tests/tests_inbox.py b/djangoldp/tests/tests_inbox.py index cc1d8a810cb7360dfae72feabf37fc4b33454590..d29a18e39d218a537e463eee2ff8729b71764512 100644 --- a/djangoldp/tests/tests_inbox.py +++ b/djangoldp/tests/tests_inbox.py @@ -156,9 +156,8 @@ class TestsInbox(APITestCase): UserProfile.objects.create(user=user) # ..but the receiver already knows about it - circle = Circle.objects.create(urlid="https://distant.com/circles/1/", is_backlink=True) - CircleMember.objects.create(urlid="https://distant.com/circle-members/1/", circle=circle, user=user, - is_backlink=True) + circle = Circle.objects.create(urlid="https://distant.com/circles/1/") + CircleMember.objects.create(urlid="https://distant.com/circle-members/1/", circle=circle, user=user) payload = { "@context": [ @@ -248,7 +247,7 @@ class TestsInbox(APITestCase): # a local user has a distant project attached user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion') UserProfile.objects.create(user=user) - project = Project.objects.create(urlid="https://distant.com/projects/1/", is_backlink=True) + project = Project.objects.create(urlid="https://distant.com/projects/1/") user.projects.add(project) payload = { @@ -297,8 +296,7 @@ class TestsInbox(APITestCase): user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion') UserProfile.objects.create(user=user) circle = Circle.objects.create(urlid="https://distant.com/circles/1/", allow_create_backlink=False) - CircleMember.objects.create(urlid="https://distant.com/circle-members/1/",circle=circle, user=user, - is_backlink=True) + CircleMember.objects.create(urlid="https://distant.com/circle-members/1/",circle=circle, user=user) payload = { "@context": [ @@ -350,7 +348,7 @@ class TestsInbox(APITestCase): user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion') UserProfile.objects.create(user=user) - circle = Circle.objects.create(urlid="https://distant.com/circles/1/", owner=user, is_backlink=True) + circle = Circle.objects.create(urlid="https://distant.com/circles/1/", owner=user) self.assertEqual(circle.owner, user) payload = {