Parcourir la source

Merge branch 'news_feed' into demo_ffdn

Conflicts:
	coin/templates/base.html
Baptiste Jonglez il y a 10 ans
Parent
commit
8d6bc297c7

+ 33 - 0
coin/members/templates/members/index.html

@@ -16,6 +16,39 @@
         <h3>Stats</h3>
         <div class="panel">Use MOAR bandwidth !</div>
     </div>
+    <div class="large-6 columns">
+        <h3>News de nous</h3>
+        <div class="panel" id="feed_isp"><i class="fa fa-spinner fa-spin"></i>
+ Chargement en cours</div>
+    </div>
+    <div class="large-6 columns">
+        <h3>News de FFDN</h3>
+        <div class="panel" id="feed_ffdn"><i class="fa fa-spinner fa-spin"></i>
+ Chargement en cours</div>
+    </div>
 </div>
 
 {% endblock %}
+
+
+{% block js %}
+    {{ block.super }}
+    <script>
+    $(function() {
+        $.ajax({
+            url: "{% url 'feed' feed_name='isp' %}",
+        }).done(function(html) {
+            $('#feed_isp').html(html);
+        }).fail(function() {
+            $('#feed_ffdn').html('Erreur lors du chargement du flux');
+        });
+        $.ajax({
+            url: "{% url 'feed' feed_name='ffdn' %}",
+        }).done(function(html) {
+            $('#feed_ffdn').html(html);
+        }).fail(function() {
+            $('#feed_ffdn').html('Erreur lors du chargement du flux');
+        });
+    });
+    </script>
+{% endblock js %}

+ 1 - 1
coin/members/urls.py

@@ -50,5 +50,5 @@ urlpatterns = patterns(
     # url(r'^subscription/(?P<id>\d+)', views.subscriptions, name = 'subscription'),
 
     url(r'^invoices/', views.invoices, name='invoices'),
-    url(r'^contact/', views.contact, name='contact')
+    url(r'^contact/', views.contact, name='contact'),
 )

+ 5 - 0
coin/settings.py

@@ -250,6 +250,11 @@ MEMBER_DEFAULT_COTISATION = 20
 # Reset session if cookie older than 2h.
 SESSION_COOKIE_AGE = 7200
 
+# RSS/Atom feeds to display on dashboard
+# feed name (used in template), url, max entries to display
+FEEDS = (('isp', 'http://www.illyse.net/feed/', 3),
+         ('ffdn', 'http://www.ffdn.org/fr/rss.xml', 3))
+
 # Surcharge les paramètres en utilisant le fichier settings_local.py
 try:
     from settings_local import *

+ 12 - 0
coin/static/css/illyse.css

@@ -270,6 +270,18 @@ tr.inactive {
 	border: 2px solid #C0C0C0;
 }
 
+/* Feeds */
+.feed {
+    font-size:80%;
+}
+.feed .entry {
+    margin-bottom:1em;
+}
+.feed .entry .date {
+    color:gray;
+    font-size:80%;
+}
+
 .legend .button, .formcontrol .button {
 	padding: 0.25em 0.5em;
 	border-radius:5px;

+ 3 - 4
coin/templates/base.html

@@ -65,10 +65,9 @@
     <script src="{% static "js/foundation.min.js" %}"></script>
     <script src="{% static "js/foundation/foundation.offcanvas.js" %}"></script>
     <script src="{% static "js/illyse.js" %}"></script>
-    {% block js %}{% endblock %}
+    <script> $(document).foundation(); </script>
+
+    {% block js %}{% endblock js %}
 
-    <script>
-      $(document).foundation();
-    </script>
   </body>
 </html>

+ 11 - 0
coin/templates/fragments/feed.html

@@ -0,0 +1,11 @@
+<div class="feed">
+{% for entry in feed_entries %}
+    <div class="entry">
+        <div class="date">{{ entry.published_parsed.tm_mday }}/{{ entry.published_parsed.tm_mon }}/{{ entry.published_parsed.tm_year }}</div>
+        <h5><a href="{{ entry.link }}" target="_blank">{{ entry.title }}</a></h5>
+        <div class="intro">
+            {{ entry.summary|striptags|safe|truncatewords:50 }}
+        </div>
+    </div>
+{% endfor %}
+</div>

+ 6 - 1
coin/urls.py

@@ -6,6 +6,9 @@ from django.conf.urls import patterns, include, url
 from django.conf.urls.static import static
 from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
+from coin import views
+
+
 import autocomplete_light
 autocomplete_light.autodiscover()
 
@@ -27,7 +30,9 @@ urlpatterns = patterns(
     url(r'^admin/', include(admin.site.urls)),
 
     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-    
+
+    url(r'^feed/(?P<feed_name>.+)', views.feed, name='feed'),
+
     url(r'^autocomplete/', include('autocomplete_light.urls')),
 
 )

+ 43 - 0
coin/views.py

@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import feedparser
+import HTMLParser
+
+from django.views.decorators.cache import cache_page
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from django.http import HttpResponse, HttpResponseNotFound, HttpResponseServerError
+from django.conf import settings
+
+
+@cache_page(60 * 60 * 24) # Cache 24h
+def feed(request, feed_name):
+    feeds = settings.FEEDS
+    feed = None
+    # Recherce le flux passé en paramètre dans les flux définis dans settings
+    for feed_search in feeds:
+        if (feed_search[0] == feed_name):
+            feed = feed_search
+            break
+
+    # Si le flux n'a pas été trouvé ou qu'il n'y a pas d'URL donnée, renvoi 404
+    if not feed or len(feed)<2 or not feed[1]:
+        return HttpResponseNotFound('')
+    # Sinon récupère les informations (url et limit)
+    else:
+        feed_url = feed[1]
+        if len(feed) >=3:
+            limit = feed[2]
+        else:
+            limit = 3
+
+    try:
+        feed = feedparser.parse(feed_url)
+        entries = feed.entries[:limit]
+
+        return render_to_response('fragments/feed.html',
+                                  {'feed_entries': entries},
+                                  context_instance=RequestContext(request))
+    except:
+        return HttpResponseServerError('')

+ 1 - 0
requirements.txt

@@ -12,3 +12,4 @@ django-sendfile==0.3.6
 -e git+https://code.ffdn.org/zorun/django-postgresql-netfields.git#egg=django-netfields
 -e git+https://github.com/chrisglass/xhtml2pdf@a5d37ffd0ccb0603bdf668198de0f21766816104#egg=xhtml2pdf-master
 -e git+https://github.com/jlaine/django-ldapdb@1c4f9f29e52176f4367a1dffec2ecd2e123e2e7a#egg=django-ldapdb
+feedparser