Skip to content

Commit 6f6e85a

Browse files
authored
Merge pull request #288 from JohnMulligan/dataviz_reqs_refactor
Groupby endpoint, sources update, blog assets,
2 parents 0fb96d5 + e881137 commit 6f6e85a

13 files changed

Lines changed: 148 additions & 125 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ local:~/Projects/voyages-api$ docker exec -i voyages-solr solr create_core -c bl
110110
local:~/Projects/voyages-api$ docker exec -i voyages-solr solr create_core -c sources -d /srv/voyages/solr
111111
local:~/Projects/voyages-api$ docker exec -i voyages-solr solr create_core -c voyagesources -d /srv/voyages/solr
112112
local:~/Projects/voyages-api$ docker exec -i voyages-solr solr create_core -c enslaversources -d /srv/voyages/solr
113+
local:~/Projects/voyages-api$ docker exec -i voyages-solr solr create_core -c enslavedsources -d /srv/voyages/solr
113114
local:~/Projects/voyages-api$ docker exec -i voyages-api bash -c 'python3 manage.py rebuild_indices'
114115
```
115116

src/api/blog/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@ def media_uploads_sub(html):
4444
an image in the blog post at the front-end site, naturally, rather than here. we
4545
rewrite the html before returning it (until i can find a better system).
4646
'''
47+
print(html)
4748
site_storage_base_url_no_leading_slash=re.sub("^/","",site_storage_base_url)
4849
media_uploads_baseurl=f"{OPEN_API_BASE_URL}{site_storage_base_url_no_leading_slash}"
4950
clean_html=re.sub(f"(?<=src=\").*?{site_storage_base_url}",media_uploads_baseurl,html)
51+
clean_html=re.sub(f"(?<=href=\").*?{site_storage_base_url}",media_uploads_baseurl,clean_html)
52+
print(clean_html)
5053
return clean_html
5154

5255
class PostSerializer(serializers.ModelSerializer):

src/api/common/management/commands/rebuild_indices.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ def handle(self, *args, **options):
9393
'voyage_source_connections__source__short_ref__name'
9494
]
9595
},
96+
{
97+
"model":Enslaved,
98+
"core_name":"enslavedsources",
99+
"fields":[
100+
'id',
101+
'enslaved_relations__relation__voyage__voyage_source_connections__source__bib',
102+
'enslaved_relations__relation__voyage__voyage_source_connections__source__short_ref__name'
103+
]
104+
},
96105
{
97106
"model":EnslaverIdentity,
98107
"core_name":"enslaversources",

src/api/common/reqs.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,13 @@ def post_req(orig_queryset,s,r,options_dict,auto_prefetch=True,paginate=False):
258258
# SPECIAL CASE 2: DOCUMENTARY SOURCES
259259
if varName.endswith("__source__ALL"):
260260
qsetclassstr=str(orig_queryset[0].__class__)
261-
if qsetclassstr=="<class 'voyage.models.Voyage'>":
261+
if solrcorenamedict[qsetclassstr]=='voyages':
262262
filtered_queryset,results_count=global_search(orig_queryset,searchTerm,core_name='voyagesources')
263-
elif qsetclassstr=="<class 'past.models.EnslaverIdentity'>":
263+
elif solrcorenamedict[qsetclassstr]=='enslavers':
264264
filtered_queryset,results_count=global_search(orig_queryset,searchTerm,core_name='enslaversources')
265+
elif solrcorenamedict[qsetclassstr]=='enslaved':
266+
filtered_queryset,results_count=global_search(orig_queryset,searchTerm,core_name='enslavedsources')
267+
265268
filter_obj.remove(item)
266269
# TYPICAL ORM-BASED SEARCH/FILTER
267270
for item in filter_obj:

src/api/common/static/Enslaved_options.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/api/common/static/Enslaved_options.py

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/api/document/management/commands/iiif_generate_manifests.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def _extract_iiif_url(url):
6363
def handle(self, *args, **options):
6464

6565
#NOT RUNNING THIS EXCEPT LOCALLY W/O DJK's APPROVAL
66-
exit()
66+
# exit()
6767
#screen out sources that lack either pages
6868
sources = Source.objects \
6969
.prefetch_related('page_connections') \
@@ -97,10 +97,7 @@ def handle(self, *args, **options):
9797
s.has_published_manifest = False
9898

9999
Source.objects.bulk_update(cleared_sources, ["has_published_manifest"])
100-
101-
# sources.update(has_published_manifest=False)
102-
# sources.save()
103-
100+
104101
generated_count=0
105102

106103
for source in sources:
@@ -125,7 +122,7 @@ def handle(self, *args, **options):
125122
canvas = []
126123
abort = False
127124
for i, page in enumerate(pages_with_images, 1):
128-
# print(page.__dict__)
125+
print(page.__dict__)
129126
iiif_baseimage_url=page.iiif_baseimage_url
130127
# A canvas page.
131128
host_addr,iiif_suffix = Command._extract_iiif_url(iiif_baseimage_url)

src/api/document/management/commands/transkribus_sync.py

Lines changed: 63 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,7 @@ def handle(self, *args, **options):
4949

5050
j=json.loads(resp.text)
5151

52-
# print(resp,json.dumps(j,indent=2))
53-
5452
transkribus_shortrefs=ShortRef.objects.all().exclude(transkribus_docId=None)
55-
transkribus_shortrefs=transkribus_shortrefs.exclude(name__icontains="SSC Add Ms")
56-
# transkribus_shortrefs=transkribus_shortrefs.exclude(transkribus_docId__in=[1301052,1594526])
57-
58-
# transkribus_shortrefs=transkribus_shortrefs.filter(transkribus_docId=1296568)
59-
60-
# transkribus_shortrefs=transkribus_shortrefs.exclude(transkribus_docId__in=[1301052,1594526])
6153

6254
print(transkribus_shortrefs)
6355

@@ -77,7 +69,8 @@ def handle(self, *args, **options):
7769
pd[a]=[b]
7870

7971
for docId in pd:
80-
if docId not in ['25566', '25565', '25564', '25563', '25562', '25561', '25560', '25555', '25552', '25554', '25553', '25551', '25550', '25575', '25557', '25567', '25556', '25510', '25509', '25508', '25506', '25507', '25505', '25504', '25503', '25502', '25501', '25500', '25582', '25576', '25577','1437762','1470747','1470827','1470863','1470876','1487718','1487721','1492986','1493090','1493096','1494915','1494931','1496973','1497235']:
72+
# if docId not in ['25566', '25565', '25564', '25563', '25562', '25561', '25560', '25555', '25552', '25554', '25553', '25551', '25550', '25575', '25557', '25567', '25556', '25510', '25509', '25508', '25506', '25507', '25505', '25504', '25503', '25502', '25501', '25500', '25582', '25576', '25577','1437762','1470747','1470827','1470863','1470876','1487718','1487721','1492986','1493090','1493096','1494915','1494931','1496973','1497235']:
73+
if docId not in ['1437762', '1439396', '1438141']:
8174
break
8275
print('DOCID',docId)
8376
pages=pd[docId]
@@ -86,8 +79,8 @@ def handle(self, *args, **options):
8679

8780
for pagepk in pages:
8881
page=Page.objects.get(id=pagepk)
82+
print(page)
8983
page.transkribus_pageid=None
90-
page.transcription=None
9184
page.save()
9285

9386
doc_url="https://transkribus.eu/TrpServer/rest/collections/%s/%s/fulldoc" %(transkribus_collection_id,docId)
@@ -96,67 +89,69 @@ def handle(self, *args, **options):
9689

9790
c=1
9891
for transkribus_page in doc['pageList']['pages']:
99-
# print("PAGES",pages,'COUNT',len(pages))
100-
# print("C=",c)
10192
pagetexturls=[]
102-
sp=Page.objects.get(id=pages[c-1])
103-
print(sp.source_connections.first().source)
10493

94+
imgFileName=transkribus_page['imgFileName']
10595

106-
if sp.transcriptions.all() != []:
107-
print("transcription already exists")
108-
else:
109-
imgFileName=transkribus_page['imgFileName']
110-
## but as a backstop we can capture the pageid on the transkribus side as well
111-
## and then bump them as necessary and re-pull (i don't want to do this!!!!)
112-
transkribus_pageId=transkribus_page['pageId']
113-
transcripts=transkribus_page['tsList']['transcripts']
114-
# if c==8:
115-
# print(json.dumps(transkribus_page,indent=2))
116-
117-
pagetext=''
118-
for transcript in transcripts:
119-
wordcount=transcript['nrOfCharsInLines']
120-
if wordcount>0:
121-
transcript_url=transcript['url']
122-
# print(transcript_url)
123-
connection_pool = urllib3.PoolManager()
124-
resp = connection_pool.request('GET',transcript_url,headers=auth_headers)
125-
tmpfilename="tmp/%s.xml" %docId
126-
f = open(tmpfilename, 'wb')
127-
f.write(resp.data)
128-
f.close()
129-
resp.release_conn()
130-
d=open(tmpfilename,"r")
131-
t=d.read()
132-
133-
d.close()
134-
pagetree=ET.fromstring(t)
135-
textlines_trees=[e for e in pagetree.iter() if e.tag=="{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}TextLine"]
136-
textlines=[]
137-
138-
os.remove(tmpfilename)
139-
140-
for textline_tree in textlines_trees:
141-
linetext=[e.text for e in textline_tree.iter() if e.tag=='{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Unicode' and e.text is not None]
142-
textlines.append(' '.join(linetext))
143-
pagetext+='\n'.join(textlines)
144-
# print(pagetext)
145-
if re.match('\s+',pagetext,re.S):
146-
pagetext=None
147-
148-
# sp.transkribus_pageid=transkribus_pageId
149-
Transcription.objects.create(
150-
page=sp,
151-
language_code='en',
152-
text=pagetext,
153-
is_translation=False
154-
)
155-
156-
# sp.transcriptions.add=pagetext
157-
# sp.save()
158-
159-
96+
imgFileName_stripped=re.sub('(\.jpg|\.tif|\.tiff)','',imgFileName)
97+
98+
skip=False
99+
try:
100+
sp=Page.objects.get(image_filename__icontains=imgFileName_stripped)
101+
print(sp.source_connections.first().source)
102+
except:
103+
print(f"IMAGE MATCHING FILENAME DOES NOT EXIST:{imgFileName_stripped}")
104+
skip=True
105+
if not skip:
106+
if sp.transcriptions.all().count() != 0:
107+
print(sp.transcriptions.all())
108+
print("transcription already exists")
109+
else:
110+
imgFileName=transkribus_page['imgFileName']
111+
112+
## but as a backstop we can capture the pageid on the transkribus side as well
113+
## and then bump them as necessary and re-pull (i don't want to do this!!!!)
114+
transkribus_pageId=transkribus_page['pageId']
115+
transcripts=transkribus_page['tsList']['transcripts']
116+
pagetext=''
117+
max_ts=0
118+
transcript=transcripts[0]
119+
120+
if transcript is not None:
121+
122+
wordcount=transcript['nrOfCharsInLines']
123+
if wordcount>0:
124+
transcript_url=transcript['url']
125+
connection_pool = urllib3.PoolManager()
126+
resp = connection_pool.request('GET',transcript_url,headers=auth_headers)
127+
tmpfilename="document/management/commands/data/%s.xml" %docId
128+
f = open(tmpfilename, 'wb')
129+
f.write(resp.data)
130+
f.close()
131+
resp.release_conn()
132+
d=open(tmpfilename,"r")
133+
t=d.read()
134+
d.close()
135+
pagetree=ET.fromstring(t)
136+
textlines_trees=[e for e in pagetree.iter() if e.tag=="{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}TextLine"]
137+
textlines=[]
138+
139+
os.remove(tmpfilename)
140+
141+
for textline_tree in textlines_trees:
142+
linetext=[e.text for e in textline_tree.iter() if e.tag=='{http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15}Unicode' and e.text is not None]
143+
textlines.append(' '.join(linetext))
144+
pagetext+='\n'.join(textlines)
145+
print(pagetext)
146+
if re.match('\s+',pagetext,re.S):
147+
pagetext=""
148+
149+
Transcription.objects.create(
150+
page=sp,
151+
language_code='en',
152+
text=pagetext,
153+
is_translation=False
154+
)
160155

161156

162157
c+=1

src/api/document/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class Transcription(models.Model):
3232
def __str__(self):
3333
if len(self.text)>20:
3434
snippet=self.text[:19]+"..."
35+
else:
36+
snippet=self.text
3537
return f"Transcription of page {self.page}: {snippet}"
3638

3739
class Page(models.Model):

src/api/past/serializers.py

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,31 @@ class Meta:
4343

4444
############ VOYAGES
4545

46-
class PastEnslavedVoyageSerializer(serializers.ModelSerializer):
46+
47+
class PastVoyageOutcomesSerializer(serializers.Serializer):
48+
particular_outcome=serializers.CharField()
49+
class Meta:
50+
fields=['particular_outcome']
51+
52+
class PastEnslavedVoyageSerializer(serializers.Serializer):
4753
id=serializers.IntegerField()
4854
embarkation=serializers.CharField()
4955
disembarkation=serializers.CharField()
5056
year=serializers.IntegerField()
5157
month=serializers.IntegerField()
5258
day=serializers.IntegerField()
5359
ship_name=serializers.CharField()
60+
outcomes=PastVoyageOutcomesSerializer(many=False)
5461
class Meta:
55-
model=Voyage
5662
fields=[
5763
'id',
5864
'embarkation',
5965
'disembarkation',
6066
'year',
6167
'month',
6268
'day',
63-
'ship_name'
69+
'ship_name',
70+
'outcomes'
6471
]
6572

6673

@@ -106,21 +113,11 @@ def get_gender(self,instance) -> serializers.CharField():
106113
else:
107114
gender=None
108115
return gender
109-
110116

111117
def get_sources(self,instance) -> PastSourceSerializer(many=True):
112-
escs=instance.enslaved_source_connections.all()
113-
sources_dict={}
114-
for esc in escs:
115-
page_range=esc.page_range
116-
s=esc.source
117-
s_id=s.id
118-
s.page_ranges=[page_range]
119-
if s_id not in sources_dict:
120-
sources_dict[s_id]=s
121-
else:
122-
sources_dict[s_id].page_ranges.append(page_range)
123-
return PastSourceSerializer([sources_dict[i] for i in sources_dict],many=True,read_only=True).data
118+
source_ids=list(set([i[0] for i in Enslaved.objects.all().filter(id=instance.id).values_list('enslaved_relations__relation__voyage__voyage_source_connections__source')]))
119+
sources=Source.objects.all().filter(id__in=source_ids)
120+
return PastSourceSerializer(sources,many=True,read_only=True).data
124121

125122
def get_voyages(self,instance) -> PastEnslavedVoyageSerializer(many=False):
126123
#right now, the table layouts, basically everything assume a single voyage per enslaved person
@@ -148,14 +145,24 @@ def get_voyages(self,instance) -> PastEnslavedVoyageSerializer(many=False):
148145
if not ship_name:
149146
ship_name="ship unknown"
150147

148+
particular_outcome=v.voyage_outcome.particular_outcome
149+
if not particular_outcome:
150+
particular_outcome="outcome unknown"
151+
else:
152+
particular_outcome=particular_outcome.name
153+
154+
151155
voyagedict={
152156
'id':v.id,
153157
'embarkation':embark,
154158
'disembarkation':disembark,
155159
'year':year,
156160
'month':month,
157161
'day':day,
158-
'ship_name':ship_name
162+
'ship_name':ship_name,
163+
'outcomes':{
164+
'particular_outcome':particular_outcome
165+
}
159166
}
160167

161168
return PastEnslavedVoyageSerializer(voyagedict,many=False,read_only=True).data
@@ -233,6 +240,12 @@ def get_names(self,instance) -> ListField(child=serializers.CharField()):
233240
return aliases
234241

235242
def get_sources(self,instance) -> PastSourceSerializer(many=True):
243+
source_ids=list(set([i[0] for i in EnslaverIdentity.objects.all().filter(id=instance.id).values_list('aliases__enslaver_relations__relation__voyage__voyage_source_connections__source__id')]))
244+
sources=Source.objects.all().filter(id__in=source_ids)
245+
return PastSourceSerializer(sources,many=True,read_only=True).data
246+
247+
248+
236249
escs=instance.enslaver_source_connections.all()
237250
sources_dict={}
238251
for esc in escs:

0 commit comments

Comments
 (0)