SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 8d15624b authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Add basic models: Series, Collection

parent 79c838a2
No related branches found
No related tags found
Loading
...@@ -109,6 +109,7 @@ INSTALLED_APPS = ( ...@@ -109,6 +109,7 @@ INSTALLED_APPS = (
'production', 'production',
'rest_framework', 'rest_framework',
'scipost', 'scipost',
'series',
'stats', 'stats',
'submissions', 'submissions',
'theses', 'theses',
......
...@@ -70,6 +70,7 @@ urlpatterns = [ ...@@ -70,6 +70,7 @@ urlpatterns = [
url(r'^proceedings/', include('proceedings.urls', namespace="proceedings")), url(r'^proceedings/', include('proceedings.urls', namespace="proceedings")),
url(r'^production/', include('production.urls', namespace="production")), url(r'^production/', include('production.urls', namespace="production")),
url(r'^profiles/', include('profiles.urls', namespace="profiles")), url(r'^profiles/', include('profiles.urls', namespace="profiles")),
url(r'^series/', include('series.urls', namespace="series")),
url(r'^sponsors/', include('sponsors.urls', namespace="sponsors")), url(r'^sponsors/', include('sponsors.urls', namespace="sponsors")),
url(r'^stats/', include('stats.urls', namespace="stats")), url(r'^stats/', include('stats.urls', namespace="stats")),
# Deprecated, keep temporarily for historical reasons # Deprecated, keep temporarily for historical reasons
......
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.contrib import admin
from .models import Series, Collection, CollectionPublicationsTable
class SeriesAdmin(admin.ModelAdmin):
pass
admin.site.register(Series, SeriesAdmin)
class CollectionPublicationsTableAdmin(admin.StackedInline):
model = CollectionPublicationsTable
extra = 0
class CollectionAdmin(admin.ModelAdmin):
inlines = [
CollectionPublicationsTableAdmin,
]
admin.site.register(Collection, CollectionAdmin)
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.apps import AppConfig
class SeriesConfig(AppConfig):
name = 'series'
# Generated by Django 2.1.8 on 2019-11-11 20:05
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('journals', '0085_auto_20191017_0949'),
]
operations = [
migrations.CreateModel(
name='Collection',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, max_length=256)),
('slug', models.SlugField(allow_unicode=True, unique=True)),
('description', models.TextField(blank=True, help_text='You can use plain text, Markdown or reStructuredText; see our <a href="/markup/help/" target="_blank">markup help</a> pages.')),
('event_start_date', models.DateField(blank=True, null=True)),
('event_end_date', models.DateField(blank=True, null=True)),
('logo', models.ImageField(blank=True, upload_to='series/images/')),
('cover_image', models.ImageField(blank=True, upload_to='series/images/')),
],
),
migrations.CreateModel(
name='CollectionPublicationsTable',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.PositiveSmallIntegerField()),
('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='series.Collection')),
('publication', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='journals.Publication')),
],
options={
'ordering': ['order'],
},
),
migrations.CreateModel(
name='Series',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, max_length=256)),
('slug', models.SlugField(allow_unicode=True, unique=True)),
('description', models.TextField(help_text='You can use plain text, Markdown or reStructuredText; see our <a href="/markup/help/" target="_blank">markup help</a> pages.')),
('image', models.ImageField(blank=True, upload_to='series/images/')),
],
),
migrations.AddField(
model_name='collection',
name='publications',
field=models.ManyToManyField(blank=True, through='series.CollectionPublicationsTable', to='journals.Publication'),
),
migrations.AddField(
model_name='collection',
name='series',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='series.Series'),
),
migrations.AlterUniqueTogether(
name='collectionpublicationstable',
unique_together={('collection', 'order')},
),
]
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.db import models
from django.urls import reverse
class Series(models.Model):
"""
Anchor for a series of thematically-related Collections.
"""
name = models.CharField(max_length=256, blank=True)
slug = models.SlugField(unique=True, allow_unicode=True)
description = models.TextField(
help_text=('You can use plain text, Markdown or reStructuredText; see our '
'<a href="/markup/help/" target="_blank">markup help</a> pages.')
)
image = models.ImageField(upload_to='series/images/', blank=True)
class Meta:
verbose_name_plural = 'series'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('series:series_detail', kwargs={'slug': self.slug})
class Collection(models.Model):
"""
A set of Publications which form a coherent whole.
"""
series = models.ForeignKey(
'series.Series',
blank=True, null=True,
on_delete=models.CASCADE
)
name = models.CharField(max_length=256, blank=True)
slug = models.SlugField(unique=True, allow_unicode=True)
description = models.TextField(
blank=True,
help_text=('You can use plain text, Markdown or reStructuredText; see our '
'<a href="/markup/help/" target="_blank">markup help</a> pages.')
)
event_start_date = models.DateField(null=True, blank=True)
event_end_date = models.DateField(null=True, blank=True)
logo = models.ImageField(upload_to='series/images/', blank=True)
cover_image = models.ImageField(upload_to='series/images/', blank=True)
publications = models.ManyToManyField(
'journals.Publication',
through='series.CollectionPublicationsTable',
blank=True
)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('series:collection_detail', kwargs={'slug': self.slug})
class CollectionPublicationsTable(models.Model):
collection = models.ForeignKey(
'series.Collection',
on_delete=models.CASCADE
)
publication = models.ForeignKey(
'journals.Publication',
on_delete=models.CASCADE
)
order = models.PositiveSmallIntegerField()
class Meta:
ordering = ['order',]
unique_together = ['collection', 'order']
def __str__(self):
return 'In Collection %s: publication %s' % (
str(self.collection), str(self.publication))
{% extends 'scipost/base.html' %}
{% block breadcrumb %}
<div class="breadcrumb-container">
<div class="container">
<nav class="breadcrumb hidden-sm-down">
{% block breadcrumb_items %}
<a href="{% url 'series:series' %}" class="breadcrumb-item">Series</a>
{% endblock %}
</nav>
</div>
</div>
{% endblock %}
{% extends 'series/series_base.html' %}
{% load bootstrap %}
{% load automarkup %}
{% block breadcrumb_items %}
{{ block.super }}
<span class="breadcrumb-item">Series detail</span>
{% endblock %}
{% block pagetitle %}: Series detail{% endblock pagetitle %}
{% block content %}
<div class="row">
<div class="col-12">
<h2 class="highlight">
{{ series.name }}
</h2>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="p-2">
{{ series.description|automarkup }}
</div>
<div class="p-2">
<img class="d-flex mr-3" alt="series image" src="{{ series.image.url }}">
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<h3 class="highlight">Collections in this Series</h3>
<ul>
{% for collection in series.collection_set.all %}
<li><a href="{{ collection.get_absolute_url }}">{{ collection }}</a></li>
{% empty %}
<li>No Collection has yet been assembled for this Series</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock content %}
{% extends 'series/series_base.html' %}
{% load bootstrap %}
{% load automarkup %}
{% block breadcrumb_items %}
{{ block.super }}
<span class="breadcrumb-item">Series</span>
{% endblock %}
{% block pagetitle %}: Series{% endblock pagetitle %}
{% block content %}
<div class="row">
<div class="col-12">
<h2 class="highlight">
Series
</h2>
<ul>
{% for series in object_list %}
<li><a href="{{ series.get_absolute_url }}">{{ series }}</a></li>
{% empty %}
<li>No Series has yet been defined</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock content %}
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.test import TestCase
# Create your tests here.
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.urls import path
from . import views
app_name = 'series'
urlpatterns = [
path(
'',
views.SeriesListView.as_view(),
name='series'
),
path(
'<slug:slug>',
views.SeriesDetailView.as_view(),
name='series_detail'
),
path(
'collection/<slug:slug>',
views.CollectionDetailView.as_view(),
name='collection_detail'
),
]
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.shortcuts import render
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from .models import Series, Collection
class SeriesListView(ListView):
"""
List view for Series.
"""
model = Series
class SeriesDetailView(DetailView):
"""
Detail view for a Series.
"""
model = Series
class CollectionDetailView(DetailView):
"""
Detail view for a Collection.
"""
model = Collection
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment