Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 74 additions & 15 deletions admin.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,94 @@
from django.contrib import admin

from plugins.books.models import *
import plugins.books.models as models


@admin.register(models.BookSetting)
class BookSettingAdmin(admin.ModelAdmin):
list_display = ('book_page_title',)


class ContributorLinkInline(admin.TabularInline):
model = models.ContributorLink
extra = 1
raw_id_fields = ('contributor',)


@admin.register(models.Chapter)
class ChapterAdmin(admin.ModelAdmin):
"""Displays objects in the Django admin interface."""
list_display = ('title', 'number', 'book', 'pages', 'doi')
list_filter = ('book',)
search_fields = ('title',)
search_fields = ('title', 'book__title', 'doi')
raw_id_fields = ('book',)
filter_horizontal = ('contributors',)
inlines = [ContributorLinkInline]


@admin.register(models.BookAccess)
class BookAccessAdmin(admin.ModelAdmin):
list_display = ('book', 'chapter', 'type', 'format', 'country', 'accessed')
list_filter = ('book', 'type', 'format', 'country')
search_fields = ('book__title', 'chapter__title')


@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher_name', 'date_published', 'is_open_access')
list_filter = ('is_open_access', 'peer_reviewed', 'date_published', 'categories')
search_fields = ('title', 'subtitle', 'publisher_name', 'isbn', 'doi')
filter_horizontal = ('keywords', 'publisher_notes', 'linked_repository_objects', 'categories')


@admin.register(models.Contributor)
class ContributorAdmin(admin.ModelAdmin):
list_display = ('last_name', 'first_name', 'affiliation')
search_fields = ('first_name', 'last_name', 'affiliation', 'email')


@admin.register(models.ContributorLink)
class ContributorLinkAdmin(admin.ModelAdmin):
list_display = ('contributor', 'book', 'chapter', 'order')
list_filter = ('book', 'chapter')
raw_id_fields = ('contributor', 'book', 'chapter')


@admin.register(models.Format)
class FormatAdmin(admin.ModelAdmin):
list_display = ('title', 'book', 'sequence')
list_filter = ('book',)
search_fields = ('book__title',)
search_fields = ('title', 'filename')
raw_id_fields = ('book',)


@admin.register(models.Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'slug', 'display_title')
search_fields = ('name', 'slug')


@admin.register(models.BookPreprint)
class BookPreprintAdmin(admin.ModelAdmin):
list_display = ('book', 'preprint', 'order')
list_filter = ('book',)
raw_id_fields = ('book', 'preprint')


@admin.register(models.KeywordBook)
class KeywordBookAdmin(admin.ModelAdmin):
list_display = ('keyword', 'book', 'order')
list_filter = ('book',)
search_fields = ('keyword__word',)
raw_id_fields = ('keyword', 'book')


@admin.register(models.KeywordChapter)
class KeywordChapterAdmin(admin.ModelAdmin):
list_display = ('keyword', 'chapter', 'order')
list_filter = ('chapter',)
search_fields = ('keyword__word',)
raw_id_fields = ('keyword', 'chapter')

admin_list = [
(Book, ),
(Contributor,),
(Format,),
(BookAccess, BookAccessAdmin),
(Chapter, ChapterAdmin),
(Category,),
(BookSetting, BookSettingAdmin)
]

[admin.site.register(*t) for t in admin_list]
@admin.register(models.PublisherNote)
class PublisherNoteAdmin(admin.ModelAdmin):
list_display = ('note',)
search_fields = ('note',)
16 changes: 7 additions & 9 deletions files.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,28 +58,26 @@ def serve_book_file(book_format):
raise Http404


def server_chapter_file(book_chapter):
def serve_chapter_format_file(chapter_format):
file_path = os.path.join(
settings.BASE_DIR,
'files',
'press',
'books',
book_chapter.filename,
chapter_format.filename,
)

if os.path.isfile(file_path):
filename, extension = os.path.splitext(book_chapter.filename)
filename, extension = os.path.splitext(chapter_format.filename)
response = StreamingHttpResponse(
FileWrapper(open(file_path, 'rb'), 8192),
content_type=files.guess_mime(book_chapter.filename),
content_type=files.guess_mime(chapter_format.filename),
)
response['Content-Length'] = os.path.getsize(file_path)
response['Content-Disposition'] = 'attachment;' \
' filename="{0}{1}"'.format(
slugify(book_chapter.title),
extension
response['Content-Disposition'] = 'attachment; filename="{0}{1}"'.format(
slugify(chapter_format.chapter.title),
extension,
)

return response
else:
raise Http404
Expand Down
131 changes: 112 additions & 19 deletions forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django_summernote.widgets import SummernoteWidget

from plugins.books import models, files
from repository import models as repository_models


class DateInput(forms.DateInput):
Expand Down Expand Up @@ -44,40 +45,55 @@ class BookForm(forms.ModelForm):

class Meta:
model = models.Book
exclude = ('keywords', 'publisher_notes')
exclude = ('keywords', 'publisher_notes', 'linked_repository_objects', 'contributors')
widgets = {
'description': SummernoteWidget(),
'notes': SummernoteWidget(),
'date_published': DateInput(),
'date_embargo': DateInput(),
}


class ContributorForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
book = kwargs.pop('book', None)
super(ContributorForm, self).__init__(*args, **kwargs)

self.fields['sequence'].initial = book.get_next_contributor_sequence()

class Meta:
model = models.Contributor
exclude = ('book',)
fields = (
'is_corporate',
'corporate_name',
'first_name',
'middle_name',
'last_name',
'affiliation',
'email',
'bio',
'headshot',
)
widgets = {
'bio': SummernoteWidget(),
}


class FormatForm(forms.ModelForm):

file = forms.FileField()

def __init__(self, *args, **kwargs):
super(FormatForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk and self.instance.filename:
self.fields['file'].required = False

class Meta:
model = models.Format
exclude = ('book', 'filename')

def save(self, commit=True, *args, **kwargs):
save_format = super(FormatForm, self).save(commit=False)
file = self.cleaned_data["file"]
filename = files.save_file_to_disk(file, save_format)
save_format.filename = filename

if file:
filename = files.save_file_to_disk(file, save_format)
save_format.filename = filename

if commit:
save_format.save()
Expand All @@ -90,15 +106,56 @@ def clean(self):
return cleaned_data


class ChapterFormatForm(forms.ModelForm):

file = forms.FileField()

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk and self.instance.filename:
self.fields['file'].required = False

class Meta:
model = models.ChapterFormat
exclude = ('chapter', 'filename')

def save(self, commit=True, *args, **kwargs):
chapter_format = super().save(commit=False)
file = self.cleaned_data.get('file')

if file:
filename = files.save_file_to_disk(file, chapter_format)
chapter_format.filename = filename

if commit:
chapter_format.save()

return chapter_format


class ChapterForm(forms.ModelForm):

contributors = forms.ModelMultipleChoiceField(
queryset=models.Contributor.objects.none(),
required=False,
)

def __init__(self, *args, **kwargs):
items = kwargs.pop('items', None)
super(ChapterForm, self).__init__(*args, **kwargs)
self.fields['contributors'].widget = TableMultiSelect(items=items)
self.fields['contributors'].required = False

file = forms.FileField(required=False)
# Set queryset from items
pks = [row.get('object').pk for row in items if row.get('object')]
self.fields['contributors'].queryset = models.Contributor.objects.filter(
pk__in=pks,
)
# Set initial from existing ContributorLinks
if self.instance and self.instance.pk:
self.fields['contributors'].initial = list(
models.ContributorLink.objects.filter(
chapter=self.instance,
).values_list('contributor_id', flat=True)
)

class Meta:
model = models.Chapter
Expand All @@ -111,7 +168,6 @@ class Meta:
'date_embargo',
'date_published',
'sequence',
'contributors',
'license_information',
'custom_how_to_cite',
]
Expand All @@ -122,16 +178,39 @@ def save(self, commit=True, book=None, *args, **kwargs):
if book:
save_chapter.book = book

file = self.cleaned_data["file"]
if file:
filename = files.save_file_to_disk(file, save_chapter)
save_chapter.filename = filename

if commit:
save_chapter.save()

return save_chapter

def save_chapter_contributors(self, chapter):
selected_contributors = self.cleaned_data.get('contributors', [])
existing_links = models.ContributorLink.objects.filter(chapter=chapter)

# Remove links for contributors no longer selected
existing_links.exclude(
contributor__in=selected_contributors,
).delete()

# Add links for newly selected contributors
existing_contributor_ids = set(
existing_links.values_list('contributor_id', flat=True)
)
next_order = (
existing_links.order_by('-order').values_list(
'order', flat=True,
).first() or 0
) + 1

for contributor in selected_contributors:
if contributor.pk not in existing_contributor_ids:
models.ContributorLink.objects.create(
contributor=contributor,
chapter=chapter,
order=next_order,
)
next_order += 1


class DateForm(forms.Form):
start_date = forms.DateField(widget=DateInput())
Expand Down Expand Up @@ -166,3 +245,17 @@ def save(self, commit=True):
save_category.save()

return save_category


class PreprintSelectionForm(forms.Form):
preprint_id = forms.ModelChoiceField(
queryset=repository_models.Preprint.objects.none(),
label="Select a Preprint",
required=True,
)

def __init__(self, *args, **kwargs):
available_preprints = kwargs.pop('available_preprints', None)
super().__init__(*args, **kwargs)
if available_preprints is not None:
self.fields['preprint_id'].queryset = available_preprints
25 changes: 25 additions & 0 deletions hooks.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,35 @@
from django.urls import reverse
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe

from utils.function_cache import cache



@cache(600)
def nav_hook(context):
return '<li><a href="{url}"><i class="fa fa-book"></i> Books</a></li>'.format(
url=reverse('books_admin')
)


def linked_books(context):
request = context.get("request")
preprint = context.get("preprint")

if not preprint or not hasattr(preprint, "get_linked_books"):
return ""

theme = getattr(preprint.repository, "theme", "OLH")
template_path = f"books/{theme}/repository_linked_books.html"

books = preprint.get_linked_books()

return mark_safe(render_to_string(
template_path,
{
"preprint": preprint,
"linked_books": books,
},
request=request,
))
Loading