Completed
Push — master ( e43325...f31dcf )
by
unknown
01:16
created

AbstractAtomFeedView.get_current_atom_feed()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
1
# -*- coding: utf-8 -*-
2
from feedgen.feed import FeedGenerator
3
import abc
4
5
6
class AbstractAtomFeedView:
7
8
    __metaclass__ = abc.ABCMeta
9
10
    @abc.abstractmethod
11
    def get_current_atom_feed(self):
12
        """
13
        Retrieve the current atom feed
14
        :return: JSON representation of the feed
15
        """
16
17
    @abc.abstractmethod
18
    def get_atom_feed(self):
19
        """
20
        Retrieve a particular feed identified by its id, identical to the source
21
        :return: JSON representation of the feed
22
        """
23
24
    @abc.abstractmethod
25
    def get_atom_feed_entry(self):
26
        """
27
        Retrieve a particular feed entry identified by its id, identical to the source
28
        :return: JSON representation of the feed entry
29
        """
30
31
    @abc.abstractmethod
32
    def archive_current_feed(self):
33
        """
34
        archive the current feed
35
        """
36
37
38
class AtomFeedView(AbstractAtomFeedView):
39
    """
40
    This is an implementation of the :class:`AbstractAtomFeedView` that adds a
41
    generic methods in a pylons pyramid application
42
    """
43
    __metaclass__ = abc.ABCMeta
44
45
    def __init__(self, request, atom_feed_manager, get_atom_feed_url):
46
        """
47
        Functions that can be used in a pylons pyramid application
48
49
        :param request:
50
        :param atom_feed_manager: object of class oe_daemonutils.data.data_manager.AtomFeedManager
51
        :param get_atom_feed_url: the route name of the pyramid application to retrieve the atom feed
52
        """
53
        self.request = request
54
        self.atom_feed_manager = atom_feed_manager
55
        self.get_atom_feed_url = get_atom_feed_url
56
57
    def get_current_atom_feed(self):
58
        return self.request.route_url(self.get_atom_feed_url, id=self.atom_feed_manager.current_feed.id)
59
60
    def get_atom_feed(self):
61
        feed_id = int(self.request.matchdict['id'])
62
        current_feed = self.atom_feed_manager.current_feed
63
        if feed_id == current_feed.id:
64
            feed = current_feed
65
            atom_feed = self.generate_atom_feed(feed).atom_str(pretty=True)
66
        else:
67
            atom_feed = self.atom_feed_manager.get_from_archive(feed_id)
68
        return atom_feed
69
70
    def get_atom_feed_entry(self):
71
        return self.atom_feed_manager.get_atom_feed_entry(int(self.request.matchdict['id']))
72
73
    def archive_current_feed(self):
74
        current_feed = self.atom_feed_manager.current_feed
75
        if len(current_feed.entries) > 0:
76
            current_atom_feed = self.generate_atom_feed(current_feed)
77
            new_feed = self.atom_feed_manager.save_new_feed()
78
            new_feed.uri = self.request.route_url(self.get_atom_feed_url, id=new_feed.id)
79
            current_atom_feed.link(
80
                href=new_feed.uri,
81
                rel='next-archive'
82
            )
83
            self.atom_feed_manager.archive_feed(current_feed.id, current_atom_feed)
84
85
    def link_to_sibling(self, feed, sibling_type, atom_feed):
86
        """
87
        Adding previous or next links to the given feed
88
        self._link_to_sibling(feed, 'previous', atom_feed)
89
        self._link_to_sibling(feed, 'next', atom_feed)
90
91
        :param feed: a feed object
92
        :param sibling_type: 'previous' or 'next'
93
        :param atom_feed: an atom feed like `feedgen.feed.FeedGenerator`
94
        """
95
        sibling = self.atom_feed_manager.get_sibling(feed.id, sibling_type)
96
        if sibling:
97
            rel = "prev-archive" if sibling_type == "previous" else "next-archive"
98
            atom_feed.link(href=self.request.route_url(self.get_atom_feed_url, id=sibling.id),
99
                           rel=rel)
100
101
    def init_atom_feed(self, feed):
102
        """
103
        Initializing an atom feed `feedgen.feed.FeedGenerator` given a feed object
104
105
        :param feed: a feed object
106
        :return: an atom feed `feedgen.feed.FeedGenerator`
107
        """
108
        atom_feed = FeedGenerator()
109
        atom_feed.id(id=self.request.route_url(self.get_atom_feed_url, id=feed.id))
110
        atom_feed.link(href=self.request.route_url(self.get_atom_feed_url, id=feed.id), rel='self')
111
        atom_feed.language('nl-BE')
112
        self.link_to_sibling(feed, 'previous', atom_feed)
113
        self.link_to_sibling(feed, 'next', atom_feed)
114
        return atom_feed
115
116
    def generate_atom_feed(self, feed):
117
        """
118
        A function returning a feed like `feedgen.feed.FeedGenerator`.
119
        The function can be overwritten when used in other applications.
120
121
        :param feed: a feed object
122
        :return: an atom feed `feedgen.feed.FeedGenerator`
123
        """
124
        atom_feed = self.init_atom_feed(feed)
125
        atom_feed.title("Feed")
126
        return atom_feed
127