Skip to content

Commit

Permalink
feat: update base_sync.py to use instance level deletion
Browse files Browse the repository at this point in the history
Signed-off-by: Guilhem Barthés <guilhem.barthes@owkin.com>
  • Loading branch information
guilhem-barthes committed Sep 18, 2024
1 parent 946651f commit 6720c3b
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 15 deletions.
28 changes: 15 additions & 13 deletions backend/organization/management/commands/base_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ def add_arguments(self, parser):
def handle(self, *args, **options):
file = options["path"]

existing_elements = set(self.model.objects.values_list(self.field_key, flat=True))
existing_keys = set(self.model.objects.values_list(self.field_key, flat=True))

for line in file:
line_trimmed = line.removesuffix("\n")
element = self.parse_line(line_trimmed)
self.handle_element(element)
existing_elements.discard(element.key)
existing_keys.discard(element.key)

self.delete_elements(existing_elements)
self.delete(existing_keys)

def parse_line(self, line: str) -> Element:
(key, password) = line.rsplit(" ", maxsplit=1)
Expand All @@ -45,8 +45,8 @@ def handle_element(self, element: Element) -> None:
except IntegrityError:
self.update_password(element)

def get(self, element: Element) -> models.Model:
parameters = {self.field_key: element.key}
def get(self, key: str) -> models.Model:
parameters = {self.field_key: key}
return self.model.objects.get(**parameters)

def create(self, element: Element) -> models.Model:
Expand All @@ -55,18 +55,20 @@ def create(self, element: Element) -> models.Model:
"password": element.password,
}
model = self.model.objects.create(**parameters)
self.stdout.write(f"{self.model_name} created: {element.key}")
self.stdout.write(f"{self.model_name} created: {element.key}, password: {element.password}")
return model

def update_password(self, element: Element) -> models.Model:
model = self.get(element)
model = self.get(element.key)
model.set_password(element.password)
model.save()
self.stdout.write(f"{self.model_name} updated: {element.key}")
self.stdout.write(f"{self.model_name} updated: {element.key}, password: {element.password}")
return model

def delete_elements(self, discarded_elements: set[models.Model]) -> None:
if len(discarded_elements) > 0:
parameters = {f"{self.field_key}__in": discarded_elements}
self.model.objects.filter(**parameters).delete()
self.stdout.write(f"{self.model_name} deleted: {', '.join(discarded_elements)}")
def delete(self, discarded_keys: set[str]) -> None:
# Using instance delete instead of queryset to activate foreign keys actions
for key in discarded_keys:
model = self.get(key)
model.delete()

self.stdout.write(f"{self.model_name} deleted: {key}")
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class Command(BaseSyncCommand):

# Password saved as clear text
def update_password(self, element: Element) -> models.Model:
model = self.get(element)
model = self.get(element.key)
model.secret = element.password
model.save()
self.stdout.write(f"{self.model_name} updated: {element.key}")
Expand Down
2 changes: 1 addition & 1 deletion backend/users/management/commands/sync_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def create(self, element: UserElement) -> models.Model:
return

user = self.model.objects.create_user(element.key, element.password)
self.stdout.write(f"{self.model_name} created: {element.key}")
self.stdout.write(f"{self.model_name} created: {element.key}, password={element.password}")
UserChannel.objects.create(user=user, channel_name=element.channel, role=_validate_role("ADMIN"))
self.stdout.write(f"User channel created: {element.key}")
return user
Expand Down

0 comments on commit 6720c3b

Please sign in to comment.