diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py index cb5b11d4bc6ea39ec73f242818ed3c5c5ebd5435..eaeb305c248143f2cd81d8aecb3ce5c75a3bab26 100644 --- a/SciPost_v1/urls.py +++ b/SciPost_v1/urls.py @@ -4,15 +4,27 @@ from django.conf.urls.static import static from django.contrib import admin from ajax_select import urls as ajax_select_urls +from rest_framework import routers +from news.viewsets import NewsItemViewSet from journals.constants import REGEX_CHOICES +# Journal URL Regex JOURNAL_REGEX = '(?P<doi_label>%s)' % REGEX_CHOICES + +# API Routing +router = routers.SimpleRouter() +router.register(r'news', NewsItemViewSet) +urlpatterns = router.urls + + +# Base URLs urlpatterns = [ url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^ajax_select/', include(ajax_select_urls)), + url(r'^api/', include(router.urls, namespace='api')), url(r'^docs/', include('sphinxdoc.urls')), url(r'^10.21468/%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")), url(r'^%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")), diff --git a/news/admin.py b/news/admin.py index 43253c6cc5b48d7b606f34ea7e5f57f639625ee2..6b8247d5b8259ff183cad3368b21c1724ab9be10 100644 --- a/news/admin.py +++ b/news/admin.py @@ -5,6 +5,7 @@ from .models import NewsItem class NewsItemAdmin(admin.ModelAdmin): search_fields = ['blurb', 'followup_link_text'] + list_display = ['__str__', 'on_homepage'] admin.site.register(NewsItem, NewsItemAdmin) diff --git a/news/managers.py b/news/managers.py new file mode 100644 index 0000000000000000000000000000000000000000..456c26cacb4156cba454993f05a37c30dd36d267 --- /dev/null +++ b/news/managers.py @@ -0,0 +1,6 @@ +from django.db import models + + +class NewsManager(models.Manager): + def homepage(self): + return self.filter(on_homepage=True) diff --git a/news/migrations/0002_newsitem_on_homepage.py b/news/migrations/0002_newsitem_on_homepage.py new file mode 100644 index 0000000000000000000000000000000000000000..63a77ba1e3ac5ff1de43e51a6f93dfab1c596a55 --- /dev/null +++ b/news/migrations/0002_newsitem_on_homepage.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-08-01 16:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('news', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='newsitem', + name='on_homepage', + field=models.BooleanField(default=True), + ), + ] diff --git a/news/models.py b/news/models.py index a8992a3e7c5464b359a81208f4240c589e901320..0961cbe72c6a1c31e6a449044d3e5cef6191fe18 100644 --- a/news/models.py +++ b/news/models.py @@ -1,5 +1,7 @@ from django.db import models +from .managers import NewsManager + class NewsItem(models.Model): date = models.DateField() @@ -7,6 +9,9 @@ class NewsItem(models.Model): blurb = models.TextField() followup_link = models.URLField(blank=True, null=True) followup_link_text = models.CharField(max_length=300, blank=True, null=True) + on_homepage = models.BooleanField(default=True) + + objects = NewsManager() class Meta: db_table = 'scipost_newsitem' diff --git a/news/serializers.py b/news/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..b15e000ef0734648b5370535df4021654b924db7 --- /dev/null +++ b/news/serializers.py @@ -0,0 +1,18 @@ +from rest_framework import serializers + +from .models import NewsItem + + +class NewsItemSerializer(serializers.ModelSerializer): + date = serializers.DateField(format='%-d %B %Y') + + class Meta: + model = NewsItem + fields = ( + 'id', + 'date', + 'headline', + 'blurb', + 'followup_link', + 'followup_link_text', + ) diff --git a/news/templates/news/news_card_content_for_api.html b/news/templates/news/news_card_content_for_api.html new file mode 100644 index 0000000000000000000000000000000000000000..37e55edb21ba3131115cc549fe48d0aeea2d0bbd --- /dev/null +++ b/news/templates/news/news_card_content_for_api.html @@ -0,0 +1,12 @@ +<div class="card-block px-0 py-2 news-item"> + <h3 class="card-title mb-0 pb-0">{{headline}}</h3> + <div> + <h5 class="text-muted mb-2">{{date}}</h5> + <div> + {{blurb|slice:":90"}} (...) + + <br> + <a href="{% url 'news:news' %}#news_{{id}}" class="my-1 d-inline-block">Read more</a> + </div> + </div> +</div> diff --git a/news/viewsets.py b/news/viewsets.py new file mode 100644 index 0000000000000000000000000000000000000000..ed6b0dc63c984919def918e1c98e4a976df26647 --- /dev/null +++ b/news/viewsets.py @@ -0,0 +1,26 @@ +from django.http import Http404 + +from rest_framework import viewsets, renderers +from rest_framework.response import Response + +from .models import NewsItem +from .serializers import NewsItemSerializer + + +class NewsItemViewSet(viewsets.ReadOnlyModelViewSet): + queryset = NewsItem.objects.all().order_by('-date') + serializer_class = NewsItemSerializer + template_name = 'news/news_card_content_for_api.html' + renderer_classes = (renderers.BrowsableAPIRenderer, renderers.TemplateHTMLRenderer, renderers.JSONRenderer) + + def get(self, request, *args, **kwargs): + response = super().get(request, *args, **kwargs) + if request.accepted_renderer.format == 'html': + return Response({'news': self.get_object()}) + return response + + def list(self, request, *args, **kwargs): + response = super().list(request, *args, **kwargs) + if request.accepted_renderer.format == 'html': + raise Http404 + return response diff --git a/scipost/static/scipost/assets/js/newsticker.js b/scipost/static/scipost/assets/js/newsticker.js new file mode 100644 index 0000000000000000000000000000000000000000..ae65040e66115943275e0acd265001b794832730 --- /dev/null +++ b/scipost/static/scipost/assets/js/newsticker.js @@ -0,0 +1,67 @@ +/*! +Werkplaats Planner v0.1 +(c) 2017 Jorran de Wit + */ + +// var $ = require('jQuery'); +var NewsTicker; + + +NewsTicker = (function() { + NewsTicker.prototype.items = []; + + NewsTicker.prototype.defaults = { + url: '/api', + interval: 8000, + }; + + function NewsTicker(element, options) { + this.element = element; + this.options = $.extend({}, this.defaults, options); + + // Start building... + this.start_ticker() + }; + + NewsTicker.prototype.get_item = function(item) { + var self = this + + $.get(this.options.url + '/' + item.id + '/?format=html') + .done(function(data) { + self.element.fadeOut(function() { + self.element.html(data).fadeIn() + }) + }) + }; + + NewsTicker.prototype.start_ticker = function() { + var self = this + var time = 0; + + $.get(this.options.url + '?format=json') + .done(function(data) { + $.each(data, function(index, item) { + setTimeout( function(){ self.get_item(item); }, time) + time += self.options.interval; + }) + }); + }; + + return NewsTicker; +})(); + + +(function($) { + // Extend jQuery + $.fn.scipost_newsticker = function(options) { + var ticker = new NewsTicker(this, options) + console.log('SciPost NewTicker') + return this; + } + + // Start + $('#news ul').scipost_newsticker({ + url: 'api/news', + interval: 6000 + }) +}(jQuery)); diff --git a/scipost/templates/scipost/index.html b/scipost/templates/scipost/index.html index 52b9b98b4d7c47555a07d2749aed50b64813ff41..62bfb8301035ccabe60c611cb9119ff800ed14ad 100644 --- a/scipost/templates/scipost/index.html +++ b/scipost/templates/scipost/index.html @@ -1,5 +1,6 @@ {% extends 'scipost/base_for_sidebar.html' %} +{% load render_bundle from webpack_loader %} {% load staticfiles %} {% block body_class %}{{block.super}} has-sidebar has-breadcrumb-submenu homepage{% endblock %} @@ -13,6 +14,10 @@ </nav> {% endblock %} +{% block footer_script %} + {% render_bundle 'homepage' 'js' %} +{% endblock %} + {% block content %} <div class="row"> <div class="col-lg-6"> @@ -77,7 +82,7 @@ {% endif %} <!-- News --> - <div class="card card-grey"> + <div class="card card-grey" id="news"> <div class="card-header border-0"> <h2 class="card-title mb-0"> News diff --git a/webpack.config.js b/webpack.config.js index a14943764e184c56b3168445a66e0a08806a853e..9c36140fc0be4445270b73b99f20ad74c799b01c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -15,6 +15,9 @@ module.exports = { bootstrap: [ 'bootstrap-loader' ], + homepage: [ + "./scipost/static/scipost/assets/js/newsticker.js", + ], tooltip: "./scipost/static/scipost/assets/js/tooltip.js", modal: "./scipost/static/scipost/assets/js/modal.js", },