Skip to content

Commit

Permalink
Improve event export prefetching; make exports more consistent #790
Browse files Browse the repository at this point in the history
  • Loading branch information
rlskoeser committed Apr 18, 2024
1 parent 0489906 commit 7f1cdf6
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 13 deletions.
26 changes: 23 additions & 3 deletions mep/accounts/management/commands/export_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@

from django.core.exceptions import ObjectDoesNotExist
from django.db.models.functions import Coalesce
from django.db.models.query import Prefetch
from djiffy.models import Manifest

from mep.accounts.models import Event
from mep.books.models import Creator
from mep.common.management.export import BaseExport
from mep.common.utils import absolutize_url

Expand All @@ -28,6 +31,7 @@ class Command(BaseExport):
"event_type",
"start_date",
"end_date",
"member_ids",
"member_uris",
"member_names",
"member_sort_names",
Expand Down Expand Up @@ -66,9 +70,24 @@ def get_queryset(self):
"""get event objects to be exported"""
# Order events by date. Order on precision first so unknown dates
# will be last, then sort by first known date of start/end.
return Event.objects.all().order_by(
Coalesce("start_date_precision", "end_date_precision"),
Coalesce("start_date", "end_date").asc(nulls_last=True),
return (
Event.objects.all()
.select_related(
"subscription", "reimbursement", "borrow", "purchase", "work", "edition"
)
.prefetch_related(
"account__persons",
"footnotes",
"footnotes__bibliography__manifest",
Prefetch(
"work__creators",
queryset=Creator.objects.select_related("person", "creator_type"),
),
)
.order_by(
Coalesce("start_date_precision", "end_date_precision"),
Coalesce("start_date", "end_date").asc(nulls_last=True),
)
)

def get_object_data(self, obj):
Expand Down Expand Up @@ -133,6 +152,7 @@ def member_info(self, event):

return OrderedDict(
[
("ids", [m.slug for m in members]),
("uris", [absolutize_url(m.get_absolute_url()) for m in members]),
("names", [m.name for m in members]),
("sort_names", [m.sort_name for m in members]),
Expand Down
29 changes: 21 additions & 8 deletions mep/accounts/management/commands/export_locations.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ class Command(BaseExport):
model = Address

csv_fields = [
"member_id", # member slug
"member_uri",
"care_of_person_id", # person slug
"member_ids", # member slug
"member_uris",
"care_of_person_id", # c/o person slug
"care_of_person", # c/o person name
"street_address",
"postal_code",
"city",
Expand Down Expand Up @@ -59,15 +60,13 @@ def get_object_data(self, addr):

# required properties
data = dict(
# Member
member_ids=[person.slug for person in persons],
member_uris=[
absolutize_url(person.get_absolute_url()) for person in persons
],
# Member info
member=self.member_info(addr),
# Address data
start_date=addr.partial_start_date,
end_date=addr.partial_end_date,
care_of_person_id=addr.care_of_person.slug if addr.care_of_person else None,
care_of_person=addr.care_of_person.name if addr.care_of_person else None,
# Location data
street_address=loc.street_address,
city=loc.city,
Expand All @@ -79,3 +78,17 @@ def get_object_data(self, addr):
)
# filter out unset values so we don't get unnecessary content in json
return {k: v for k, v in data.items() if v is not None}

def member_info(self, location):
"""Event about member(s) associated with this location"""
# adapted from event export logic
# NOTE: would be nicer and more logical if each member had their own
# dict entry, but that doesn't work with current flatting logic for csv
members = location.account.persons.all()
return dict(
ids=[m.slug for m in members],
uris=[absolutize_url(m.get_absolute_url()) for m in members],
# useful to include or too redundant?
# ("names", [m.name for m in members]),
# ("sort_names", [m.sort_name for m in members]),
)
4 changes: 2 additions & 2 deletions mep/accounts/tests/test_accounts_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -646,8 +646,8 @@ def test_get_object_data(self):
# check some basic data

# slug is 'gay' in sample_people, 'gay-francisque' in db
assert gay_data["member_id"] == ["gay"]
assert gay_data["member_uri"] == ["https://example.com/members/gay/"]
assert gay_data["member"]["ids"] == ["gay"]
assert gay_data["member"]["uris"] == ["https://example.com/members/gay/"]

# check addresses & coordinates
assert "3 Rue Garancière" == gay_data["street_address"]
Expand Down

0 comments on commit 7f1cdf6

Please sign in to comment.