~jtv/maas/1.2-bug-1069734

« back to all changes in this revision

Viewing changes to src/maasserver/views/__init__.py

  • Committer: Julian Edwards
  • Date: 2012-10-17 05:20:13 UTC
  • Revision ID: julian.edwards@canonical.com-20121017052013-tq7m5voj2ux40nuw
merge r1275 from trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
__metaclass__ = type
13
13
__all__ = [
14
14
    "HelpfulDeleteView",
 
15
    "PaginatedListView",
15
16
    "process_form",
16
17
    "AccountsEdit",
17
18
    "AccountsView",
29
30
    Http404,
30
31
    HttpResponseRedirect,
31
32
    )
32
 
from django.views.generic import DeleteView
 
33
from django.views.generic import (
 
34
    DeleteView,
 
35
    ListView,
 
36
    )
33
37
 
34
38
 
35
39
class HelpfulDeleteView(DeleteView):
110
114
        return HttpResponseRedirect(self.get_next_url())
111
115
 
112
116
 
 
117
class PaginatedListView(ListView):
 
118
    """Paginating extension to :class:`django.views.generic.ListView`
 
119
 
 
120
    Adds to the normal list view pagination support by including context
 
121
    variables for relative links to other pages, correctly preserving the
 
122
    existing query string and path.
 
123
    """
 
124
 
 
125
    paginate_by = 50
 
126
 
 
127
    def _make_page_link(self, page_number):
 
128
        """Gives relative url reference to `page_number` from current page
 
129
 
 
130
        The return will be one of:
 
131
        - A query string including the page number and other params
 
132
        - The final path segment if there are no params
 
133
        - '.' if there are no params and there is no final path segment
 
134
 
 
135
        See RFCs 1808 and 3986 for relative url resolution rules.
 
136
 
 
137
        The page number is not checked for sanity, pass only valid pages.
 
138
        """
 
139
        new_query = self.request.GET.copy()
 
140
        if page_number == 1:
 
141
            if "page" in new_query:
 
142
                del new_query["page"]
 
143
        else:
 
144
            new_query["page"] = str(page_number)
 
145
        if not new_query:
 
146
            return self.request.path.rsplit("/", 1)[-1] or "."
 
147
        return "?" + new_query.urlencode()
 
148
 
 
149
    def get_context_data(self, **kwargs):
 
150
        """Gives context data also populated with page links
 
151
 
 
152
        If already on the first or last page, the same-document reference will
 
153
        be given for relative links in that direction, which may be safely
 
154
        replaced in the template with a non-anchor element.
 
155
        """
 
156
        context = super(PaginatedListView, self).get_context_data(**kwargs)
 
157
        page_obj = context["page_obj"]
 
158
        if page_obj.has_previous():
 
159
            context["first_page_link"] = self._make_page_link(1)
 
160
            context["previous_page_link"] = self._make_page_link(
 
161
                page_obj.previous_page_number())
 
162
        else:
 
163
            context["first_page_link"] = context["previous_page_link"] = ""
 
164
        if page_obj.has_next():
 
165
            context["next_page_link"] = self._make_page_link(
 
166
                page_obj.next_page_number())
 
167
            context["last_page_link"] = self._make_page_link(
 
168
                page_obj.paginator.num_pages)
 
169
        else:
 
170
            context["next_page_link"] = context["last_page_link"] = ""
 
171
        return context
 
172
 
 
173
 
113
174
def process_form(request, form_class, redirect_url, prefix,
114
175
                 success_message=None, form_kwargs=None):
115
176
    """Utility method to process subforms (i.e. forms with a prefix).