From e12e6b469400a7d605a6524d4916bf5148f32356 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Fri, 25 Jul 2014 17:33:41 +0200 Subject: [PATCH] [Migration] refactor client syncing --- mygpo/api/advanced/sync.py | 4 +-- mygpo/db/couchdb/user.py | 7 ---- mygpo/users/models.py | 22 ++++++++++-- mygpo/users/sync.py | 88 ---------------------------------------------- mygpo/web/views/device.py | 9 +++-- 5 files changed, 26 insertions(+), 104 deletions(-) diff --git a/mygpo/api/advanced/sync.py b/mygpo/api/advanced/sync.py index 432f4f6b..78f20e90 100644 --- a/mygpo/api/advanced/sync.py +++ b/mygpo/api/advanced/sync.py @@ -103,13 +103,13 @@ def update_sync_status(user, synclist, stopsync): for other_uid in devlist[1:]: other = user.get_device_by_uid(other_uid) - user.sync_devices(dev, other) + dev.sync_with(other) for uid in stopsync: dev = user.get_device_by_uid(uid) try: - user.unsync_device(dev) + dev.stop_sync() except ValueError: # if all devices of a sync-group are un-synced, # the last one will raise a ValueError, because it is no longer diff --git a/mygpo/db/couchdb/user.py b/mygpo/db/couchdb/user.py index 53e6d63e..41dd3c39 100644 --- a/mygpo/db/couchdb/user.py +++ b/mygpo/db/couchdb/user.py @@ -221,13 +221,6 @@ def update_device_state(state, devices): @repeat_on_conflict(['user']) -def unsync_device(user, device): - if user.is_synced(device): - user.unsync_device(device) - user.save() - - -@repeat_on_conflict(['user']) def create_missing_user_tokens(user): generated = False diff --git a/mygpo/users/models.py b/mygpo/users/models.py index 84ed9c3f..f0f95215 100644 --- a/mygpo/users/models.py +++ b/mygpo/users/models.py @@ -558,6 +558,25 @@ class Client(UUIDModel): other.sync_group = self.sync_group other.save() + def stop_sync(): + """ Stop synchronisation with other clients """ + sg = self.sync_group + + logger.info('Stopping synchronisation of %r', self) + self.sync_group = None + self.save() + + clients = Client.objects.filter(sync_group=sg) + logger.info('%d other clients remaining in sync group', len(clients)) + + if len(clients) < 2: + logger.info('Deleting sync group %r', sg) + for client in clients: + client.sync_group = None + client.save() + + sg.delete() + def get_sync_targets(self): """ Returns the devices and groups with which the device can be synced @@ -755,8 +774,7 @@ class User(BaseUser, SyncedDevicesMixin, SettingsMixin): self.devices = devices if self.is_synced(device): - self.unsync_device(device) - + device.stop_sync() def get_subscriptions_by_device(self, public=None): from mygpo.db.couchdb.podcast_state import subscriptions_by_user diff --git a/mygpo/users/sync.py b/mygpo/users/sync.py index 108cca9c..5bf6ad16 100644 --- a/mygpo/users/sync.py +++ b/mygpo/users/sync.py @@ -41,52 +41,6 @@ class SyncedDevicesMixin(DocumentSchema): sync_groups = ListProperty() - - - def sync_devices(self, device1, device2): - """ Puts two devices in a common sync group""" - - devices = set([device1, device2]) - if not devices.issubset(set(self.devices)): - raise ValueError('the devices do not belong to the user') - - sg1 = self.get_device_sync_group(device1) - sg2 = self.get_device_sync_group(device2) - - if sg1 is not None and sg2 is not None: - # merge sync_groups - self.sync_groups[sg1].extend(self.sync_groups[sg2]) - self.sync_groups.pop(sg2) - - elif sg1 is None and sg2 is None: - self.sync_groups.append([device1.id, device2.id]) - - elif sg1 is not None: - self.sync_groups[sg1].append(device2.id) - - elif sg2 is not None: - self.sync_groups[sg2].append(device1.id) - - - def unsync_device(self, device): - """ Removts the device from its sync-group - - Raises a ValueError if the device is not synced """ - - sg = self.get_device_sync_group(device) - - if sg is None: - raise ValueError('the device is not synced') - - group = self.sync_groups[sg] - - if len(group) <= 2: - self.sync_groups.pop(sg) - - else: - group.remove(device.id) - - def get_device_sync_group(self, device): """ Returns the sync-group Id of the device """ @@ -94,48 +48,6 @@ class SyncedDevicesMixin(DocumentSchema): if device.id in group: return n - - def is_synced(self, device): - return self.get_device_sync_group(device) is not None - - - def get_synced(self, device): - """ Returns the devices that are synced with the given one """ - - sg = self.get_device_sync_group(device) - - if sg is None: - return [] - - devices = self.get_devices_in_group(sg) - devices.remove(device) - return devices - - - - def get_sync_targets(self, device): - """ Returns the devices and groups with which the device can be synced - - Groups are represented as lists of devices """ - - sg = self.get_device_sync_group(device) - - for n, group in enumerate(self.get_grouped_devices()): - - if sg == n: - # the device's group can't be a sync-target - continue - - elif group.is_synced: - yield group.devices - - else: - # every unsynced device is a sync-target - for dev in group.devices: - if not dev == device: - yield dev - - def get_devices_in_group(self, sg): """ Returns the devices in the group with the given Id """ diff --git a/mygpo/web/views/device.py b/mygpo/web/views/device.py index bea9328f..a63ea2eb 100644 --- a/mygpo/web/views/device.py +++ b/mygpo/web/views/device.py @@ -40,7 +40,6 @@ from mygpo.users.tasks import sync_user, set_device_task_state from mygpo.users.sync import get_grouped_devices from mygpo.db.couchdb.podcast_state import podcast_states_for_device, \ remove_device_from_podcast_state -from mygpo.db.couchdb.user import unsync_device @vary_on_cookie @@ -95,7 +94,7 @@ def show(request, device): subscriptions = list(device.get_subscribed_podcasts()) synced_with = request.user.get_synced(device) - sync_targets = list(request.user.get_sync_targets(device)) + sync_targets = device.get_sync_targets() sync_form = SyncForm() sync_form.set_targets(sync_targets, _('Synchronize with the following devices')) @@ -181,7 +180,7 @@ def edit(request, device): synced_with = request.user.get_synced(device) - sync_targets = list(request.user.get_sync_targets(device)) + sync_targets = device.get_sync_targets() sync_form = SyncForm() sync_form.set_targets(sync_targets, _('Synchronize with the following devices')) @@ -240,7 +239,7 @@ def symbian_opml(request, device): @allowed_methods(['POST']) def delete(request, device): user = request.user - unsync_device(user, device) + device.stop_sync() device.deleted = True device.save() set_device_task_state.delay(user) @@ -303,7 +302,7 @@ def unsync(request, device): @repeat_on_conflict(['user']) def do_unsync(user, device): - user.unsync_device(device) + device.stop_sync() user.save() try: -- 2.11.4.GIT