Projet

Général

Profil

Télécharger (6,32 ko) Statistiques
| Branche: | Tag: | Révision:

root / auquotidien / modules / links_ui.py @ 8b02623d

1
from quixote import get_request, get_response, get_session, redirect
2
from quixote.directory import Directory, AccessControlled
3
from quixote.html import TemplateIO, htmltext
4

    
5
import wcs
6
import wcs.admin.root
7

    
8
from qommon import _
9
from qommon import errors
10
from qommon.form import *
11
from qommon.backoffice.menu import html_top
12
from qommon.admin.menu import command_icon
13
from qommon import get_cfg
14

    
15
from links import Link
16

    
17

    
18
class LinkDirectory(Directory):
19
    _q_exports = ['', 'edit', 'delete']
20

    
21
    def __init__(self, link):
22
        self.link = link
23

    
24
    def _q_index(self):
25
        form = Form(enctype='multipart/form-data')
26
        form.add_submit('edit', _('Edit'))
27
        form.add_submit('delete', _('Delete'))
28
        form.add_submit('back', _('Back'))
29

    
30
        if form.get_submit() == 'edit':
31
            return redirect('edit')
32
        if form.get_submit() == 'delete':
33
            return redirect('delete')
34
        if form.get_submit() == 'back':
35
            return redirect('..')
36

    
37
        html_top('links', title = _('Link: %s') % self.link.title)
38
        r = TemplateIO(html=True)
39
        r += htmltext('<h2>%s</h2>') % _('Link: %s') % self.link.title
40
        r += htmltext('<p>')
41
        r += self.link.url
42
        r += htmltext('</p>')
43

    
44
        r += form.render()
45
        return r.getvalue()
46

    
47
    def edit(self):
48
        form = self.form()
49
        if form.get_submit() == 'cancel':
50
            return redirect('.')
51

    
52
        if form.is_submitted() and not form.has_errors():
53
            self.submit(form)
54
            return redirect('..')
55

    
56
        html_top('links', title = _('Edit Link: %s') % self.link.title)
57
        r = TemplateIO(html=True)
58
        r += htmltext('<h2>%s</h2>') % _('Edit Link: %s') % self.link.title
59
        r += form.render()
60
        return r.getvalue()
61

    
62

    
63
    def form(self):
64
        form = Form(enctype='multipart/form-data')
65
        form.add(StringWidget, 'title', title = _('Title'), required = True,
66
                value = self.link.title)
67
        form.add(StringWidget, 'url', title = _('URL'), required=False,
68
                value = self.link.url,
69
                hint=_('Leave empty to create a title'))
70
        form.add_submit('submit', _('Submit'))
71
        form.add_submit('cancel', _('Cancel'))
72
        return form
73

    
74
    def submit(self, form):
75
        for k in ('title', 'url'):
76
            widget = form.get_widget(k)
77
            if widget:
78
                setattr(self.link, k, widget.parse())
79
        self.link.store()
80

    
81
    def delete(self):
82
        form = Form(enctype='multipart/form-data')
83
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
84
                        'You are about to irrevocably delete this link.')))
85
        form.add_submit('submit', _('Submit'))
86
        form.add_submit('cancel', _('Cancel'))
87
        if form.get_submit() == 'cancel':
88
            return redirect('..')
89
        if not form.is_submitted() or form.has_errors():
90
            get_response().breadcrumb.append(('delete', _('Delete')))
91
            html_top('links', title = _('Delete Link'))
92
            r = TemplateIO(html=True)
93
            r += htmltext('<h2>%s</h2>') % _('Deleting Link: %s') % self.link.title
94
            r += form.render()
95
            return r.getvalue()
96
        else:
97
            self.link.remove_self()
98
            return redirect('..')
99

    
100

    
101
class LinksDirectory(AccessControlled, Directory):
102
    _q_exports = ['', 'new', 'listing', 'update_order']
103
    label = N_('Links')
104

    
105
    def is_accessible(self, user):
106
        from .backoffice import check_visibility
107
        return check_visibility('links', user)
108

    
109
    def _q_access(self):
110
        user = get_request().user
111
        if not user:
112
            raise errors.AccessUnauthorizedError()
113

    
114
        if not self.is_accessible(user):
115
            raise errors.AccessForbiddenError(
116
                    public_msg = _('You are not allowed to access Links Management'),
117
                    location_hint = 'backoffice')
118

    
119
        get_response().breadcrumb.append(('links/', _('Links')))
120

    
121

    
122
    def _q_index(self):
123
        html_top('links', _('Links'))
124
        r = TemplateIO(html=True)
125
        get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js'])
126
        get_response().filter['sidebar'] = self.get_sidebar()
127

    
128
        links = Link.select()
129
        Link.sort_by_position(links)
130

    
131
        r += htmltext('<ul class="biglist sortable" id="links-list">')
132
        for l in links:
133
            link_id = l.id
134
            r += htmltext('<li class="biglistitem" id="itemId_%s">') % link_id
135
            r += htmltext('<strong class="label"><a href="%s/">%s</a></strong>') % (link_id, l.title)
136
            r += htmltext('<p class="details">')
137
            r += l.url
138
            r += htmltext('</p>')
139
            r += htmltext('<p class="commands">')
140
            r += command_icon('%s/edit' % link_id, 'edit')
141
            r += command_icon('%s/delete' % link_id, 'remove')
142
            r += htmltext('</p></li>')
143
        r += htmltext('</ul>')
144
        return r.getvalue()
145

    
146
    def get_sidebar(self):
147
        r = TemplateIO(html=True)
148
        r += htmltext('<ul id="sidebar-actions">')
149
        r += htmltext('  <li><a class="new-item" href="new">%s</a></li>') % _('New Link')
150
        r += htmltext('</ul>')
151
        return r.getvalue()
152

    
153
    def update_order(self):
154
        request = get_request()
155
        new_order = request.form['order'].strip(';').split(';')
156
        links = Link.select()
157
        dict = {}
158
        for l in links:
159
            dict[str(l.id)] = l
160
        for i, o in enumerate(new_order):
161
            dict[o].position = i + 1
162
            dict[o].store()
163
        return 'ok'
164

    
165

    
166
    def new(self):
167
        link_ui = LinkDirectory(Link())
168

    
169
        form = link_ui.form()
170
        if form.get_submit() == 'cancel':
171
            return redirect('.')
172

    
173
        if form.is_submitted() and not form.has_errors():
174
            link_ui.submit(form)
175
            return redirect('%s/' % link_ui.link.id)
176

    
177
        get_response().breadcrumb.append(('new', _('New Link')))
178
        html_top('links', title = _('New Link'))
179
        r = TemplateIO(html=True)
180
        r += htmltext('<h2>%s</h2>') % _('New Link')
181
        r += form.render()
182
        return r.getvalue()
183

    
184
    def _q_lookup(self, component):
185
        try:
186
            link = Link.get(component)
187
        except KeyError:
188
            raise errors.TraversalError()
189
        get_response().breadcrumb.append((str(link.id), link.title))
190
        return LinkDirectory(link)
191

    
192
    def listing(self):
193
        return redirect('.')
194

    
(19-19/27)