Skip to content

Commit

Permalink
Merge branch 'main' into buttons
Browse files Browse the repository at this point in the history
  • Loading branch information
longhotsummer committed May 15, 2024
2 parents f86a78d + c5e84e6 commit 140b7cb
Show file tree
Hide file tree
Showing 16 changed files with 460 additions and 192 deletions.
2 changes: 1 addition & 1 deletion peachjam/js/components/FindDocuments/AdvancedSearch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export default {
// ensure there's an empty entry at the end
if (data[data.length - 1].text) {
data.push({ text: '', fields: [], exact: false, condition: 'AND' });
data.push({ text: '', fields: ['all'], exact: false, condition: 'AND' });
}
this.$emit('update:modelValue', data);
Expand Down
34 changes: 24 additions & 10 deletions peachjam/js/components/FindDocuments/AdvancedSearchFields.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@
>
<input
:id="`advanced-${targetIndex}-fields-${field.field}`"
:checked="field.field === 'ANY' && criterion.fields.length === 0 || criterion.fields.indexOf(field.field) > -1"
:checked="this.criterion.fields.includes(field.field)"
:disabled="field.field === 'all' && this.criterion.fields.includes(field.field)"
class="form-check-input"
type="checkbox"
@change="(e) => fieldChanged(field.field, e.target.checked)"
Expand Down Expand Up @@ -101,7 +102,7 @@ export default {
data: (self) => {
return {
fields: [{
field: 'ANY',
field: 'all',
label: self.$t('Any field')
},{
field: 'title',
Expand All @@ -126,15 +127,28 @@ export default {
this.$emit('on-change');
},
fieldChanged (field, checked) {
if (field === 'ANY') {
this.criterion.fields = [];
} else {
if (field === 'all') {
if (checked) {
if (!this.criterion.fields.includes(field)) {
this.criterion.fields.push(field);
}
} else {
this.criterion.fields = this.criterion.fields.filter((f) => f !== field);
// only 'all'
this.criterion.fields.splice(0, this.criterion.fields.length);
this.criterion.fields.push(field);
} else if (this.criterion.fields.includes(field) && this.criterion.fields.length > 1) {
// remove it
this.criterion.fields.splice(this.criterion.fields.indexOf(field), 1);
}
} else if (checked) {
// add it
if (!this.criterion.fields.includes(field)) {
this.criterion.fields.push(field);
}
if (this.criterion.fields.includes('all')) {
this.criterion.fields.splice(this.criterion.fields.indexOf('all'), 1);
}
} else if (this.criterion.fields.includes(field)) {
// remove it
this.criterion.fields.splice(this.criterion.fields.indexOf(field), 1);
if (this.criterion.fields.length === 0) {
this.criterion.fields.push('all');
}
}
this.changed();
Expand Down
77 changes: 41 additions & 36 deletions peachjam/js/components/FindDocuments/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,12 @@ export default {
params.append('facet', facet.name);
});
this.generateAdvancedSearchParams(params);
return params;
},
generateAdvancedSearchParams (params) {
// advanced search fields, if any
if (this.advancedSearchDateCriteria.date_from && this.advancedSearchDateCriteria.date_to) {
const dateFrom = this.advancedSearchDateCriteria.date_from;
Expand All @@ -620,9 +626,40 @@ export default {
params.append('date__lte', this.advancedSearchDateCriteria.date_to);
}
this.advancedSearchCriteria.forEach(criterion => this.addAdvancedSearchParams(criterion, params));
// group criteria by fields and process each field separately
const fields = new Map();
for (const criterion of this.advancedSearchCriteria) {
if (criterion.text) {
for (const field of criterion.fields) {
if (!fields.has(field)) fields.set(field, []);
fields.get(field).push(criterion);
}
}
}
return params;
for (const [field, criteria] of fields) {
params.set(`search__${field}`, this.generateAdvancedSearchQuery(criteria));
}
},
generateAdvancedSearchQuery (criteria) {
let q = '';
for (const criterion of criteria) {
const text = criterion.exact ? `"${criterion.text}"` : criterion.text;
if (criterion.condition === 'AND') {
q = q + ' & ';
} else if (criterion.condition === 'OR') {
q = q + ' | ';
} else if (criterion.condition === 'NOT') {
q = q + ' -';
}
q = q + `(${text})`;
}
return q.trim();
},
async search (pushState = true) {
Expand Down Expand Up @@ -717,13 +754,13 @@ export default {
resetAdvancedFields () {
this.advancedSearchCriteria = [{
text: '',
fields: [],
fields: ['all'],
condition: '',
exact: false
},
{
text: '',
fields: [],
fields: ['all'],
condition: 'AND',
exact: false
}];
Expand All @@ -734,38 +771,6 @@ export default {
};
},
addAdvancedSearchParams (criterion, params) {
if (!criterion.text) return;
let q = '';
const text = criterion.exact ? `"${criterion.text}"` : criterion.text;
let splitValue = text.match(/\w+|"[^"]+"/g);
if (criterion.condition === 'AND') {
const tokens = [];
splitValue.forEach((value) => {
if (value.startsWith('"')) {
tokens.push(value);
} else {
tokens.push('"' + value + '"');
}
});
splitValue = tokens.join(' ');
} else if (criterion.condition === 'OR') {
splitValue = `(|${splitValue.join('|')})`;
} else if (criterion.condition === 'NOT') {
splitValue = splitValue.map((value) => `-${value}`).join(' ');
} else splitValue = splitValue.join(' ');
q = q + ' ' + splitValue.trim();
const fields = criterion.fields.length ? criterion.fields.map(f => `search__${f}`) : ['search'];
for (const field of fields) {
params.set(field, (params.get(field)?.trim() || '') + ' ' + q.trim());
}
}
}
};
</script>
Expand Down
46 changes: 46 additions & 0 deletions peachjam/migrations/0129_work_citation_counts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated by Django 3.2.25 on 2024-05-14 06:18

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("peachjam", "0128_courtclass_show_listing_page"),
]

operations = [
migrations.AddField(
model_name="work",
name="n_cited_works",
field=models.IntegerField(default=0, verbose_name="number of cited works"),
),
migrations.AddField(
model_name="work",
name="n_citing_works",
field=models.IntegerField(
default=0, verbose_name="number of incoming citations"
),
),
migrations.AlterField(
model_name="extractedcitation",
name="citing_work",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="outgoing_citations",
to="peachjam.work",
verbose_name="citing work",
),
),
migrations.AlterField(
model_name="extractedcitation",
name="target_work",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="incoming_citations",
to="peachjam.work",
verbose_name="target work",
),
),
]
29 changes: 29 additions & 0 deletions peachjam/migrations/0130_backfill_citation_counts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 3.2.25 on 2024-05-14 06:19

from django.db import migrations
from django.db.models import Q


def backfill_citation_counts(apps, schema_editor):
Work = apps.get_model("peachjam", "Work")
ExtractedCitation = apps.get_model("peachjam", "ExtractedCitation")

qs = Work.objects.filter(
Q(outgoing_citations__isnull=False) | Q(incoming_citations__isnull=False)
)
for work in qs.order_by("-pk").distinct("pk").iterator(256):
work.n_cited_works = ExtractedCitation.objects.filter(citing_work=work).count()
work.n_citing_works = ExtractedCitation.objects.filter(target_work=work).count()
if work.n_cited_works or work.n_citing_works:
work.save(update_fields=["n_cited_works", "n_citing_works"])


class Migration(migrations.Migration):

dependencies = [
("peachjam", "0129_work_citation_counts"),
]

operations = [
migrations.RunPython(backfill_citation_counts, migrations.RunPython.noop)
]
10 changes: 8 additions & 2 deletions peachjam/models/citations.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,14 @@ class ExtractedCitation(models.Model):
"peachjam.Work",
null=False,
on_delete=models.CASCADE,
related_name="citing_work",
related_name="outgoing_citations",
verbose_name=_("citing work"),
)
target_work = models.ForeignKey(
"peachjam.Work",
null=False,
on_delete=models.CASCADE,
related_name="target_work",
related_name="incoming_citations",
verbose_name=_("target work"),
)

Expand All @@ -100,6 +100,12 @@ def for_target_works(cls, work):
.order_by("citing_work__title")
)

@classmethod
def update_counts_for_work(cls, work):
work.n_cited_works = cls.for_citing_works(work).count()
work.n_citing_works = cls.for_target_works(work).count()
work.save(update_fields=["n_cited_works", "n_citing_works"])


class CitationProcessing(SingletonModel):
processing_date = models.DateField(_("processing date"), null=True, blank=True)
Expand Down
8 changes: 6 additions & 2 deletions peachjam/models/core_document_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ class Work(models.Model):
)
# the rank (weight) of this work in the graph network, computer by peachjam.graph.ranker
ranking = models.FloatField(_("ranking"), null=True, blank=False, default=0.0)
# number of outgoing citations
n_cited_works = models.IntegerField(_("number of cited works"), default=0)
# number of incoming citations
n_citing_works = models.IntegerField(_("number of incoming citations"), default=0)

class Meta:
verbose_name = _("work")
Expand Down Expand Up @@ -217,11 +221,11 @@ def fetch_cited_works_frbr_uris(self):
return work_frbr_uris

def cited_works(self):
"""Return Shows a list of works cited by the current work."""
"""Returns a list of works cited by the current work."""
return ExtractedCitation.for_citing_works(self).values("target_work")

def works_citing_current_work(self):
"""Shows a list of works that cite the current work."""
"""Returns a list of works that cite the current work."""
return ExtractedCitation.for_target_works(self).values("citing_work")

def save(self, *args, **kwargs):
Expand Down
16 changes: 15 additions & 1 deletion peachjam/signals.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.db.models import signals
from django.dispatch import receiver

from peachjam.models import CoreDocument, SourceFile, Work
from peachjam.models import CoreDocument, ExtractedCitation, SourceFile, Work
from peachjam.tasks import update_extracted_citations_for_a_work


Expand Down Expand Up @@ -41,3 +41,17 @@ def convert_to_pdf(sender, instance, created, **kwargs):
"""Convert a source file to PDF when it's saved"""
if created:
instance.ensure_file_as_pdf()


@receiver(signals.post_save, sender=ExtractedCitation)
def extracted_citation_saved(sender, instance, **kwargs):
"""Update citation counts on works."""
ExtractedCitation.update_counts_for_work(instance.citing_work)
ExtractedCitation.update_counts_for_work(instance.target_work)


@receiver(signals.post_delete, sender=ExtractedCitation)
def extracted_citation_deleted(sender, instance, **kwargs):
"""Update citation counts on works."""
ExtractedCitation.update_counts_for_work(instance.citing_work)
ExtractedCitation.update_counts_for_work(instance.target_work)
2 changes: 1 addition & 1 deletion peachjam/static/js/app-prod.js

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions peachjam/templates/peachjam/_citations.html
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{% load peachjam i18n %}
<div class="container">
<div class="row">
<div class="col-sm mb-3">
<div class="col-lg mb-5">
<h4 class="mb-3">
<i class="bi bi-pj pj-citations"></i>
{% translate 'Cited documents' %} <span class="badge bg-secondary">{{ cited_documents_count }}</span>
{% translate 'Cited documents' %} <span class="badge bg-secondary">{{ document.work.n_cited_works }}</span>
</h4>
{% include 'peachjam/_citations_list.html' with citations=cited_documents group="outgoing" %}
</div>
<div class="col-sm">
<div class="col-lg">
<h4 class="mb-3">
{% translate 'Documents citing this one' %} <span class="badge bg-secondary">{{ documents_citing_current_doc_count }}</span>
{% translate 'Documents citing this one' %} <span class="badge bg-secondary">{{ document.work.n_citing_works }}</span>
</h4>
{% include 'peachjam/_citations_list.html' with citations=documents_citing_current_doc group="incoming" %}
</div>
Expand Down
27 changes: 14 additions & 13 deletions peachjam/templates/peachjam/_citations_list.html
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
{% load peachjam i18n %}
{% for item in citations %}
<h5 class="mt-3">
<h5 class="mt-4">
{{ item.doc_type }} <span class="badge bg-secondary">{{ item.docs|length }}</span>
</h5>
<ol class="mb-0">
{% for doc in item.docs|slice:":10" %}
<li class="{{ group }}">
<a href="{% url 'document_detail' frbr_uri=doc.work.frbr_uri|strip_first_character %}">{{ doc.title }}</a>
</li>
{% endfor %}
<table class="table table-striped table-borderless table-sm mb-0">
<colgroup>
<col />
<col style="width: 100%"/>
<col />
</colgroup>
<tbody>
{% include 'peachjam/_citations_list_items.html' with start=0 docs=item.docs|slice:":10" %}
</tbody>
{% if item.docs|length > 10 %}
{% for doc in item.docs|slice:"10:" %}
<li class="collapse {{ group }}-{{ forloop.parentloop.counter }}">
<a href="{% url 'document_detail' frbr_uri=doc.work.frbr_uri|strip_first_character %}">{{ doc.title }}</a>
</li>
{% endfor %}
<tbody class="collapse {{ group }}-{{ forloop.counter }}">
{% include 'peachjam/_citations_list_items.html' with start=10 docs=item.docs|slice:"10:" %}
</tbody>
{% endif %}
</ol>
</table>
{% if item.docs|length > 10 %}
<button class="btn btn-link"
data-bs-toggle="collapse"
Expand Down
Loading

0 comments on commit 140b7cb

Please sign in to comment.