def overview_controlpanel_categories(self): """see ../configure.zcml This adds the bika.lims category to controlpanel-overview. """ return [ { 'id': 'Plone', 'title': PMF(u'Plone Configuration') }, { 'id': 'bika', 'title': _(u'Bika LIMS Configuration') }, { 'id': 'Products', 'title': PMF(u'Add-on Configuration') }, ]
def workflow_action_receive(self): action, came_from = WorkflowAction._get_form_workflow_action(self) items = [self.context,] if came_from == 'workflow_action' \ else self._get_selected_items().values() trans, dest = self.submitTransition(action, came_from, items) if trans and 'receive' in self.context.bika_setup.getAutoPrintStickers( ): transitioned = [item.id for item in items] tmpl = self.context.bika_setup.getAutoStickerTemplate() q = "/sticker?autoprint=1&template=%s&items=" % tmpl q += ",".join(transitioned) self.request.response.redirect(self.context.absolute_url() + q) elif trans: message = PMF('Changes saved.') self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url)
def __call__(self): form = self.request.form CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'reassign': mtool = getToolByName(self.context, 'portal_membership') if not mtool.checkPermission(ManageWorksheets, self.context): # Redirect to WS list msg = _('You do not have sufficient privileges to ' 'manage worksheets.') self.context.plone_utils.addPortalMessage(msg, 'warning') portal = getToolByName(self.context, 'portal_url').getPortalObject() self.destination_url = portal.absolute_url() + "/worksheets" self.request.response.redirect(self.destination_url) return selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if workflow.getInfoFor(worksheet, 'review_state') == 'open': worksheet.setAnalyst(form['Analyst'][0][uid]) worksheet.reindexObject(idxs=['getAnalyst']) changes = True if changes: message = PMF('Changes saved.') self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header( "referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __init__(self, context, request): super(SamplesView, self).__init__(context, request) request.set('disable_plone.rightcolumn', 1) self.catalog = 'bika_catalog' self.contentFilter = { 'portal_type': 'Sample', 'sort_on': 'created', 'sort_order': 'reverse', 'path': { 'query': "/", 'level': 0 } } self.context_actions = {} self.show_sort_column = False self.show_select_row = False self.show_select_column = True self.allow_edit = True self.form_id = "samples" if self.view_url.find("/samples") > -1: self.request.set('disable_border', 1) else: self.view_url = self.view_url + "/samples" self.icon = self.portal_url + "/++resource++bika.lims.images/sample_big.png" self.title = self.context.translate(_("Samples")) self.description = "" SamplingWorkflowEnabled = self.context.bika_setup.getSamplingWorkflowEnabled( ) mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() user_is_preserver = 'Preserver' in member.getRoles() self.columns = { 'getSampleID': { 'title': _('Sample ID'), 'index': 'getSampleID' }, 'Client': { 'title': _("Client"), 'toggle': True, }, 'Creator': { 'title': PMF('Creator'), 'index': 'Creator', 'toggle': True }, 'Created': { 'title': PMF('Date Created'), 'index': 'created', 'toggle': False }, 'Requests': { 'title': _('Requests'), 'sortable': False, 'toggle': False }, 'getClientReference': { 'title': _('Client Ref'), 'index': 'getClientReference', 'toggle': True }, 'getClientSampleID': { 'title': _('Client SID'), 'index': 'getClientSampleID', 'toggle': True }, 'getSampleTypeTitle': { 'title': _('Sample Type'), 'index': 'getSampleTypeTitle' }, 'getSamplePointTitle': { 'title': _('Sample Point'), 'index': 'getSamplePointTitle', 'toggle': False }, 'getStorageLocation': { 'title': _('Storage Location'), 'toggle': False }, 'SamplingDeviation': { 'title': _('Sampling Deviation'), 'toggle': False }, 'AdHoc': { 'title': _('Ad-Hoc'), 'toggle': False }, 'getSamplingDate': { 'title': _('Sampling Date'), 'index': 'getSamplingDate', 'toggle': True }, 'getDateSampled': { 'title': _('Date Sampled'), 'index': 'getDateSampled', 'toggle': SamplingWorkflowEnabled, 'input_class': 'datepicker_nofuture', 'input_width': '10' }, 'getSampler': { 'title': _('Sampler'), 'toggle': SamplingWorkflowEnabled }, 'getDatePreserved': { 'title': _('Date Preserved'), 'toggle': user_is_preserver, 'input_class': 'datepicker_nofuture', 'input_width': '10' }, 'getPreserver': { 'title': _('Preserver'), 'toggle': user_is_preserver }, 'DateReceived': { 'title': _('Date Received'), 'index': 'getDateReceived', 'toggle': False }, 'state_title': { 'title': _('State'), 'index': 'review_state' }, } self.review_states = [ { 'id': 'default', 'title': _('Active'), 'contentFilter': { 'cancellation_state': 'active', 'sort_on': 'created' }, 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'getSamplingDate', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'DateReceived', 'state_title' ] }, { 'id': 'sample_due', 'title': _('Due'), 'contentFilter': { 'review_state': ('to_be_sampled', 'to_be_preserved', 'sample_due'), 'sort_on': 'created', 'sort_order': 'reverse' }, 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSamplingDate', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'state_title' ] }, { 'id': 'sample_received', 'title': _('Received'), 'contentFilter': { 'review_state': 'sample_received', 'sort_order': 'reverse', 'sort_on': 'created' }, 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'getSamplingDate', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'DateReceived' ] }, { 'id': 'expired', 'title': _('Expired'), 'contentFilter': { 'review_state': 'expired', 'sort_order': 'reverse', 'sort_on': 'created' }, 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'getSamplingDate', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'DateReceived' ] }, { 'id': 'disposed', 'title': _('Disposed'), 'contentFilter': { 'review_state': 'disposed', 'sort_order': 'reverse', 'sort_on': 'created' }, 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'getSamplingDate', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'DateReceived' ] }, { 'id': 'cancelled', 'title': _('Cancelled'), 'contentFilter': { 'cancellation_state': 'cancelled', 'sort_order': 'reverse', 'sort_on': 'created' }, 'transitions': [ { 'id': 'reinstate' }, ], 'columns': [ 'getSampleID', 'Client', 'Creator', 'Created', 'Requests', 'getClientReference', 'getClientSampleID', 'getSampleTypeTitle', 'getSamplePointTitle', 'getStorageLocation', 'SamplingDeviation', 'AdHoc', 'getSamplingDate', 'DateReceived', 'getDateSampled', 'getSampler', 'getDatePreserved', 'getPreserver', 'state_title' ] }, ]
def __call__(self): if self.request.form.has_key("submitted"): def error(field, message): if field: message = "%s: %s" % (field, message) self.context.plone_utils.addPortalMessage(message, 'error') return self.template() form = self.request.form contact = self.context password = safe_unicode(form.get('password', '')).encode('utf-8') username = safe_unicode(form.get('username', '')).encode('utf-8') confirm = form.get('confirm', '') email = safe_unicode(form.get('email', '')).encode('utf-8') if not username: return error('username', PMF("Input is required but not given.")) if not email: return error('email', PMF("Input is required but not given.")) reg_tool = self.context.portal_registration properties = self.context.portal_properties.site_properties ## if properties.validate_email: ## password = reg_tool.generatePassword() ## else: if password != confirm: return error('password', PMF("Passwords do not match.")) if not password: return error('password', PMF("Input is required but not given.")) if not confirm: return error('password', PMF("Passwords do not match.")) if len(password) < 5: return error('password', PMF("Passwords must contain at least 5 letters.")) try: reg_tool.addMember(username, password, properties={ 'username': username, 'email': email, 'fullname': username }) except ValueError, msg: return error(None, msg) contact.setUsername(username) contact.setEmailAddress(email) # If we're being created in a Client context, then give # the contact an Owner local role on client. if contact.aq_parent.portal_type == 'Client': contact.aq_parent.manage_setLocalRoles(username, [ 'Owner', ]) if hasattr(aq_base(contact.aq_parent), 'reindexObjectSecurity'): contact.aq_parent.reindexObjectSecurity() # add user to Clients group group = self.context.portal_groups.getGroupById('Clients') group.addMember(username) # Additional groups for LabContact users. # not required (not available for client Contact) if 'groups' in self.request and self.request['groups']: groups = self.request['groups'] if not type(groups) in (list, tuple): groups = [ groups, ] for group in groups: group = self.portal_groups.getGroupById(group) group.addMember(username) contact.reindexObject() if properties.validate_email or self.request.get('mail_me', 0): try: reg_tool.registeredNotify(username) except: import transaction transaction.abort() return error(None, PMF("SMTP server disconnected.")) message = PMF("Member registered.") self.context.plone_utils.addPortalMessage(message, 'info') return self.template()
def workflow_action_save_analyses_button(self): form = self.request.form workflow = getToolByName(self.context, 'portal_workflow') bsc = self.context.bika_setup_catalog action, came_from = WorkflowAction._get_form_workflow_action(self) # AR Manage Analyses: save Analyses ar = self.context sample = ar.getSample() objects = WorkflowAction._get_selected_items(self) if not objects: message = _("No analyses have been selected") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() + "/analyses" self.request.response.redirect(self.destination_url) return Analyses = objects.keys() prices = form.get("Price", [None])[0] # Hidden analyses? # https://jira.bikalabs.com/browse/LIMS-1324 outs = [] hiddenans = form.get('Hidden', {}) for uid in Analyses: hidden = hiddenans.get(uid, '') hidden = True if hidden == 'on' else False outs.append({'uid': uid, 'hidden': hidden}) ar.setAnalysisServicesSettings(outs) specs = {} if form.get("min", None): for service_uid in Analyses: service = bsc(UID=service_uid)[0].getObject() keyword = service.getKeyword() specs[service_uid] = { "min": form["min"][0][service_uid], "max": form["max"][0][service_uid], "error": form["error"][0][service_uid], "keyword": keyword, "uid": service_uid, } else: for service_uid in Analyses: service = bsc(UID=service_uid)[0].getObject() keyword = service.getKeyword() specs[service_uid] = { "min": "", "max": "", "error": "", "keyword": keyword, "uid": service_uid } new = ar.setAnalyses(Analyses, prices=prices, specs=specs.values()) # link analyses and partitions # If Bika Setup > Analyses > 'Display individual sample # partitions' is checked, no Partitions available. # https://github.com/bikalabs/Bika-LIMS/issues/1030 if 'Partition' in form: for service_uid, service in objects.items(): part_id = form['Partition'][0][service_uid] part = sample[part_id] analysis = ar[service.getKeyword()] analysis.setSamplePartition(part) analysis.reindexObject() if new: for analysis in new: # if the AR has progressed past sample_received, we need to bring it back. ar_state = workflow.getInfoFor(ar, 'review_state') if ar_state in ('attachment_due', 'to_be_verified'): # Apply to AR only; we don't want this transition to cascade. ar.REQUEST['workflow_skiplist'].append( "retract all analyses") workflow.doActionFor(ar, 'retract') ar.REQUEST['workflow_skiplist'].remove( "retract all analyses") ar_state = workflow.getInfoFor(ar, 'review_state') # Then we need to forward new analyses state analysis.updateDueDate() changeWorkflowState(analysis, 'bika_analysis_workflow', ar_state) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url)
def workflow_action_submit(self): form = self.request.form rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) checkPermission = self.context.portal_membership.checkPermission if not isActive(self.context): message = _('Item is inactive.') self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.context.absolute_url()) return # calcs.js has kept item_data and form input interim values synced, # so the json strings from item_data will be the same as the form values item_data = {} if 'item_data' in form: if isinstance(form['item_data'], list): for i_d in form['item_data']: for i, d in json.loads(i_d).items(): item_data[i] = d else: item_data = json.loads(form['item_data']) selected_analyses = WorkflowAction._get_selected_items(self) results = {} hasInterims = {} # check that the form values match the database # save them if not. for uid, result in self.request.form.get('Result', [{}])[0].items(): # if the AR has ReportDryMatter set, get dry_result from form. dry_result = '' if hasattr(self.context, 'getReportDryMatter') \ and self.context.getReportDryMatter(): for k, v in self.request.form['ResultDM'][0].items(): if uid == k: dry_result = v break if uid in selected_analyses: analysis = selected_analyses[uid] else: analysis = rc.lookupObject(uid) if not analysis: # ignore result if analysis object no longer exists continue results[uid] = result interimFields = item_data[uid] if len(interimFields) > 0: hasInterims[uid] = True else: hasInterims[uid] = False retested = 'retested' in form and uid in form['retested'] remarks = form.get('Remarks', [ {}, ])[0].get(uid, '') # Don't save uneccessary things # https://github.com/bikalabs/Bika-LIMS/issues/766: # Somehow, using analysis.edit() fails silently when # logged in as Analyst. if analysis.getInterimFields() != interimFields or \ analysis.getRetested() != retested or \ analysis.getRemarks() != remarks: analysis.setInterimFields(interimFields) analysis.setRetested(retested) analysis.setRemarks(remarks) # save results separately, otherwise capture date is rewritten if analysis.getResult() != result or \ analysis.getResultDM() != dry_result: analysis.setResultDM(dry_result) analysis.setResult(result) methods = self.request.form.get('Method', [{}])[0] instruments = self.request.form.get('Instrument', [{}])[0] analysts = self.request.form.get('Analyst', [{}])[0] uncertainties = self.request.form.get('Uncertainty', [{}])[0] dlimits = self.request.form.get('DetectionLimit', [{}])[0] # discover which items may be submitted submissable = [] for uid, analysis in selected_analyses.items(): analysis_active = isActive(analysis) # Need to save the instrument? if uid in instruments and analysis_active: # TODO: Add SetAnalysisInstrument permission # allow_setinstrument = sm.checkPermission(SetAnalysisInstrument) allow_setinstrument = True # ---8<----- if allow_setinstrument == True: # The current analysis allows the instrument regards # to its analysis service and method? if (instruments[uid] == ''): previnstr = analysis.getInstrument() if previnstr: previnstr.removeAnalysis(analysis) analysis.setInstrument(None) elif analysis.isInstrumentAllowed(instruments[uid]): previnstr = analysis.getInstrument() if previnstr: previnstr.removeAnalysis(analysis) analysis.setInstrument(instruments[uid]) instrument = analysis.getInstrument() instrument.addAnalysis(analysis) # Need to save the method? if uid in methods and analysis_active: # TODO: Add SetAnalysisMethod permission # allow_setmethod = sm.checkPermission(SetAnalysisMethod) allow_setmethod = True # ---8<----- if allow_setmethod == True and analysis.isMethodAllowed( methods[uid]): analysis.setMethod(methods[uid]) # Need to save the analyst? if uid in analysts and analysis_active: analysis.setAnalyst(analysts[uid]) # Need to save the uncertainty? if uid in uncertainties and analysis_active: analysis.setUncertainty(uncertainties[uid]) # Need to save the detection limit? if analysis_active: analysis.setDetectionLimitOperand(dlimits.get(uid, None)) if uid not in results or not results[uid]: continue can_submit = True # guard_submit does a lot of the same stuff, too. # the code there has also been commented. # we must find a better way to allow dependencies to control # this process. # for dependency in analysis.getDependencies(): # dep_state = workflow.getInfoFor(dependency, 'review_state') # if hasInterims[uid]: # if dep_state in ('to_be_sampled', 'to_be_preserved', # 'sample_due', 'sample_received', # 'attachment_due', 'to_be_verified',): # can_submit = False # break # else: # if dep_state in ('to_be_sampled', 'to_be_preserved', # 'sample_due', 'sample_received',): # can_submit = False # break if can_submit and analysis not in submissable: submissable.append(analysis) # and then submit them. for analysis in submissable: doActionFor(analysis, 'submit') message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') if checkPermission(EditResults, self.context): self.destination_url = self.context.absolute_url( ) + "/manage_results" else: self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url)
def __init__(self, context, request): super(WorksheetFolderListingView, self).__init__(context, request) self.catalog = 'bika_catalog' self.contentFilter = { 'portal_type': 'Worksheet', 'review_state': ['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on': 'id', 'sort_order': 'reverse' } self.context_actions = { _('Add'): { 'url': 'worksheet_add', 'icon': '++resource++bika.lims.images/add.png', 'class': 'worksheet_add' } } self.show_table_only = False self.show_sort_column = False self.show_select_row = False self.show_select_all_checkbox = True self.show_select_column = True self.pagesize = 25 self.restrict_results = False request.set('disable_border', 1) self.icon = self.portal_url + "/++resource++bika.lims.images/worksheet_big.png" self.title = self.context.translate(_("Worksheets")) self.description = "" pm = getToolByName(context, "portal_membership") # this is a property of self, because self.getAnalysts returns it self.analysts = getUsers(self, ['Manager', 'LabManager', 'Analyst']) self.analysts = self.analysts.sortedByKey() bsc = getToolByName(context, 'bika_setup_catalog') templates = [ t for t in bsc(portal_type='WorksheetTemplate', inactive_state='active') ] self.templates = [(t.UID, t.Title) for t in templates] self.templates.sort(lambda x, y: cmp(x[1], y[1])) self.instruments = [ (i.UID, i.Title) for i in bsc(portal_type='Instrument', inactive_state='active') ] self.instruments.sort(lambda x, y: cmp(x[1], y[1])) self.templateinstruments = {} for t in templates: i = t.getObject().getInstrument() if i: self.templateinstruments[t.UID] = i.UID() else: self.templateinstruments[t.UID] = '' self.columns = { 'Title': { 'title': _('Worksheet'), 'index': 'sortable_title' }, 'Priority': { 'title': _('Priority'), 'index': 'Priority', 'toggle': True }, 'Analyst': { 'title': _('Analyst'), 'index': 'getAnalyst', 'toggle': True }, 'Template': { 'title': _('Template'), 'toggle': True }, 'Services': { 'title': _('Services'), 'sortable': False, 'toggle': False }, 'SampleTypes': { 'title': _('Sample Types'), 'sortable': False, 'toggle': False }, 'Instrument': { 'title': _('Instrument'), 'sortable': False, 'toggle': False }, 'QC': { 'title': _('QC'), 'sortable': False, 'toggle': False }, 'QCTotals': { 'title': _('QC Samples(Analyses)'), 'sortable': False, 'toggle': False }, 'RoutineTotals': { 'title': _('Routine Samples(Analyses)'), 'sortable': False, 'toggle': False }, 'CreationDate': { 'title': PMF('Date Created'), 'toggle': True, 'index': 'created' }, 'state_title': { 'title': _('State'), 'index': 'review_state' }, } self.review_states = [ { 'id': 'default', 'title': _('All'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': ['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Priority', 'Analyst', 'Template', 'Services', 'SampleTypes', 'Instrument', 'QC', 'QCTotals', 'RoutineTotals', 'CreationDate', 'state_title' ] }, # getAuthenticatedMember does not work in __init__ # so 'mine' is configured further in 'folderitems' below. { 'id': 'mine', 'title': _('Mine'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': ['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Priority', 'Analyst', 'Template', 'Services', 'SampleTypes', 'Instrument', 'QC', 'QCTotals', 'RoutineTotals', 'CreationDate', 'state_title' ] }, { 'id': 'open', 'title': _('Open'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': 'open', 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Priority', 'Analyst', 'Template', 'Services', 'SampleTypes', 'Instrument', 'QC', 'QCTotals', 'RoutineTotals', 'CreationDate', 'state_title' ] }, { 'id': 'to_be_verified', 'title': _('To be verified'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': 'to_be_verified', 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Priority', 'Analyst', 'Template', 'Services', 'SampleTypes', 'Instrument', 'QC', 'QCTotals', 'RoutineTotals', 'CreationDate', 'state_title' ] }, { 'id': 'verified', 'title': _('Verified'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': 'verified', 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Priority', 'Analyst', 'Template', 'Services', 'SampleTypes', 'Instrument', 'QC', 'QCTotals', 'RoutineTotals', 'CreationDate', 'state_title' ] }, ]
def __call__(self): form = self.request.form portal = getSite() workbook = None if 'setupexisting' in form and 'existing' in form and form['existing']: fn = form['existing'].split(":") self.dataset_project = fn[0] self.dataset_name = fn[1] path = 'setupdata/%s/%s.xlsx' % \ (self.dataset_name, self.dataset_name) filename = resource_filename(self.dataset_project, path) try: workbook = load_workbook( filename=filename) # , use_iterators=True) except AttributeError: print "" print traceback.format_exc() print "Error while loading ", path elif 'setupfile' in form and 'file' in form and form[ 'file'] and 'projectname' in form and form['projectname']: self.dataset_project = form['projectname'] tmp = tempfile.mktemp() file_content = form['file'].read() open(tmp, 'wb').write(file_content) workbook = load_workbook(filename=tmp) # , use_iterators=True) self.dataset_name = 'uploaded' assert (workbook is not None) adapters = [[name, adapter] for name, adapter in list( getAdapters((self.context, ), ISetupDataImporter))] for sheetname in workbook.get_sheet_names(): transaction.savepoint() ad_name = sheetname.replace(" ", "_") if ad_name in [a[0] for a in adapters]: adapter = [a[1] for a in adapters if a[0] == ad_name][0] adapter(self, workbook, self.dataset_project, self.dataset_name) adapters = [a for a in adapters if a[0] != ad_name] for name, adapter in adapters: transaction.savepoint() adapter(self, workbook, self.dataset_project, self.dataset_name) check = len(self.deferred) while len(self.deferred) > 0: new = self.solve_deferred() logger.info("solved %s of %s deferred references" % (check - new, check)) if new == check: raise Exception("%s unsolved deferred references: %s" % (len(self.deferred), self.deferred)) check = new logger.info("Rebuilding bika_setup_catalog") bsc = getToolByName(self.context, 'bika_setup_catalog') bsc.clearFindAndRebuild() logger.info("Rebuilding bika_catalog") bc = getToolByName(self.context, 'bika_catalog') bc.clearFindAndRebuild() logger.info("Rebuilding bika_analysis_catalog") bac = getToolByName(self.context, 'bika_analysis_catalog') bac.clearFindAndRebuild() message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message) self.request.RESPONSE.redirect(portal.absolute_url())
def translate(id): return t(PMF(id + "_transition_title"))