Newer
Older
import argparse
import json
from datetime import datetime, timezone
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.utils import IntegrityError
from opentech.apply.activity.models import Activity
from opentech.apply.funds.models import ApplicationSubmission
class Command(BaseCommand):
help = "Comment migration script. Requires a source JSON file."
data = []
def add_arguments(self, parser):
parser.add_argument('source', type=argparse.FileType('r'), help='Migration source JSON file')
@transaction.atomic
def handle(self, *args, **options):
with options['source'] as json_data:
self.data = json.load(json_data)
for id in self.data:
self.process(id)
def process(self, id):
comment = self.data[id]
try:
activity = Activity.objects.create(
timestamp=datetime.fromtimestamp(int(comment['created']), timezone.utc),
user=self.get_user(comment['uid']),
submission=self.get_submission(comment['nid']),
message=self.get_message(comment['subject'], comment['comment_body']['value']),
type='comment',
visibility='internal',
)
# Disable auto_* on date fields so imported dates are used.
for field in activity._meta.local_fields:
if field.name == "timestamp":
field.auto_now_add = False
try:
activity.save()
self.stdout.write(f"Processed \"{comment['subject']}\" ({comment['cid']})")
except IntegrityError:
self.stdout.write(f"Skipped \"{comment['subject']}\" ({comment['cid']}) due to IntegrityError")
pass
except ValueError:
pass
def get_user(self, uid):
try:
User = get_user_model()
return User.objects.get(drupal_id=uid)
except User.DoesNotExist:
return None
def get_message(self, comment_subject, comment_body):
message = f"{comment_subject} – {comment_body}"
return message