Skip to content
Snippets Groups Projects
Commit 982dceec authored by Nadja Geisler's avatar Nadja Geisler :sunny:
Browse files

Merge branch 'meta-export' into 'main'

Introduce utility to export all data related to an event to json

See merge request !114
parents 26cc3f0f cafa4b69
No related branches found
No related tags found
1 merge request!114Introduce utility to export all data related to an event to json
Pipeline #81889 passed
# Generated by Django 3.1.8 on 2022-05-12 16:57
from django.db import migrations, models
import django.db.models.deletion
def forwards_func(apps, schema_editor):
# Set event to the corresponding even (from the AK) each
AKOrgaMessage = apps.get_model("AKModel", "AKOrgaMessage")
for message in AKOrgaMessage.objects.all():
message.event = message.ak.event
message.save()
def reverse_func(apps, schema_editor):
# No need to do something here, field will be deleted anyway
pass
class Migration(migrations.Migration):
dependencies = [
('AKModel', '0049_interest_window'),
]
operations = [
migrations.AddField(
model_name='akorgamessage',
name='event',
field=models.ForeignKey(blank=True, help_text='Associated event', null=True,
on_delete=django.db.models.deletion.CASCADE, to='AKModel.event',
verbose_name='Event'),
),
migrations.RunPython(forwards_func, reverse_func),
migrations.AlterField(
model_name='akorgamessage',
name='event',
field=models.ForeignKey(help_text='Associated event', on_delete=django.db.models.deletion.CASCADE,
to='AKModel.event', verbose_name='Event'),
),
]
......@@ -443,6 +443,8 @@ class AKOrgaMessage(models.Model):
text = models.TextField(verbose_name=_("Message text"),
help_text=_("Message to the organizers. This is not publicly visible."))
timestamp = models.DateTimeField(auto_now_add=True)
event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name=_('Event'),
help_text=_('Associated event'))
class Meta:
verbose_name = _('AK Orga Message')
......
......@@ -175,8 +175,9 @@ class AKDurationForm(forms.ModelForm):
class AKOrgaMessageForm(forms.ModelForm):
class Meta:
model = AKOrgaMessage
fields = ['ak', 'text']
fields = ['ak', 'text', 'event']
widgets = {
'ak': forms.HiddenInput,
'event': forms.HiddenInput,
'text': forms.Textarea,
}
......@@ -437,6 +437,7 @@ class AKAddOrgaMessageView(EventSlugMixin, CreateView):
def get_initial(self):
initials = super(AKAddOrgaMessageView, self).get_initial()
initials['ak'] = get_object_or_404(AK, pk=self.kwargs['pk'])
initials['event'] = initials['ak'].event
return initials
def get_context_data(self, *, object_list=None, **kwargs):
......
......@@ -31,3 +31,4 @@ Afterwards, you may check your setup by executing ``Utils/check.sh`` or ``Utils/
## Developer Notes
* to regenerate translations use ````python manage.py makemessages -l de_DE --ignore venv````
* to create a data backup use ````python manage.py dumpdata --indent=2 > db.json --traceback````
* to export all database items belonging to a certain event use ````.\Utils\json_export.sh <event_id> <export_prefix> [--prod]````. The results will be saved in ````backups/<export_prefix>.json````
......@@ -7,3 +7,4 @@ All scripts should be executed from the project folder (repository root).
* **setup** installation script for development setup
* **update** update script for development or production (--prod) setup
* **check** setup checking script for development and production (--prod) setup
* **json_export** export script for development and production (--prod) -- can be used to export all database items belonging to a given event
\ No newline at end of file
import json
import sys
event_id = int(sys.argv[1])
target_name = sys.argv[2]
print(f"Creating export for event '{event_id}' as '{target_name}'")
# Load json file just created by django
with open('backups/akplanning_only.json', 'r') as json_file:
exported_entries = json.load(json_file)
print(f"Loaded {len(exported_entries)} entries in total, restricting to event...")
entries_without_event = 0
entries_out = []
virtual_rooms_to_preserve = set()
# Loop over all dumped entries
for entry in exported_entries:
# Handle all entries with event reference
if "event" in entry['fields']:
event = int(entry['fields']['event'])
# Does this entry belong to the event we are looking for?
if event == event_id:
# Store for backup
entries_out.append(entry)
# Remember the primary keys of all rooms of this event
# Required for special handling of virtual rooms,
# since they inherit from normal rooms and have no direct event reference
if entry['model'] == "AKModel.room":
virtual_rooms_to_preserve.add(entry['pk'])
# Handle entries without event reference
else:
# Backup virtual rooms of that event
if entry['model'] == "AKOnline.virtualroom":
if entry['pk'] in virtual_rooms_to_preserve:
entries_out.append(entry)
# Backup the event itself
elif entry['model'] == "AKModel.event":
if int(entry['pk']) == event_id:
entries_out.append(entry)
# Backup tags
elif entry['model'] == "AKModel.aktag":
# No restriction needed, backup all tags
entries_out.append(entry)
else:
# This should normally not happen (all other models should have a reference to the event)
entries_without_event += 1
print(entry)
print(f"Ignored entries without event: {entries_without_event}")
print(f"Exporting {len(entries_out)} entries for event")
with open(f'backups/{target_name}.json', 'w') as json_file:
json.dump(entries_out, json_file, indent=2)
#!/usr/bin/env bash
# Update AKPlanning
# execute as Utils/update.sh id_to_export target_name_to_export_to [--prod]
# abort on error, print executed commands
set -ex
# activate virtualenv if necessary
if [ -z ${VIRTUAL_ENV+x} ]; then
source venv/bin/activate
fi
# set environment variable when we want to update in production
if [ "$3" = "--prod" ]; then
export DJANGO_SETTINGS_MODULE=AKPlanning.settings_production
fi
mkdir -p ../backups/
python manage.py dumpdata AKDashboard AKModel AKOnline AKPlan AKScheduling AKSubmission --indent=2 > "backups/akplanning_only.json" --traceback
python ./Utils/json_export.py $1 $2
rm backups/akplanning_only.json
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment