source: main/waeup.sirp/trunk/src/waeup/sirp/accesscodes/browser.py @ 7677

Last change on this file since 7677 was 7649, checked in by Henrik Bettermann, 13 years ago

Remove uncommented pdb break points.

  • Property svn:keywords set to Id
File size: 8.1 KB
Line 
1## $Id: browser.py 7649 2012-02-14 15:00:47Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""UI components for accesscodes.
19"""
20import grok
21from datetime import datetime
22from hurry.workflow.interfaces import InvalidTransitionError
23from waeup.sirp.browser.resources import datatable
24from waeup.sirp.browser import SIRPPage, SIRPAddFormPage, NullValidator
25from waeup.sirp.browser.breadcrumbs import Breadcrumb
26from waeup.sirp.browser.viewlets import (
27    AdminTask, AddActionButton, SearchActionButton, BatchOpButton, ManageLink)
28from waeup.sirp.interfaces import ISIRPObject
29
30from waeup.sirp.accesscodes.interfaces import (
31    IAccessCodeBatchContainer, IAccessCodeBatch,
32    )
33from waeup.sirp.accesscodes.catalog import search
34from waeup.sirp.browser.layout import action
35
36grok.context(ISIRPObject)
37
38class BatchContainerPage(SIRPPage):
39    grok.name('index')
40    grok.context(IAccessCodeBatchContainer)
41    grok.template('batchcontainer')
42    grok.require('waeup.manageACBatches')
43
44    label = 'Access Code Batches'
45    pnav = 0
46
47    def update(self, batches=None, archive=None, delete=None):
48        if archive is None and delete is None:
49            return
50        if not batches:
51            self.flash('No batch selected.')
52            return
53        if isinstance(batches, basestring):
54            batches = [batches]
55        for name in batches:
56            batch = self.context[name]
57            csv_file = batch.archive()
58            self.flash('Archived %s (%s)' % (name, csv_file))
59            if delete is None:
60                continue
61            del self.context[name]
62            self.flash('Deleted batch %s' % name)
63
64class AddBatchPage(SIRPAddFormPage):
65    grok.name('add')
66    grok.context(IAccessCodeBatchContainer)
67    grok.require('waeup.manageACBatches')
68
69    label = 'Create Access Code Batch'
70    pnav = 0
71
72    form_fields = grok.AutoFields(IAccessCodeBatch).select(
73        'prefix', 'entry_num', 'cost')
74
75    @action('Create batch', style='primary')
76    def createBatch(self, **data):
77        creator = self.request.principal.id
78        creation_date = datetime.now()
79        data.update(creation_date=creation_date, creator=creator)
80        batch = self.context.createBatch(**data)
81        csv_file = batch.createCSVLogFile()
82        self.context._p_changed = True
83        self.flash('Batch created (%s entries)' % data['entry_num'])
84        self.flash('Data written to %s' % csv_file)
85        self.redirect(self.url(self.context))
86
87    @action('Cancel', validator=NullValidator)
88    def cancel(self, *args, **kw):
89        self.flash('Batch creation cancelled.')
90        self.redirect(self.url(self.context))
91
92class ReimportBatchPage(SIRPPage):
93    """Screen for reimporting AC batches.
94    """
95    grok.name('reimport')
96    grok.context(IAccessCodeBatchContainer)
97    grok.template('reimportbatchpage')
98    grok.require('waeup.manageACBatches')
99
100    label = 'Reimport Access Code Batches'
101    pnav = 0
102
103    def update(self, filenames=None, reimport=None, cancel=None):
104        if cancel is not None:
105            self.flash('Reimport cancelled.')
106            self.redirect(self.url(self.context))
107            return
108        if reimport is None:
109            return
110        if not filenames:
111            self.flash('No file chosen. Action cancelled.')
112            self.redirect(self.url(self.context))
113            return
114        if isinstance(filenames, basestring):
115            filenames = [filenames]
116        userid = self.request.principal.id
117        for filename in filenames:
118            try:
119                self.context.reimport(filename, userid)
120            except KeyError:
121                self.flash('This batch already exists: %s' % filename)
122                continue
123            self.flash('Successfully reimported: %s' % filename)
124        self.redirect(self.url(self.context))
125
126class BatchContainerSearchPage(SIRPPage):
127    grok.name('search')
128    grok.context(IAccessCodeBatchContainer)
129    grok.template('searchpage')
130    grok.require('waeup.manageACBatches')
131    pnav = 0
132    label = 'Search and Manage Access Codes'
133
134    def update(self, *args, **kw):
135        datatable.need()
136        form = self.request.form
137        self.hitlist = []
138        if 'searchterm' in form and form['searchterm']:
139            self.searchterm = form['searchterm']
140            self.searchtype = form['searchtype']
141        elif 'old_searchterm' in form:
142            self.searchterm = form['old_searchterm']
143            self.searchtype = form['old_searchtype']
144        else:
145            return
146        if not 'entries' in form:
147            self.hitlist = search(query=self.searchterm,
148                searchtype=self.searchtype, view=self)
149            return
150        entries = form['entries']
151        if isinstance(entries, basestring):
152            entries = [entries]
153        for entry in entries:
154            if 'disable' in form:
155                try:
156                    comment = u"AC disabled"
157                    self.context.disable(entry, comment)
158                    self.flash('%s disabled.' % entry)
159                except InvalidTransitionError:
160                    self.flash('%s: Disable transition not allowed.' % entry)
161            elif 'enable' in form:
162                try:
163                    comment = u"AC re-enabled"
164                    self.context.enable(entry, comment)
165                    self.flash('%s (re-)enabled.' % entry)
166                except InvalidTransitionError:
167                    self.flash('%s: Re-enable transition not allowed.' % entry)
168        self.hitlist = search(query=self.searchterm,
169            searchtype=self.searchtype, view=self)
170        return
171
172class BatchContainerBreadcrumb(Breadcrumb):
173    """A breadcrumb for ac batch containers.
174    """
175    grok.require('waeup.manageACBatches')
176    grok.context(IAccessCodeBatchContainer)
177    title = u'Access Code Batches'
178    parent_viewname = 'administration'
179
180#class BatchContainerSearchBreadcrumb(Breadcrumb):
181#    """A breadcrumb for ac batch containers search page.
182#    """
183#    grok.require('waeup.manageACBatches')
184#    grok.context(IAccessCodeBatchContainer)
185#    grok.name('search')
186#    title = u'Search Access Codes'
187#    viewname = 'search'
188#    parent_viewname = 'index'
189
190class AdminTaskManageACBatches(AdminTask):
191    """Entry on administration page that links to batch container.
192    """
193    grok.order(5)
194    grok.require('waeup.manageACBatches')
195    grok.template('admintaskacbatches')
196
197    link_title = 'Access Code Batches'
198    target_viewname = 'accesscodes'
199
200class CreateBatchButton(AddActionButton):
201    """Action button on batch container page which links to batch creation.
202    """
203    grok.context(IAccessCodeBatchContainer)
204    grok.view(BatchContainerPage)
205    grok.require('waeup.manageACBatches')
206    text = 'Add Access Code Batch'
207
208class ReimportBatchButton(BatchOpButton):
209    """Action button on batch container page which links to batch reimport.
210    """
211    grok.context(IAccessCodeBatchContainer)
212    grok.view(BatchContainerPage)
213    grok.require('waeup.manageACBatches')
214    target = 'reimport'
215    text = 'Reimport Access Code Batch'
216
217class SearchAccessCodeButton(SearchActionButton):
218    """Action button on batch container page which links to search.
219    """
220    grok.context(IAccessCodeBatchContainer)
221    grok.view(BatchContainerPage)
222    grok.require('waeup.manageACBatches')
223    text = 'Search Access Codes'
224
225class ManageAccessCodes(ManageLink):
226    """Link in upper left box to access code management.
227    """
228    grok.order(6)
229    grok.require('waeup.manageACBatches')
230
231    link = u'accesscodes'
232    text = u'Access Codes'
Note: See TracBrowser for help on using the repository browser.