Project

General

Profile

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

root / extra / modules / links_ui.ptl @ e3bbea04

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
        admin_role = get_cfg('aq-permissions', {}).get('links', None)
99
        if not (user.is_admin or admin_role in (user.roles or [])):
100
            raise errors.AccessForbiddenError(
101
                    public_msg = _('You are not allowed to access Links Management'),
102
                    location_hint = 'backoffice')
103

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

    
106

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

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

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

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

    
142

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

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

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

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

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

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

    
(11-11/15)