Backlinks changes

This commit is contained in:
Calum Mackervoy 2020-05-22 13:36:49 +00:00 committed by Benoit Alessandroni
parent 1c7ec32288
commit 4bfefeaa1d
4 changed files with 104 additions and 4 deletions

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2020-04-29 13:46
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('djangoldp_notification', '0002_auto_20190917_1107'),
]
operations = [
migrations.AddField(
model_name='notification',
name='allow_create_backlink',
field=models.BooleanField(default=True, help_text='set to False to disable backlink creation after Model save'),
),
migrations.AddField(
model_name='subscription',
name='allow_create_backlink',
field=models.BooleanField(default=True, help_text='set to False to disable backlink creation after Model save'),
),
]

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2020-05-01 12:07
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('djangoldp_notification', '0003_auto_20200429_1346'),
]
operations = [
migrations.AddField(
model_name='notification',
name='backlink_created',
field=models.BooleanField(default=False, help_text='set automatically to indicate the Model is a backlink'),
),
migrations.AddField(
model_name='subscription',
name='backlink_created',
field=models.BooleanField(default=False, help_text='set automatically to indicate the Model is a backlink'),
),
]

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2020-05-05 17:33
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('djangoldp_notification', '0004_auto_20200501_1207'),
]
operations = [
migrations.RenameField(
model_name='notification',
old_name='backlink_created',
new_name='is_backlink',
),
migrations.RenameField(
model_name='subscription',
old_name='backlink_created',
new_name='is_backlink',
),
]

View File

@ -12,7 +12,6 @@ from django.utils.translation import ugettext_lazy as _
from djangoldp.fields import LDPUrlField
from djangoldp.models import Model
from threading import Thread
from djangoldp_notification.middlewares import MODEL_MODIFICATION_USER_FIELD
from djangoldp_notification.permissions import InboxPermissions, SubscriptionsPermissions
@ -63,6 +62,31 @@ class Subscription(Model):
authenticated_perms = ["add", "view", "delete"]
permission_classes = [SubscriptionsPermissions]
def save(self, *args, **kwargs):
# save subscriptions for nested fields
if self.pk is None and not self.is_backlink and self.object.startswith(settings.SITE_URL):
try:
# object is a WebID.. convert to local representation
local = Model.resolve(self.object.replace(settings.SITE_URL, ''))[0]
nested_fields = Model.get_meta(local, 'nested_fields', [])
for nested_field in nested_fields:
nested_url = str(self.object) + '1/' + nested_field + '/'
# we have the nested_url, but we want the model contained within's container
nested_container = Model.resolve(nested_url)[0]
nested_container_url = Model.absolute_url(nested_container)
# check a Subscription on this pair doesn't exist already
existing_subscriptions = Subscription.objects.filter(object=nested_container_url, inbox=self.inbox)
# save a Subscription on this container
if not existing_subscriptions.exists():
Subscription.objects.create(object=nested_container_url, inbox=self.inbox, is_backlink=True)
except:
pass
super(Subscription, self).save(*args, **kwargs)
# --- SUBSCRIPTION SYSTEM ---
@receiver(post_save, dispatch_uid="callback_notif")
def send_notification(sender, instance, created, **kwargs):
@ -76,9 +100,10 @@ def send_notification(sender, instance, created, **kwargs):
# dispatch a notification for every Subscription on this resource
for subscription in Subscription.objects.filter(models.Q(object=url_resource) | models.Q(object=url_container)):
process = Thread(target=send_request, args=[subscription.inbox, url_resource, instance, created])
process.start()
threads.append(process)
if not instance.is_backlink:
process = Thread(target=send_request, args=[subscription.inbox, url_resource, instance, created])
process.start()
threads.append(process)
def send_request(target, object_iri, instance, created):