Project

General

Profile

Download (5.22 KB) Statistics
| Branch: | Tag: | Revision:

root / extra / modules / links_ui.ptl @ 9e6caf99

1
from quixote import get_request, get_response, get_session, redirect
2
from quixote.directory import Directory, AccessControlled
3

    
4
import wcs
5
import wcs.admin.root
6
from wcs.backoffice.menu import *
7

    
8
from qommon import errors
9
from qommon.form import *
10

    
11
from links import Link
12

    
13

    
14
class LinkDirectory(Directory):
15
    _q_exports = ['', 'edit', 'delete']
16

    
17
    def __init__(self, link):
18
        self.link = link
19

    
20
    def _q_index [html] (self):
21
        form = Form(enctype='multipart/form-data')
22
        form.add_submit('edit', _('Edit'))
23
        form.add_submit('delete', _('Delete'))
24
        form.add_submit('back', _('Back'))
25

    
26
        if form.get_submit() == 'edit':
27
            return redirect('edit')
28
        if form.get_submit() == 'delete':
29
            return redirect('delete')
30
        if form.get_submit() == 'back':
31
            return redirect('..')
32

    
33
        html_top('links', title = _('Link: %s') % self.link.title)
34
        '<h2>%s</h2>' % _('Link: %s') % self.link.title
35
        '<p>'
36
        self.link.url
37
        '</p>'
38

    
39
        form.render()
40

    
41
    def edit [html] (self):
42
        form = self.form()
43
        if form.get_submit() == 'cancel':
44
            return redirect('.')
45

    
46
        if form.is_submitted() and not form.has_errors():
47
            self.submit(form)
48
            return redirect('..')
49

    
50
        html_top('links', title = _('Edit Link: %s') % self.link.title)
51
        '<h2>%s</h2>' % _('Edit Link: %s') % self.link.title
52
        form.render()
53

    
54

    
55
    def form(self):
56
        form = Form(enctype='multipart/form-data')
57
        form.add(StringWidget, 'title', title = _('Title'), required = True,
58
                value = self.link.title)
59
        form.add(StringWidget, 'url', title = _('URL'), required = True,
60
                value = self.link.url)
61
        form.add_submit('submit', _('Submit'))
62
        form.add_submit('cancel', _('Cancel'))
63
        return form
64

    
65
    def submit(self, form):
66
        for k in ('title', 'url'):
67
            widget = form.get_widget(k)
68
            if widget:
69
                setattr(self.link, k, widget.parse())
70
        self.link.store()
71

    
72
    def delete [html] (self):
73
        form = Form(enctype='multipart/form-data')
74
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
75
                        'You are about to irrevocably delete this link.')))
76
        form.add_submit('submit', _('Submit'))
77
        form.add_submit('cancel', _('Cancel'))
78
        if form.get_submit() == 'cancel':
79
            return redirect('..')
80
        if not form.is_submitted() or form.has_errors():
81
            get_response().breadcrumb.append(('delete', _('Delete')))
82
            html_top('links', title = _('Delete Link'))
83
            '<h2>%s</h2>' % _('Deleting Link: %s') % self.link.title
84
            form.render()
85
        else:
86
            self.link.remove_self()
87
            return redirect('..')
88

    
89

    
90
class LinksDirectory(AccessControlled, Directory):
91
    _q_exports = ['', 'new', 'listing', 'update_order']
92
    label = N_('Links')
93

    
94
    def _q_access(self):
95
        user = get_request().user
96
        if not user:
97
            raise errors.AccessUnauthorizedError()
98
        if not user.is_admin:
99
            raise errors.AccessForbiddenError(
100
                    public_msg = _('You are not allowed to access Links Management'),
101
                    location_hint = 'backoffice')
102

    
103
        get_response().breadcrumb.append(('links/', _('Links')))
104

    
105

    
106
    def _q_index [html] (self):
107
        html_top('links', _('Links'))
108
        get_response().add_javascript(['jquery.js', 'interface.js', 'biglist.js'])
109
        '<p><a href="new">%s</a></p>' % _('New')
110

    
111
        links = Link.select()
112
        Link.sort_by_position(links)
113

    
114
        '<ul class="biglist sortable" id="links-list">'
115
        for l in links:
116
            link_id = l.id
117
            '<li class="biglistitem" id="itemId_%s">' % link_id
118
            '<strong class="label">%s</strong>' % l.title
119
            '<p class="details">'
120
            l.url
121
            '</p>'
122
            '<p class="commands">'
123
            command_icon('%s/' % link_id, 'view')
124
            command_icon('%s/edit' % link_id, 'edit')
125
            command_icon('%s/delete' % link_id, 'remove')
126
            '</p></li>'
127
        '</ul>'
128

    
129
    def update_order(self):
130
        request = get_request()
131
        new_order = request.form['order'].strip(';').split(';')
132
        links = Link.select()
133
        dict = {}
134
        for l in links:
135
            dict[str(l.id)] = l
136
        for i, o in enumerate(new_order):
137
            dict[o].position = i + 1
138
            dict[o].store()
139
        return 'ok'
140

    
141

    
142
    def new [html] (self):
143
        link_ui = LinkDirectory(Link())
144

    
145
        form = link_ui.form()
146
        if form.get_submit() == 'cancel':
147
            return redirect('.')
148

    
149
        if form.is_submitted() and not form.has_errors():
150
            link_ui.submit(form)
151
            return redirect('%s/' % link_ui.link.id)
152

    
153
        get_response().breadcrumb.append(('new', _('New Link')))
154
        html_top('links', title = _('New Link'))
155
        '<h2>%s</h2>' % _('New Link')
156
        form.render()
157

    
158
    def _q_lookup(self, component):
159
        try:
160
            link = Link.get(component)
161
        except KeyError:
162
            raise errors.TraversalError()
163
        get_response().breadcrumb.append((str(link.id), link.title))
164
        return LinkDirectory(link)
165

    
166
    def listing(self):
167
        return redirect('.')
168

    
(11-11/15)