From 8baaa1d339b37d767b79b2074b92909eb617ca1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 6 Feb 2020 19:46:08 +0100 Subject: [PATCH] Add randomly generated account ids in kfet dump --- kfet/management/commands/dumpstuff.py | 62 +++++++++++++++------------ 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/kfet/management/commands/dumpstuff.py b/kfet/management/commands/dumpstuff.py index fe8a3eea..d13810e5 100644 --- a/kfet/management/commands/dumpstuff.py +++ b/kfet/management/commands/dumpstuff.py @@ -1,59 +1,67 @@ import json +import random +from typing import Dict from django.core.management.base import BaseCommand -from kfet.models import Article, Operation, OperationGroup +from kfet.models import Account, Article, Operation -def dump_articles(filename: str): - articles = Article.objects.values_list( - "id", "name", "price", "category__name", "box_type", "box_capacity" - ) +def gen_anonymisation_table() -> Dict[int, str]: + random.seed() + hashes = {} + for account_id in Account.objects.values_list("id", flat=True): + h = random.getrandbits(128) + hashes[account_id] = "{:032x}".format(h) + return hashes + + +def dump_articles(filename: str) -> None: articles = [ { - "id": id, - "name": name, - "price": str(price), - "category": cat, - "box_type": box_type, - "box_capacity": box_capacity, + "id": article.id, + "name": article.name, + "price": str(article.price), + "category": article.category.name, + "box_type": article.box_type, + "box_capacity": article.box_capacity, } - for id, name, price, cat, box_type, box_capacity in articles + for article in Article.objects.all() ] with open(filename, "w") as file: json.dump(articles, file, indent=4) -def dump_operations(filename: str): - operations = ( - Operation.objects.filter(type=Operation.PURCHASE) - .filter(canceled_at__isnull=True) - .values_list( - "amount", "article__id", "article_nb", "group__at", "group__is_cof" - ) +def dump_operations(filename: str, accounts_hashes: Dict[int, str]) -> None: + not_canceled_purchases = Operation.objects.filter(type=Operation.PURCHASE).filter( + canceled_at__isnull=True ) operations = [ { - "amount": str(amount), - "article": id, - "number": nb, - "date": str(at), - "is_cof": is_cof, + "amount": str(operation.amount), + "article": operation.article.id, + "number": operation.article_nb, + "date": str(operation.group.at), + "is_cof": operation.group.is_cof, + "on_account": accounts_hashes[operation.group.on_acc.id], } - for amount, id, nb, at, is_cof in operations + for operation in not_canceled_purchases ] with open(filename, "w") as file: json.dump(operations, file, indent=4) class Command(BaseCommand): - help = "Dump un historique anonymisé." + help = 'Dump un historique "anonymisé".' def handle(self, *args, **options): + # XXX. This is not great for privacy. + accounts_hashes = gen_anonymisation_table() + article_file = "article.dump.json" self.stdout.write('Dumping articles to "{}"'.format(article_file)) dump_articles(article_file) operation_file = "operation.dump.json" self.stdout.write('Dumping operations to "{}"'.format(operation_file)) - dump_operations(operation_file) + dump_operations(operation_file, accounts_hashes)