Skip to content

Commit

Permalink
#2187 support ordering keywords for preprints.
Browse files Browse the repository at this point in the history
  • Loading branch information
ajrbyers authored and Andy Byers committed Oct 11, 2021
1 parent 58e6cce commit 3d0d3be
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 19 deletions.
1 change: 1 addition & 0 deletions src/core/model_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ class JanewayMultilingualManager(MultilingualManager):
def get_queryset(self):
return JanewayMultilingualQuerySet(self.model)


class M2MOrderedThroughField(ManyToManyField):
""" Orders m2m related objects by their 'through' Model
Expand Down
13 changes: 2 additions & 11 deletions src/repository/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
from press import models as press_models
from review.forms import render_choices
from core import models as core_models
from utils import forms as utils_forms


class PreprintInfo(forms.ModelForm):
class PreprintInfo(utils_forms.KeywordModelForm):
submission_agreement = forms.BooleanField(
widget=forms.CheckboxInput(),
required=True,
)
keywords = forms.CharField(required=False)
subject = forms.ModelMultipleChoiceField(
required=True,
queryset=models.Subject.objects.none(),
Expand Down Expand Up @@ -134,15 +134,6 @@ def save(self, commit=True):

preprint.repository = self.request.repository

posted_keywords = self.cleaned_data['keywords'].split(',')
for keyword in posted_keywords:
new_keyword, c = submission_models.Keyword.objects.get_or_create(word=keyword)
preprint.keywords.add(new_keyword)

for keyword in preprint.keywords.all():
if keyword.word not in posted_keywords:
preprint.keywords.remove(keyword)

if self.request:
additional_fields = models.RepositoryField.objects.filter(
repository=self.request.repository,
Expand Down
74 changes: 74 additions & 0 deletions src/repository/migrations/0025_create_keyword_preprint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2021-09-29 11:27
from __future__ import unicode_literals

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


def migrate_keywords(apps, schema_editor):
Preprint = apps.get_model('repository', 'Preprint')
KeywordPreprint = apps.get_model('repository', 'KeywordPreprint')

for preprint in Preprint.objects.all():
for i, kw in enumerate(preprint.keywords.all()):
kw_article, _ = KeywordPreprint.objects.get_or_create(
keyword=kw,
preprint=preprint,
defaults={
'order': i,
}
)


def demigrate_keywords(apps, schema_editor):
KeywordPreprint = apps.get_model('submission', 'KeywordArticle')

for kw_preprint in KeywordPreprint.objects.all():
kw_preprint.article.keywords.add(kw_preprint.keyword)


class Migration(migrations.Migration):

dependencies = [
('submission', '0058_auto_20210812_1254'),
('repository', '0024_auto_20210812_1304'),
]

operations = [
migrations.CreateModel(
name='KeywordPreprint',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.PositiveIntegerField(default=1)),
('keyword', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='submission.Keyword')),
],
options={
'ordering': ['order'],
},
),
migrations.AddField(
model_name='keywordpreprint',
name='preprint',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='repository.Preprint'),
),

# Migrate keywords onto KeywordPreprint before we change Preprint.keywords
migrations.RunPython(migrate_keywords, reverse_code=demigrate_keywords),

migrations.RemoveField(
model_name='preprint',
name='keywords',
),
migrations.AddField(
model_name='preprint',
name='keywords',
field=models.ManyToManyField(blank=True, null=True, through='repository.KeywordPreprint',
to='submission.Keyword'),
),
migrations.AlterUniqueTogether(
name='keywordpreprint',
unique_together=set([('keyword', 'preprint')]),
),
]
23 changes: 19 additions & 4 deletions src/repository/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,10 +331,9 @@ class Preprint(models.Model):
blank=False,
null=True,
)
keywords = models.ManyToManyField(
'submission.Keyword',
blank=True,
null=True,
keywords = model_utils.M2MOrderedThroughField(
"submission.Keyword",
blank=True, null=True, through='repository.KeywordPreprint',
)
license = models.ForeignKey(
'submission.Licence',
Expand Down Expand Up @@ -595,6 +594,22 @@ def local_url(self):
return url


class KeywordPreprint(models.Model):
keyword = models.ForeignKey("submission.Keyword")
preprint = models.ForeignKey(Preprint)
order = models.PositiveIntegerField(default=1)

class Meta:
ordering = ["order"]
unique_together = ('keyword', 'preprint')

def __str__(self):
return self.keyword.word

def __repr__(self):
return "KeywordPreprint(%s, %d)" % (self.keyword.word, self.preprint.id)


class PreprintFile(models.Model):
preprint = models.ForeignKey(Preprint)
file = models.FileField(
Expand Down
1 change: 1 addition & 0 deletions src/submission/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ def __repr__(self):

class ArticleManager(models.Manager):
use_in_migrations = True

def get_queryset(self):
return super(ArticleManager, self).get_queryset().all()

Expand Down
9 changes: 5 additions & 4 deletions src/utils/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,11 @@ class KeywordModelForm(ModelForm):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
current_keywords = self.instance.keywords.values_list(
"word", flat=True)
field = self.fields["keywords"]
field.initial = ",".join(current_keywords)
if self.instance.pk:
current_keywords = self.instance.keywords.values_list(
"word", flat=True)
field = self.fields["keywords"]
field.initial = ",".join(current_keywords)

def save(self, commit=True, *args, **kwargs):
instance = super().save(commit=commit, *args, **kwargs)
Expand Down

0 comments on commit 3d0d3be

Please sign in to comment.