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

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

Some button adjustments.

  • Property svn:keywords set to Id
File size: 8.1 KB
RevLine 
[7195]1## $Id: browser.py 7488 2012-01-20 07:54:38Z 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##
[5082]18"""UI components for accesscodes.
19"""
20import grok
[5088]21from datetime import datetime
[6450]22from hurry.workflow.interfaces import InvalidTransitionError
[6455]23from waeup.sirp.browser.resources import datatable
[7488]24from waeup.sirp.browser import SIRPPage, SIRPAddFormPage, NullValidator
[5082]25from waeup.sirp.browser.breadcrumbs import Breadcrumb
[5129]26from waeup.sirp.browser.viewlets import (
[5381]27    AdminTask, AddActionButton, SearchActionButton, BatchOpButton, ManageLink)
[7321]28from waeup.sirp.interfaces import ISIRPObject
[5082]29
[5088]30from waeup.sirp.accesscodes.interfaces import (
31    IAccessCodeBatchContainer, IAccessCodeBatch,
32    )
[6450]33from waeup.sirp.accesscodes.catalog import search
[7459]34from waeup.sirp.browser.layout import action
[5082]35
[7321]36grok.context(ISIRPObject)
[5082]37
[7321]38class BatchContainerPage(SIRPPage):
[5082]39    grok.name('index')
40    grok.context(IAccessCodeBatchContainer)
41    grok.template('batchcontainer')
[5104]42    grok.require('waeup.manageACBatches')
[5082]43
[7467]44    label = 'Access Code Batches'
[5082]45    pnav = 0
46
[5117]47    def update(self, batches=None, archive=None, delete=None):
48        if archive is None and delete is None:
49            return
[5124]50        if not batches:
51            self.flash('No batch selected.')
52            return
[5117]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)
[5104]63
[7321]64class AddBatchPage(SIRPAddFormPage):
[5084]65    grok.name('add')
66    grok.context(IAccessCodeBatchContainer)
[5104]67    grok.require('waeup.manageACBatches')
[5084]68
[7459]69    label = 'Create Access Code Batch'
[5084]70    pnav = 0
71
[5088]72    form_fields = grok.AutoFields(IAccessCodeBatch).select(
[6417]73        'prefix', 'entry_num', 'cost')
[5088]74
[7488]75    @action('Create batch', style='primary')
[5084]76    def createBatch(self, **data):
[5088]77        creator = self.request.principal.id
78        creation_date = datetime.now()
79        data.update(creation_date=creation_date, creator=creator)
[5126]80        batch = self.context.createBatch(**data)
[5113]81        csv_file = batch.createCSVLogFile()
[5088]82        self.context._p_changed = True
83        self.flash('Batch created (%s entries)' % data['entry_num'])
[5113]84        self.flash('Data written to %s' % csv_file)
[5084]85        self.redirect(self.url(self.context))
86
[7488]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
[7321]92class ReimportBatchPage(SIRPPage):
[5132]93    """Screen for reimporting AC batches.
94    """
[5130]95    grok.name('reimport')
96    grok.context(IAccessCodeBatchContainer)
97    grok.template('reimportbatchpage')
98    grok.require('waeup.manageACBatches')
99
[7467]100    label = 'Reimport Access Code Batches'
[5130]101    pnav = 0
102
[5132]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))
[6388]125
[7321]126class BatchContainerSearchPage(SIRPPage):
[5155]127    grok.name('search')
128    grok.context(IAccessCodeBatchContainer)
129    grok.template('searchpage')
130    grok.require('waeup.manageACBatches')
131    pnav = 0
[7467]132    label = 'Search and Manage Access Codes'
[5155]133
[6450]134    def update(self, *args, **kw):
[6455]135        datatable.need()
[6450]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:
[5155]145            return
[6450]146        #import pdb; pdb.set_trace()
147        if not 'entries' in form:
148            self.hitlist = search(query=self.searchterm,
149                searchtype=self.searchtype, view=self)
150            return
151        entries = form['entries']
[5155]152        if isinstance(entries, basestring):
153            entries = [entries]
154        for entry in entries:
[6450]155            if 'disable' in form:
156                try:
[6471]157                    comment = u"AC disabled"
[6459]158                    self.context.disable(entry, comment)
[6450]159                    self.flash('%s disabled.' % entry)
160                except InvalidTransitionError:
[6451]161                    self.flash('%s: Disable transition not allowed.' % entry)
[6450]162            elif 'enable' in form:
163                try:
[6471]164                    comment = u"AC re-enabled"
[6459]165                    self.context.enable(entry, comment)
[6450]166                    self.flash('%s (re-)enabled.' % entry)
167                except InvalidTransitionError:
[6451]168                    self.flash('%s: Re-enable transition not allowed.' % entry)
[6450]169        self.hitlist = search(query=self.searchterm,
170            searchtype=self.searchtype, view=self)
[5155]171        return
172
[5082]173class BatchContainerBreadcrumb(Breadcrumb):
174    """A breadcrumb for ac batch containers.
[5104]175    """
176    grok.require('waeup.manageACBatches')
[5082]177    grok.context(IAccessCodeBatchContainer)
178    title = u'Access Code Batches'
179    parent_viewname = 'administration'
180
[7488]181#class BatchContainerSearchBreadcrumb(Breadcrumb):
182#    """A breadcrumb for ac batch containers search page.
183#    """
184#    grok.require('waeup.manageACBatches')
185#    grok.context(IAccessCodeBatchContainer)
186#    grok.name('search')
187#    title = u'Search Access Codes'
188#    viewname = 'search'
189#    parent_viewname = 'index'
[5155]190
[5082]191class AdminTaskManageACBatches(AdminTask):
192    """Entry on administration page that links to batch container.
193    """
194    grok.order(5)
[5104]195    grok.require('waeup.manageACBatches')
[5082]196    grok.template('admintaskacbatches')
197
[5412]198    link_title = 'Access Code Batches'
[5082]199    target_viewname = 'accesscodes'
[5084]200
201class CreateBatchButton(AddActionButton):
202    """Action button on batch container page which links to batch creation.
203    """
204    grok.context(IAccessCodeBatchContainer)
205    grok.view(BatchContainerPage)
[5104]206    grok.require('waeup.manageACBatches')
[6450]207    text = 'Add Access Code Batch'
[5104]208
[5129]209class ReimportBatchButton(BatchOpButton):
210    """Action button on batch container page which links to batch reimport.
211    """
212    grok.context(IAccessCodeBatchContainer)
213    grok.view(BatchContainerPage)
214    grok.require('waeup.manageACBatches')
215    target = 'reimport'
[6450]216    text = 'Reimport Access Code Batch'
[5129]217
[5155]218class SearchAccessCodeButton(SearchActionButton):
219    """Action button on batch container page which links to search.
220    """
221    grok.context(IAccessCodeBatchContainer)
222    grok.view(BatchContainerPage)
223    grok.require('waeup.manageACBatches')
[6450]224    text = 'Search Access Codes'
[6388]225
[5381]226class ManageAccessCodes(ManageLink):
227    """Link in upper left box to access code management.
[5104]228    """
229    grok.order(6)
230    grok.require('waeup.manageACBatches')
231
[5381]232    link = u'accesscodes'
[5412]233    text = u'Access Codes'
Note: See TracBrowser for help on using the repository browser.