def __init__(self, context, request): BrowserView.__init__(self, context, request) self.selection_macros = SelectionMacrosView(context, request) self.icon = "++resource++bika.lims.images/query_big.png" self.getAnalysts = getUsers(context, ["Manager", "LabManager", "Analyst"]) request.set("disable_border", 1)
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.selection_macros = SelectionMacrosView(context, request) self.icon = self.portal_url + "/++resource++bika.lims.images/query_big.png" self.getAnalysts = getUsers(context, ['Manager', 'LabManager', 'Analyst']) request.set('disable_border', 1)
def getAnalysts(self): analysts = getUsers(self.context, ['Manager', 'LabManager', 'Analyst']) analysts = analysts.sortedByKey() ret = [] for a in analysts: ret.append({'ResultValue': a, 'ResultText': analysts.getValue(a)}) return ret
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.selection_macros = SelectionMacrosView(context, request) self.icon = "++resource++bika.lims.images/query_big.png" self.getAnalysts = getUsers(context, ['Manager', 'LabManager', 'Analyst']) request.set('disable_border', 1)
def get_analysts(self): analysts = getUsers(self.context, ['Manager', 'LabManager', 'Analyst']) analysts = analysts.sortedByKey() results = list() for analyst_id, analyst_name in analysts.items(): results.append({'ResultValue': analyst_id, 'ResultText': analyst_name}) return results
def __call__(self): self.selection_macros = SelectionMacrosView(self.context, self.request) self.icon = self.portal_url + "/++resource++bika.lims.images/report_big.png" self.getAnalysts = getUsers(self.context, ['Manager', 'LabManager', 'Analyst']) self.additional_reports = [] adapters = getAdapters((self.context, ), IProductivityReport) for name, adapter in adapters: report_dict = adapter(self.context, self.request) report_dict['id'] = name self.additional_reports.append(report_dict) return self.template()
def _createWorksheet(base, worksheettemplate, analyst): """ This function creates a new worksheet takeing advantatge of the analyst variable. If there isn't an analyst definet, the system will puck up the the first one obtained in a query. """ if not(analyst): # Get any analyst analyst = getUsers(base, ['Manager', 'LabManager', 'Analyst'])[1] folder = base.bika_setup.worksheets _id = folder.invokeFactory('Worksheet', id=tmpID()) ws = folder[_id] ws.unmarkCreationFlag() new_ws_id = renameAfterCreation(ws) ws.edit( Number=new_ws_id, Analyst=analyst, ) if worksheettemplate: ws.applyWorksheetTemplate(worksheettemplate) return ws
def lookup_sampler_uid(import_user): #Lookup sampler's uid found = False userid = None user_ids = [] users = getUsers(self, ['LabManager', 'Sampler']).items() for (samplerid, samplername) in users: if import_user == samplerid: found = True userid = samplerid break if import_user == samplername: user_ids.append(samplerid) if found: return userid if len(user_ids) == 1: return user_ids[0] if len(user_ids) > 1: #raise ValueError('Sampler %s is ambiguous' % import_user) return '' #Otherwise #raise ValueError('Sampler %s not found' % import_user) return ''
def lookup_sampler_uid(import_user): #Lookup sampler's uid found = False userid = None user_ids = [] users = getUsers(self, ['LabManager', 'Sampler']).items() for (samplerid, samplername) in users: if import_user == samplerid: found = True userid = samplerid break if import_user == samplername: user_ids.append(samplerid) if found: return userid if len(user_ids) == 1: return user_ids[0] if len(user_ids) > 1: #raise ValueError('Sampler %s is ambiguous' % import_user) return None #Otherwise #raise ValueError('Sampler %s not found' % import_user) return None
def folderitem(self, obj, item, index): # Additional info from AnalysisRequest to be added in the item # generated by default by bikalisting. # Call the folderitem method from the base class item = super(SamplesView, self).folderitem(obj, item, index) if not item: return None item["Creator"] = self.user_fullname(obj.Creator) # If we redirect from the folderitems view we should check if the # user has permissions to medify the element or not. priority_sort_key = obj.getPrioritySortkey if not priority_sort_key: # Default priority is Medium = 3. # The format of PrioritySortKey is <priority>.<created> priority_sort_key = "3.%s" % obj.created.ISO8601() priority = priority_sort_key.split(".")[0] priority_text = PRIORITIES.getValue(priority) priority_div = """<div class="priority-ico priority-%s"> <span class="notext">%s</span><div> """ item["replace"]["Priority"] = priority_div % (priority, priority_text) item["replace"]["getProfilesTitle"] = obj.getProfilesTitleStr analysesnum = obj.getAnalysesNum if analysesnum: num_verified = str(analysesnum[0]) num_total = str(analysesnum[1]) item["getAnalysesNum"] = "{0}/{1}".format(num_verified, num_total) else: item["getAnalysesNum"] = "" # Progress progress_perc = obj.getProgress item["Progress"] = progress_perc item["replace"]["Progress"] = get_progress_bar_html(progress_perc) item["BatchID"] = obj.getBatchID if obj.getBatchID: item['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (obj.getBatchURL, obj.getBatchID) # TODO: SubGroup ??? # val = obj.Schema().getField('SubGroup').get(obj) # item['SubGroup'] = val.Title() if val else '' item["SamplingDate"] = self.str_date(obj.getSamplingDate) item["getDateReceived"] = self.str_date(obj.getDateReceived) item["getDueDate"] = self.str_date(obj.getDueDate) item["getDatePublished"] = self.str_date(obj.getDatePublished) item["getDateVerified"] = self.str_date(obj.getDateVerified) if self.is_printing_workflow_enabled: item["Printed"] = "" printed = obj.getPrinted if hasattr(obj, "getPrinted") else "0" print_icon = "" if printed == "0": print_icon = get_image("delete.png", title=t(_("Not printed yet"))) elif printed == "1": print_icon = get_image("ok.png", title=t(_("Printed"))) elif printed == "2": print_icon = get_image( "exclamation.png", title=t(_("Republished after last print"))) item["after"]["Printed"] = print_icon item["SamplingDeviation"] = obj.getSamplingDeviationTitle item["getStorageLocation"] = obj.getStorageLocationTitle after_icons = "" if obj.assigned_state == 'assigned': after_icons += get_image("worksheet.png", title=t(_("All analyses assigned"))) if item["review_state"] == 'invalid': after_icons += get_image("delete.png", title=t(_("Results have been withdrawn"))) due_date = obj.getDueDate if due_date and due_date < (obj.getDatePublished or DateTime()): due_date_str = self.ulocalized_time(due_date) img_title = "{}: {}".format(t(_("Late Analyses")), due_date_str) after_icons += get_image("late.png", title=img_title) if obj.getSamplingDate and obj.getSamplingDate > DateTime(): after_icons += get_image("calendar.png", title=t(_("Future dated sample"))) if obj.getInvoiceExclude: after_icons += get_image("invoice_exclude.png", title=t(_("Exclude from invoice"))) if obj.getHazardous: after_icons += get_image("hazardous.png", title=t(_("Hazardous"))) if obj.getInternalUse: after_icons += get_image("locked.png", title=t(_("Internal use"))) if after_icons: item['after']['getId'] = after_icons item['Created'] = self.ulocalized_time(obj.created, long_format=1) if obj.getContactUID: item['ClientContact'] = obj.getContactFullName item['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (obj.getContactURL, obj.getContactFullName) else: item["ClientContact"] = "" # TODO-performance: If SamplingWorkflowEnabled, we have to get the # full object to check the user permissions, so far this is # a performance hit. if obj.getSamplingWorkflowEnabled: # We don't do anything with Sampling Date. # User can modify Sampling date # inside AR view. In this listing view, # we only let the user to edit Date Sampled # and Sampler if he wants to make 'sample' transaction. if not obj.getDateSampled: datesampled = self.ulocalized_time( DateTime(), long_format=True) item["class"]["getDateSampled"] = "provisional" else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = obj.getSampler if sampler: item["replace"]["getSampler"] = obj.getSamplerFullName if "Sampler" in self.roles and not sampler: sampler = self.member.id item["class"]["getSampler"] = "provisional" # sampling workflow - inline edits for Sampler and Date Sampled if item["review_state"] == 'to_be_sampled': # We need to get the full object in order to check # the permissions full_object = obj.getObject() checkPermission = \ self.context.portal_membership.checkPermission # TODO Do we really need this check? if checkPermission(TransitionSampleSample, full_object): item["required"] = ["getSampler", "getDateSampled"] item["allow_edit"] = ["getSampler", "getDateSampled"] # TODO-performance: hit performance while getting the # sample object... # TODO Can LabManagers be a Sampler?! samplers = getUsers(full_object, ["Sampler", ]) username = self.member.getUserName() users = [({ "ResultValue": u, "ResultText": samplers.getValue(u)}) for u in samplers] item['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' sampler = Sampler else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = obj.getSamplerFullName if obj.getSampler else '' else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = "" item["getDateSampled"] = datesampled item["getSampler"] = sampler # These don't exist on ARs # XXX This should be a list of preservers... item["getPreserver"] = "" item["getDatePreserved"] = "" # Assign parent and children partitions of this sample if self.show_partitions: item["parent"] = obj.getRawParentAnalysisRequest item["children"] = obj.getDescendantsUIDs or [] return item
def folderitems(self, full_objects=False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() translate = self.context.translate roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles for x in range(len(items)): if not items[x].has_key('obj'): continue obj = items[x]['obj'] items[x]['replace']['getSampleID'] = "<a href='%s'>%s</a>" % \ (items[x]['url'], obj.getSampleID()) items[x]['replace']['Requests'] = ",".join([ "<a href='%s'>%s</a>" % (o.absolute_url(), o.Title()) for o in obj.getAnalysisRequests() ]) items[x]['Client'] = obj.aq_parent.Title() if hideclientlink == False: items[x]['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) items[x]['Creator'] = self.user_fullname(obj.Creator()) items[x]['DateReceived'] = self.ulocalized_time( obj.getDateReceived()) deviation = obj.getSamplingDeviation() items[x]['SamplingDeviation'] = deviation and deviation.Title( ) or '' items[x]['getStorageLocation'] = obj.getStorageLocation( ) and obj.getStorageLocation().Title() or '' items[x]['AdHoc'] = obj.getAdHoc() and True or '' items[x]['Created'] = self.ulocalized_time(obj.created()) samplingdate = obj.getSamplingDate() items[x]['getSamplingDate'] = self.ulocalized_time(samplingdate, long_format=1) after_icons = '' if obj.getSampleType().getHazardous(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/hazardous.png'>" % \ (t(_("Hazardous")), self.portal_url) if obj.getSamplingDate() > DateTime(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/calendar.png' >" % \ (t(_("Future dated sample")), self.portal_url) if after_icons: items[x]['after']['getSampleID'] = after_icons SamplingWorkflowEnabled =\ self.context.bika_setup.getSamplingWorkflowEnabled() if not samplingdate > DateTime() \ and SamplingWorkflowEnabled: datesampled = self.ulocalized_time(obj.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time(DateTime()) items[x]['class']['getDateSampled'] = 'provisional' sampler = obj.getSampler().strip() if sampler: items[x]['replace']['getSampler'] = self.user_fullname( sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id items[x]['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' items[x]['getDateSampled'] = datesampled items[x]['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): items[x]['required'] = ['getSampler', 'getDateSampled'] items[x]['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({ 'ResultValue': u, 'ResultText': samplers.getValue(u) }) for u in samplers] items[x]['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' items[x]['getSampler'] = Sampler # These don't exist on samples # the columns exist just to set "preserve" transition from lists. # XXX This should be a list of preservers... items[x]['getPreserver'] = '' items[x]['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] = ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({ 'ResultValue': u, 'ResultText': preservers.getValue(u) }) for u in preservers] items[x]['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' items[x]['getPreserver'] = preserver items[x]['getDatePreserved'] = self.ulocalized_time(DateTime()) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' # Hide Preservation/Sampling workflow actions if the edit columns # are not displayed. toggle_cols = self.get_toggle_cols() new_states = [] for i, state in enumerate(self.review_states): if state['id'] == self.review_state: if 'getSampler' not in toggle_cols \ or 'getDateSampled' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('sample') else: state['hide_transitions'] = [ 'sample', ] if 'getPreserver' not in toggle_cols \ or 'getDatePreserved' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('preserve') else: state['hide_transitions'] = [ 'preserve', ] new_states.append(state) self.review_states = new_states return items
def _getSamplersDisplayList(self): """ Returns the available users in the system with the roles 'LabManager' and/or 'Sampler' """ return getUsers(self, ['LabManager', 'Sampler'])
def select_analyst(self): self.analysts = getUsers(self.context, ['Manager', 'LabManager', 'Analyst']) return self.select_analyst_pt()
def select_analyst(self, allow_blank=False, style=None): self.style = style self.analysts = getUsers(self.context, ["Manager", "Analyst", "LabManager"], allow_blank) return self.select_analyst_pt()
def __init__(self, context, request): super(FolderView, 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',], '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 select_user(self): self.users = getUsers(self.context, [ 'Manager', 'LabManager', 'LabClerk', 'Analyst', 'Sampler', 'Preserver', 'Verifier' ]) return self.select_user_pt()
def folderitem(self, obj, item, index): # Additional info from AnalysisRequest to be added in the item # generated by default by bikalisting. # Call the folderitem method from the base class item = BikaListingView.folderitem(self, obj, item, index) if not item: return None # This variable will contain the full analysis request if there is # need to work with the full object instead of the brain full_object = None item["Creator"] = self.user_fullname(obj.Creator) # If we redirect from the folderitems view we should check if the # user has permissions to medify the element or not. priority_sort_key = obj.getPrioritySortkey if not priority_sort_key: # Default priority is Medium = 3. # The format of PrioritySortKey is <priority>.<created> priority_sort_key = "3.%s" % obj.created.ISO8601() priority = priority_sort_key.split(".")[0] priority_text = PRIORITIES.getValue(priority) priority_div = """<div class="priority-ico priority-%s"> <span class="notext">%s</span><div> """ item["replace"]["Priority"] = priority_div % (priority, priority_text) item["replace"]["getProfilesTitle"] = obj.getProfilesTitleStr analysesnum = obj.getAnalysesNum if analysesnum: num_verified = str(analysesnum[0]) num_total = str(analysesnum[1]) item["getAnalysesNum"] = "{0}/{1}".format(num_verified, num_total) else: item["getAnalysesNum"] = "" # Progress num_verified = 0 num_submitted = 0 num_total = 0 if analysesnum and len(analysesnum) > 1: num_verified = analysesnum[0] num_total = analysesnum[1] num_submitted = num_total - num_verified if len(analysesnum) > 2: num_wo_results = analysesnum[2] num_submitted = num_total - num_verified - num_wo_results num_steps_total = num_total * 2 num_steps = (num_verified * 2) + (num_submitted) progress_perc = 0 if num_steps > 0 and num_steps_total > 0: progress_perc = (num_steps * 100) / num_steps_total progress = '<div class="progress-bar-container">' + \ '<div class="progress-bar" style="width:{0}%"></div>' + \ '<div class="progress-perc">{0}%</div></div>' item["replace"]["Progress"] = progress.format(progress_perc) item["BatchID"] = obj.getBatchID if obj.getBatchID: item['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (obj.getBatchURL, obj.getBatchID) # TODO: SubGroup ??? # val = obj.Schema().getField('SubGroup').get(obj) # item['SubGroup'] = val.Title() if val else '' date = obj.getSamplingDate item["SamplingDate"] = \ self.ulocalized_time(date, long_format=1) if date else "" date = obj.getDateReceived item["getDateReceived"] = \ self.ulocalized_time(date, long_format=1) if date else "" date = obj.getDatePublished item["getDatePublished"] = \ self.ulocalized_time(date, long_format=1) if date else "" date = obj.getDateVerified item["getDateVerified"] = \ self.ulocalized_time(date, long_format=1) if date else "" if self.printwfenabled: item["Printed"] = "" printed = obj.getPrinted if hasattr(obj, "getPrinted") else "0" print_icon = "" if printed == "0": print_icon = \ """<img src='%s/++resource++bika.lims.images/delete.png' title='%s'> """ % (self.portal_url, t(_("Not printed yet"))) elif printed == "1": print_icon = \ """<img src='%s/++resource++bika.lims.images/ok.png' title='%s'> """ % (self.portal_url, t(_("Printed"))) elif printed == "2": print_icon = \ """<img src='%s/++resource++bika.lims.images/exclamation.png' title='%s'> """ \ % (self.portal_url, t(_("Republished after last print"))) item["after"]["Printed"] = print_icon item["SamplingDeviation"] = obj.getSamplingDeviationTitle item["getStorageLocation"] = obj.getStorageLocationTitle after_icons = "" # Getting a dictionary with each workflow id and current state in it states_dict = obj.getObjectWorkflowStates if obj.assigned_state == 'assigned': after_icons += \ """<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/> """ % (self.portal_url, t(_("All analyses assigned"))) if states_dict.get('review_state', '') == 'invalid': after_icons += \ """<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/> """ % (self.portal_url, t(_("Results have been withdrawn"))) if obj.getLate: after_icons += \ """<img src='%s/++resource++bika.lims.images/late.png' title='%s'> """ % (self.portal_url, t(_("Late Analyses"))) if obj.getSamplingDate and obj.getSamplingDate > DateTime(): after_icons += \ """<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'> """ % (self.portal_url, t(_("Future dated sample"))) if obj.getInvoiceExclude: after_icons += \ """<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'> """ % (self.portal_url, t(_("Exclude from invoice"))) if obj.getHazardous: after_icons += \ """<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'> """ % (self.portal_url, t(_("Hazardous"))) if after_icons: item['after']['getId'] = after_icons item['Created'] = self.ulocalized_time(obj.created, long_format=1) if obj.getContactUID: item['ClientContact'] = obj.getContactFullName item['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (obj.getContactURL, obj.getContactFullName) else: item["ClientContact"] = "" # TODO-performance: If SamplingWorkflowEnabled, we have to get the # full object to check the user permissions, so far this is # a performance hit. if obj.getSamplingWorkflowEnabled: # We don't do anything with Sampling Date. # User can modify Sampling date # inside AR view. In this listing view, # we only let the user to edit Date Sampled # and Sampler if he wants to make 'sample' transaction. if not obj.getDateSampled: datesampled = self.ulocalized_time(DateTime(), long_format=True) item["class"]["getDateSampled"] = "provisional" else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = obj.getSampler if sampler: item["replace"]["getSampler"] = obj.getSamplerFullName if "Sampler" in self.roles and not sampler: sampler = self.member.id item["class"]["getSampler"] = "provisional" # sampling workflow - inline edits for Sampler and Date Sampled if states_dict.get('review_state', '') == 'to_be_sampled': # We need to get the full object in order to check # the permissions full_object = obj.getObject() checkPermission =\ self.context.portal_membership.checkPermission if checkPermission(SampleSample, full_object): item["required"] = ["getSampler", "getDateSampled"] item["allow_edit"] = ["getSampler", "getDateSampled"] # TODO-performance: hit performance while getting the # sample object... # TODO Can LabManagers be a Sampler?! samplers = getUsers(full_object.getSample(), [ "Sampler", ]) username = self.member.getUserName() users = [({ "ResultValue": u, "ResultText": samplers.getValue(u) }) for u in samplers] item['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' sampler = Sampler else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = obj.getSamplerFullName if obj.getSampler else '' else: datesampled = self.ulocalized_time(obj.getDateSampled, long_format=True) sampler = "" item["getDateSampled"] = datesampled item["getSampler"] = sampler # These don't exist on ARs # XXX This should be a list of preservers... item["getPreserver"] = "" item["getDatePreserved"] = "" # TODO-performance: If inline preservation wants to be used, we # have to get the full object to check the user permissions, so # far this is a performance hit. # inline edits for Preserver and Date Preserved # if checkPermission(PreserveSample, obj): # item['required'] = ['getPreserver', 'getDatePreserved'] # item['allow_edit'] = ['getPreserver', 'getDatePreserved'] # preservers = getUsers(obj, ['Preserver', # 'LabManager', 'Manager']) # username = self.member.getUserName() # users = [({'ResultValue': u, # 'ResultText': preservers.getValue(u)}) # for u in preservers] # item['choices'] = {'getPreserver': users} # preserver = username in preservers.keys() and username or '' # item['getPreserver'] = preserver # item['getDatePreserved'] = self.ulocalized_time( # DateTime(), # long_format=1) # item['class']['getPreserver'] = 'provisional' # item['class']['getDatePreserved'] = 'provisional' # Submitting user may not verify results # Thee conditions to improve performance, some functions to check # the condition need to get the full analysis request. if states_dict.get("review_state", "") == "to_be_verified": allowed = user.has_permission(VerifyPermission, username=self.member.getUserName()) # TODO-performance: isUserAllowedToVerify getts all analysis # objects inside the analysis request. if allowed: # Gettin the full object if not get before full_object = full_object if full_object else obj.getObject() if not full_object.isUserAllowedToVerify(self.member): item["after"]["state_title"] = \ """<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/> """ % t(_("Cannot verify: Submitted by current user")) return item
def getSamplers(self): return getUsers(self, ["LabManager", "Sampler"])
def folderitems(self, full_objects=False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles for x in range(len(items)): if 'obj' not in items[x]: continue obj = items[x]['obj'] sample = obj.getSample() if getSecurityManager().checkPermission(EditResults, obj): url = obj.absolute_url() + "/manage_results" else: url = obj.absolute_url() items[x]['Client'] = obj.aq_parent.Title() if (hideclientlink is False): items[x]['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) items[x]['Creator'] = self.user_fullname(obj.Creator()) items[x]['getRequestID'] = obj.getRequestID() items[x]['replace']['getRequestID'] = "<a href='%s'>%s</a>" % \ (url, items[x]['getRequestID']) items[x]['getSample'] = sample items[x]['replace']['getSample'] = \ "<a href='%s'>%s</a>" % (sample.absolute_url(), sample.Title()) if obj.getAnalysesNum(): items[x]['getAnalysesNum'] = str(obj.getAnalysesNum()[0]) + '/' + str(obj.getAnalysesNum()[1]) else: items[x]['getAnalysesNum'] = '' batch = obj.getBatch() if batch: items[x]['BatchID'] = batch.getBatchID() items[x]['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (batch.absolute_url(), items[x]['BatchID']) else: items[x]['BatchID'] = '' val = obj.Schema().getField('SubGroup').get(obj) items[x]['SubGroup'] = val.Title() if val else '' samplingdate = obj.getSample().getSamplingDate() items[x]['SamplingDate'] = self.ulocalized_time(samplingdate, long_format=1) items[x]['getDateReceived'] = self.ulocalized_time(obj.getDateReceived()) items[x]['getDatePublished'] = self.ulocalized_time(obj.getDatePublished()) deviation = sample.getSamplingDeviation() items[x]['SamplingDeviation'] = deviation and deviation.Title() or '' priority = obj.getPriority() items[x]['Priority'] = '' # priority.Title() items[x]['getStorageLocation'] = sample.getStorageLocation() and sample.getStorageLocation().Title() or '' items[x]['AdHoc'] = sample.getAdHoc() and True or '' after_icons = "" state = workflow.getInfoFor(obj, 'worksheetanalysis_review_state') if state == 'assigned': after_icons += "<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/>" % \ (self.portal_url, t(_("All analyses assigned"))) if workflow.getInfoFor(obj, 'review_state') == 'invalid': after_icons += "<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/>" % \ (self.portal_url, t(_("Results have been withdrawn"))) if obj.getLate(): after_icons += "<img src='%s/++resource++bika.lims.images/late.png' title='%s'>" % \ (self.portal_url, t(_("Late Analyses"))) if samplingdate > DateTime(): after_icons += "<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'>" % \ (self.portal_url, t(_("Future dated sample"))) if obj.getInvoiceExclude(): after_icons += "<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'>" % \ (self.portal_url, t(_("Exclude from invoice"))) if sample.getSampleType().getHazardous(): after_icons += "<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'>" % \ (self.portal_url, t(_("Hazardous"))) if after_icons: items[x]['after']['getRequestID'] = after_icons items[x]['Created'] = self.ulocalized_time(obj.created()) contact = obj.getContact() if contact: items[x]['ClientContact'] = contact.Title() items[x]['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (contact.absolute_url(), contact.Title()) else: items[x]['ClientContact'] = "" SamplingWorkflowEnabled = sample.getSamplingWorkflowEnabled() if SamplingWorkflowEnabled and not samplingdate > DateTime(): datesampled = self.ulocalized_time(sample.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time( DateTime(), long_format=1) items[x]['class']['getDateSampled'] = 'provisional' sampler = sample.getSampler().strip() if sampler: items[x]['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id items[x]['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' items[x]['getDateSampled'] = datesampled items[x]['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): items[x]['required'] = ['getSampler', 'getDateSampled'] items[x]['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] items[x]['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' items[x]['getSampler'] = Sampler # These don't exist on ARs # XXX This should be a list of preservers... items[x]['getPreserver'] = '' items[x]['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] = ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] items[x]['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' items[x]['getPreserver'] = preserver items[x]['getDatePreserved'] = self.ulocalized_time( DateTime(), long_format=1) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' # Submitting user may not verify results if items[x]['review_state'] == 'to_be_verified' and \ not checkPermission(VerifyOwnResults, obj): self_submitted = False try: review_history = list(workflow.getInfoFor(obj, 'review_history')) review_history.reverse() for event in review_history: if event.get('action') == 'submit': if event.get('actor') == member.getId(): self_submitted = True break if self_submitted: items[x]['after']['state_title'] = \ "<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/>" % \ t(_("Cannot verify: Submitted by current user")) except Exception: pass # Hide Preservation/Sampling workflow actions if the edit columns # are not displayed. toggle_cols = self.get_toggle_cols() new_states = [] for i, state in enumerate(self.review_states): if state['id'] == self.review_state: if 'getSampler' not in toggle_cols \ or 'getDateSampled' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('sample') else: state['hide_transitions'] = ['sample', ] if 'getPreserver' not in toggle_cols \ or 'getDatePreserved' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('preserve') else: state['hide_transitions'] = ['preserve', ] new_states.append(state) self.review_states = new_states return items
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.icon = "++resource++bika.lims.images/report_big.png" self.TimeOrDate = TimeOrDate self.getAnalysts = getUsers(context, ["Manager", "LabManager", "Analyst"])
def folderitems(self, full_objects=False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles for x in range(len(items)): if 'obj' not in items[x]: continue obj = items[x]['obj'] sample = obj.getSample() if getSecurityManager().checkPermission(EditResults, obj): url = obj.absolute_url() + "/manage_results" else: url = obj.absolute_url() items[x]['Client'] = obj.aq_parent.Title() if (hideclientlink is False): items[x]['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) items[x]['Creator'] = self.user_fullname(obj.Creator()) items[x]['getRequestID'] = obj.getRequestID() items[x]['replace']['getRequestID'] = "<a href='%s'>%s</a>" % \ (url, items[x]['getRequestID']) items[x]['getSample'] = sample items[x]['replace']['getSample'] = \ "<a href='%s'>%s</a>" % (sample.absolute_url(), sample.Title()) items[x]['replace']['getProfilesTitle'] = ", ".join( [p.Title() for p in obj.getProfiles()]) if obj.getAnalysesNum(): items[x]['getAnalysesNum'] = str(obj.getAnalysesNum()[0]) + '/' + str(obj.getAnalysesNum()[1]) else: items[x]['getAnalysesNum'] = '' batch = obj.getBatch() if batch: items[x]['BatchID'] = batch.getBatchID() items[x]['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (batch.absolute_url(), items[x]['BatchID']) else: items[x]['BatchID'] = '' val = obj.Schema().getField('SubGroup').get(obj) items[x]['SubGroup'] = val.Title() if val else '' samplingdate = obj.getSample().getSamplingDate() items[x]['SamplingDate'] = self.ulocalized_time(samplingdate, long_format=1) items[x]['getDateReceived'] = self.ulocalized_time(obj.getDateReceived()) items[x]['getDatePublished'] = self.ulocalized_time(obj.getDatePublished()) deviation = sample.getSamplingDeviation() items[x]['SamplingDeviation'] = deviation and deviation.Title() or '' priority = obj.getPriority() items[x]['Priority'] = '' # priority.Title() items[x]['getStorageLocation'] = sample.getStorageLocation() and sample.getStorageLocation().Title() or '' items[x]['AdHoc'] = sample.getAdHoc() and True or '' after_icons = "" state = workflow.getInfoFor(obj, 'worksheetanalysis_review_state') if state == 'assigned': after_icons += "<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/>" % \ (self.portal_url, t(_("All analyses assigned"))) if workflow.getInfoFor(obj, 'review_state') == 'invalid': after_icons += "<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/>" % \ (self.portal_url, t(_("Results have been withdrawn"))) if obj.getLate(): after_icons += "<img src='%s/++resource++bika.lims.images/late.png' title='%s'>" % \ (self.portal_url, t(_("Late Analyses"))) if samplingdate > DateTime(): after_icons += "<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'>" % \ (self.portal_url, t(_("Future dated sample"))) if obj.getInvoiceExclude(): after_icons += "<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'>" % \ (self.portal_url, t(_("Exclude from invoice"))) if sample.getSampleType().getHazardous(): after_icons += "<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'>" % \ (self.portal_url, t(_("Hazardous"))) if after_icons: items[x]['after']['getRequestID'] = after_icons items[x]['Created'] = self.ulocalized_time(obj.created()) contact = obj.getContact() if contact: items[x]['ClientContact'] = contact.Title() items[x]['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (contact.absolute_url(), contact.Title()) else: items[x]['ClientContact'] = "" SamplingWorkflowEnabled = sample.getSamplingWorkflowEnabled() if SamplingWorkflowEnabled and not samplingdate > DateTime(): datesampled = self.ulocalized_time(sample.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time( DateTime(), long_format=1) items[x]['class']['getDateSampled'] = 'provisional' sampler = sample.getSampler().strip() if sampler: items[x]['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id items[x]['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' items[x]['getDateSampled'] = datesampled items[x]['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): items[x]['required'] = ['getSampler', 'getDateSampled'] items[x]['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] items[x]['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' items[x]['getSampler'] = Sampler # These don't exist on ARs # XXX This should be a list of preservers... items[x]['getPreserver'] = '' items[x]['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] = ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] items[x]['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' items[x]['getPreserver'] = preserver items[x]['getDatePreserved'] = self.ulocalized_time( DateTime(), long_format=1) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' # Submitting user may not verify results if items[x]['review_state'] == 'to_be_verified' and \ not checkPermission(VerifyOwnResults, obj): self_submitted = False try: review_history = list(workflow.getInfoFor(obj, 'review_history')) review_history.reverse() for event in review_history: if event.get('action') == 'submit': if event.get('actor') == member.getId(): self_submitted = True break if self_submitted: items[x]['after']['state_title'] = \ "<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/>" % \ t(_("Cannot verify: Submitted by current user")) except Exception: pass # Hide Preservation/Sampling workflow actions if the edit columns # are not displayed. toggle_cols = self.get_toggle_cols() new_states = [] for i, state in enumerate(self.review_states): if state['id'] == self.review_state: if 'getSampler' not in toggle_cols \ or 'getDateSampled' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('sample') else: state['hide_transitions'] = ['sample', ] if 'getPreserver' not in toggle_cols \ or 'getDatePreserved' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('preserve') else: state['hide_transitions'] = ['preserve', ] new_states.append(state) self.review_states = new_states return items
def __call__(self): self.selection_macros = SelectionMacrosView(self.context, self.request) self.icon = self.portal_url + "/++resource++bika.lims.images/report_big.png" self.getAnalysts = getUsers(self.context, ['Manager', 'LabManager', 'Analyst']) return self.template()
def get_analysts(self): """Returns Analysts """ roles = ["Manager", "LabManager", "Analyst"] return getUsers(self.context, roles)
def folderitems(self, full_objects = False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() translate = self.context.translate roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles for x in range(len(items)): if not items[x].has_key('obj'): continue obj = items[x]['obj'] items[x]['replace']['getSampleID'] = "<a href='%s'>%s</a>" % \ (items[x]['url'], obj.getSampleID()) items[x]['replace']['Requests'] = ",".join( ["<a href='%s'>%s</a>" % (o.absolute_url(), o.Title()) for o in obj.getAnalysisRequests()]) items[x]['Client'] = obj.aq_parent.Title() if hideclientlink == False: items[x]['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) items[x]['Creator'] = self.user_fullname(obj.Creator()) items[x]['DateReceived'] = self.ulocalized_time(obj.getDateReceived()) deviation = obj.getSamplingDeviation() items[x]['SamplingDeviation'] = deviation and deviation.Title() or '' items[x]['getStorageLocation'] = obj.getStorageLocation() and obj.getStorageLocation().Title() or '' items[x]['AdHoc'] = obj.getAdHoc() and True or '' items[x]['Created'] = self.ulocalized_time(obj.created()) samplingdate = obj.getSamplingDate() items[x]['getSamplingDate'] = self.ulocalized_time(samplingdate, long_format=1) after_icons = '' if obj.getSampleType().getHazardous(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/hazardous.png'>" % \ (t(_("Hazardous")), self.portal_url) if obj.getSamplingDate() > DateTime(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/calendar.png' >" % \ (t(_("Future dated sample")), self.portal_url) if after_icons: items[x]['after']['getSampleID'] = after_icons SamplingWorkflowEnabled =\ self.context.bika_setup.getSamplingWorkflowEnabled() if not samplingdate > DateTime() \ and SamplingWorkflowEnabled: datesampled = self.ulocalized_time(obj.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time(DateTime()) items[x]['class']['getDateSampled'] = 'provisional' sampler = obj.getSampler().strip() if sampler: items[x]['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id items[x]['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' items[x]['getDateSampled'] = datesampled items[x]['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): items[x]['required'] = ['getSampler', 'getDateSampled'] items[x]['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] items[x]['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' items[x]['getSampler'] = Sampler # These don't exist on samples # the columns exist just to set "preserve" transition from lists. # XXX This should be a list of preservers... items[x]['getPreserver'] = '' items[x]['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] = ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] items[x]['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' items[x]['getPreserver'] = preserver items[x]['getDatePreserved'] = self.ulocalized_time(DateTime()) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' # Hide Preservation/Sampling workflow actions if the edit columns # are not displayed. toggle_cols = self.get_toggle_cols() new_states = [] for i,state in enumerate(self.review_states): if state['id'] == self.review_state: if 'getSampler' not in toggle_cols \ or 'getDateSampled' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('sample') else: state['hide_transitions'] = ['sample',] if 'getPreserver' not in toggle_cols \ or 'getDatePreserved' not in toggle_cols: if 'hide_transitions' in state: state['hide_transitions'].append('preserve') else: state['hide_transitions'] = ['preserve',] new_states.append(state) self.review_states = new_states return items
def __init__(self, context, request): super(FolderView, self).__init__(context, request) self.catalog = CATALOG_WORKSHEET_LISTING self.contentFilter = { 'review_state': ['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on': 'CreationDate', '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.restrict_results = False self.wf = getToolByName(self, 'portal_workflow') self.rc = getToolByName(self, REFERENCE_CATALOG) self.pm = getToolByName(self.context, "portal_membership") 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 = "" # this is a property of self, because self.getAnalysts returns it self.analysts = getUsers(self, ['Manager', 'LabManager', 'Analyst']) self.analysts = self.analysts.sortedByKey() self.allowed_department_filtering = \ self.context.bika_setup.getAllowDepartmentFiltering() self.columns = { 'Title': { 'title': _('Worksheet'), 'index': 'getId' }, 'Analyst': { 'title': _('Analyst'), 'index': 'getAnalyst', }, 'Template': { 'title': _('Template'), 'attr': 'getWorksheetTemplateTitle', 'replace_url': 'getWorksheetTemplateURL', }, 'NumRegularSamples': { 'title': _('Samples'), 'sortable': False, }, 'NumQCAnalyses': { 'title': _('QC Analyses'), 'sortable': False, }, 'NumRegularAnalyses': { 'title': _('Routine Analyses'), 'sortable': False, }, 'CreationDate': { 'title': PMF('Date Created'), 'index': 'created' }, 'state_title': { 'title': _('State'), 'index': 'review_state', 'attr': 'state_title' }, } self.review_states = [ { 'id': 'default', 'title': _('All'), 'contentFilter': { 'review_state': ['open', 'to_be_verified', 'verified'], 'sort_on': 'CreationDate', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title' ] }, # getAuthenticatedMember does not work in __init__ # so 'mine' is configured further in 'folderitems' below. { 'id': 'mine', 'title': _('Mine'), 'contentFilter': { 'review_state': ['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on': 'CreationDate', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title' ] }, { 'id': 'open', 'title': _('Open'), 'contentFilter': { 'review_state': 'open', 'sort_on': 'CreationDate', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title' ] }, { 'id': 'to_be_verified', 'title': _('To be verified'), 'contentFilter': { 'review_state': 'to_be_verified', 'sort_on': 'CreationDate', 'sort_order': 'reverse' }, 'transitions': [{ 'id': 'retract' }, { 'id': 'verify' }, { 'id': 'reject' }], 'columns': [ 'Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title' ] }, { 'id': 'verified', 'title': _('Verified'), 'contentFilter': { 'review_state': 'verified', 'sort_on': 'CreationDate', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title' ] }, ]
def getAnalysts(self): """ This function returns a displaylist with the available analysts """ analysts = getUsers(self, ['Manager', 'LabManager', 'Analyst']) return analysts.sortedByKey()
def __init__(self, context, request): super(FolderView, self).__init__(context, request) self.catalog = CATALOG_WORKSHEET_LISTING self.contentFilter = { "review_state": ["open", "to_be_verified", "verified", "rejected"], "sort_on": "created", "sort_order": "reverse" } self.title = self.context.translate(_("Worksheets")) self.description = "" self.icon = "{}/{}".format( self.portal_url, "++resource++bika.lims.images/worksheet_big.png") self.context_actions = { _("Add"): { "url": "createObject?type_name=InstrumentMaintenanceTask", "icon": "++resource++bika.lims.images/add.png" } } self.context_actions = { _("Add"): { "url": "worksheet_add", "icon": "++resource++bika.lims.images/add.png", "class": "worksheet_add" } } self.show_select_column = True self.show_select_all_checkbox = True self.filter_by_user = False self.selected_state = "" self.analyst_choices = [] self.can_reassign = False self.can_manage = False self.rc = getToolByName(self, REFERENCE_CATALOG) # this is a property of self, because self.getAnalysts returns it self.analysts = getUsers(self, ["Manager", "LabManager", "Analyst"]) self.analysts = self.analysts.sortedByValue() self.analyst_choices = [] for a in self.analysts: self.analyst_choices.append({ "ResultValue": a, "ResultText": self.analysts.getValue(a), }) self.columns = collections.OrderedDict(( ("getProgressPercentage", { "title": _("Progress") }), ("Title", { "title": _("Worksheet"), "index": "getId" }), ("Analyst", { "title": _("Analyst"), "index": "getAnalyst" }), ("getWorksheetTemplateTitle", { "title": _("Template"), "replace_url": "getWorksheetTemplateURL" }), ("getNumberOfRegularSamples", { "title": _("Samples") }), ("getNumberOfQCAnalyses", { "title": _("QC Analyses") }), ("getNumberOfRegularAnalyses", { "title": _("Routine Analyses") }), ("CreationDate", { "title": _("Created"), "index": "created" }), ("state_title", { "title": _("State"), "index": "review_state", "attr": "state_title" }), )) self.review_states = [ { "id": "default", "title": _("Active"), "contentFilter": { "review_state": [ "open", "to_be_verified", ], "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys(), }, { "id": "open", "title": _("Open"), "contentFilter": { "review_state": "open", "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys(), }, { "id": "to_be_verified", "title": _("To be verified"), "contentFilter": { "review_state": "to_be_verified", "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys() }, { "id": "verified", "title": _("Verified"), "contentFilter": { "review_state": "verified", "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys(), }, { "id": "all", "title": _("All"), "contentFilter": { "review_state": [ "open", "to_be_verified", "verified", "rejected", ], "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys(), }, { # getAuthenticatedMember does not work in __init__ so "mine" is # configured further in "folderitems" below. "id": "mine", "title": _("Mine"), "contentFilter": { "review_state": ["open", "to_be_verified", "verified", "rejected"], "sort_on": "CreationDate", "sort_order": "reverse" }, "transitions": [], "custom_transitions": [], "columns": self.columns.keys(), } ]
def select_user(self, allow_blank=True, style=None): self.style = style self.allow_blank = allow_blank self.users = getUsers(self.context, None, allow_blank) return self.select_user_pt()
def folderitem(self, obj, item, index): workflow = getToolByName(self.context, "portal_workflow") mtool = getToolByName(self.context, 'portal_membership') member = mtool.getAuthenticatedMember() translate = self.context.translate roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles if not item.has_key('obj'): return item obj = item['obj'] item['replace']['getSampleID'] = "<a href='%s'>%s</a>" % \ (item['url'], obj.getSampleID()) item['replace']['Requests'] = ",".join( ["<a href='%s'>%s</a>" % (o.absolute_url(), o.Title()) for o in obj.getAnalysisRequests()]) item['Client'] = obj.aq_parent.Title() if hideclientlink == False: item['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) item['Creator'] = self.user_fullname(obj.Creator()) item['DateReceived'] = self.ulocalized_time(obj.getDateReceived()) deviation = obj.getSamplingDeviation() item['SamplingDeviation'] = deviation and deviation.Title() or '' item['getStorageLocation'] = obj.getStorageLocation() and obj.getStorageLocation().Title() or '' item['AdHoc'] = obj.getAdHoc() and True or '' item['Created'] = self.ulocalized_time(obj.created()) sd = obj.getSamplingDate() item['SamplingDate'] = \ self.ulocalized_time(sd, long_format=1) if sd else '' after_icons = '' if obj.getSampleType().getHazardous(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/hazardous.png'>" % \ (t(_("Hazardous")), self.portal_url) if sd and sd > DateTime(): after_icons += "<img title='%s' " \ "src='%s/++resource++bika.lims.images/calendar.png' >" % \ (t(_("Future dated sample")), self.portal_url) if after_icons: item['after']['getSampleID'] = after_icons if obj.getSamplingWorkflowEnabled(): datesampled = self.ulocalized_time( obj.getDateSampled(), long_format=True) if not datesampled: datesampled = self.ulocalized_time( DateTime(), long_format=True) item['class']['DateSampled'] = 'provisional' sampler = obj.getSampler().strip() if sampler: item['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id item['class']['getSampler'] = 'provisional' else: datesampled = self.ulocalized_time(obj.getDateSampled(), long_format=True) sampler = '' item['DateSampled'] = datesampled item['getSampler'] = sampler # sampling workflow - inline edits for Sampler, Date Sampled and # Scheduled Sampling Sampler checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, 'review_state') if state in ['to_be_sampled', 'scheduled_sampling']: item['required'] = [] item['allow_edit'] = [] item['choices'] = {} samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) users = [( {'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] # both situations if checkPermission(SampleSample, obj) or\ self._schedule_sampling_permissions(): item['required'].append('getSampler') item['allow_edit'].append('getSampler') item['choices']['getSampler'] = users # sampling permissions if checkPermission(SampleSample, obj): getAuthenticatedMember = self.context.\ portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' item['required'].append('DateSampled') item['allow_edit'].append('DateSampled') item['getSampler'] = Sampler # coordinator permissions if self._schedule_sampling_permissions(): item['required'].append('SamplingDate') item['allow_edit'].append('SamplingDate') item['required'].append('getScheduledSamplingSampler') item['allow_edit'].append( 'getScheduledSamplingSampler') item['choices']['getScheduledSamplingSampler'] = users # These don't exist on samples # the columns exist just to set "preserve" transition from lists. # XXX This should be a list of preservers... item['getPreserver'] = '' item['getDatePreserved'] = '' # Here we are defining the name of the content field represented by # the column item['field']['getSampler'] = 'Sampler' item['field']['getScheduledSamplingSampler'] =\ 'ScheduledSamplingSampler' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): item['required'] = ['getPreserver', 'getDatePreserved'] item['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] item['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' item['getPreserver'] = preserver item['getDatePreserved'] = self.ulocalized_time(DateTime()) item['class']['getPreserver'] = 'provisional' item['class']['getDatePreserved'] = 'provisional' return item
def folderitem(self, obj, item, index): # Additional info from AnalysisRequest to be added in the item generated # by default by bikalisting. # Call the folderitem method from the base class item = BikaListingView.folderitem(self, obj, item, index) if not item: return None member = self.mtool.getAuthenticatedMember() roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles sample = obj.getSample() url = obj.absolute_url() if getSecurityManager().checkPermission(EditResults, obj): url += "/manage_results" item['Client'] = obj.aq_parent.Title() if (hideclientlink == False): item['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) item['Creator'] = self.user_fullname(obj.Creator()) item['getRequestID'] = obj.getRequestID() item['replace']['getRequestID'] = "<a href='%s'>%s</a>" % \ (url, item['getRequestID']) item['getSample'] = sample item['replace']['getSample'] = \ "<a href='%s'>%s</a>" % (sample.absolute_url(), sample.Title()) item['replace']['getProfilesTitle'] = ", ".join( [p.Title() for p in obj.getProfiles()]) analysesnum = obj.getAnalysesNum() if analysesnum: item['getAnalysesNum'] = str(analysesnum[0]) + '/' + str(analysesnum[1]) else: item['getAnalysesNum'] = '' batch = obj.getBatch() if batch: item['BatchID'] = batch.getBatchID() item['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (batch.absolute_url(), item['BatchID']) else: item['BatchID'] = '' val = obj.Schema().getField('SubGroup').get(obj) item['SubGroup'] = val.Title() if val else '' samplingdate = obj.getSample().getSamplingDate() item['SamplingDate'] = self.ulocalized_time(samplingdate, long_format=1) item['getDateReceived'] = self.ulocalized_time(obj.getDateReceived()) item['getDatePublished'] = self.ulocalized_time(obj.getDatePublished()) item['getDateVerified'] = getTransitionDate(obj, 'verify') deviation = sample.getSamplingDeviation() item['SamplingDeviation'] = deviation and deviation.Title() or '' priority = obj.getPriority() item['Priority'] = '' # priority.Title() item['getStorageLocation'] = sample.getStorageLocation() and sample.getStorageLocation().Title() or '' item['AdHoc'] = sample.getAdHoc() and True or '' after_icons = "" state = self.workflow.getInfoFor(obj, 'worksheetanalysis_review_state') if state == 'assigned': after_icons += "<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/>" % \ (self.portal_url, t(_("All analyses assigned"))) if self.workflow.getInfoFor(obj, 'review_state') == 'invalid': after_icons += "<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/>" % \ (self.portal_url, t(_("Results have been withdrawn"))) if obj.getLate(): after_icons += "<img src='%s/++resource++bika.lims.images/late.png' title='%s'>" % \ (self.portal_url, t(_("Late Analyses"))) if samplingdate > DateTime(): after_icons += "<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'>" % \ (self.portal_url, t(_("Future dated sample"))) if obj.getInvoiceExclude(): after_icons += "<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'>" % \ (self.portal_url, t(_("Exclude from invoice"))) if sample.getSampleType().getHazardous(): after_icons += "<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'>" % \ (self.portal_url, t(_("Hazardous"))) if after_icons: item['after']['getRequestID'] = after_icons item['Created'] = self.ulocalized_time(obj.created()) contact = obj.getContact() if contact: item['ClientContact'] = contact.Title() item['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (contact.absolute_url(), contact.Title()) else: item['ClientContact'] = "" SamplingWorkflowEnabled = sample.getSamplingWorkflowEnabled() if SamplingWorkflowEnabled and not samplingdate > DateTime(): datesampled = self.ulocalized_time(sample.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time( DateTime(), long_format=1) item['class']['getDateSampled'] = 'provisional' sampler = sample.getSampler().strip() if sampler: item['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id item['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' item['getDateSampled'] = datesampled item['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = self.workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): item['required'] = ['getSampler', 'getDateSampled'] item['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] item['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' item['getSampler'] = Sampler # These don't exist on ARs # XXX This should be a list of preservers... item['getPreserver'] = '' item['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): item['required'] = ['getPreserver', 'getDatePreserved'] item['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) username = member.getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] item['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' item['getPreserver'] = preserver item['getDatePreserved'] = self.ulocalized_time( DateTime(), long_format=1) item['class']['getPreserver'] = 'provisional' item['class']['getDatePreserved'] = 'provisional' # Submitting user may not verify results if item['review_state'] == 'to_be_verified' and \ not checkPermission(VerifyOwnResults, obj): self_submitted = False try: review_history = list(self.workflow.getInfoFor(obj, 'review_history')) review_history.reverse() for event in review_history: if event.get('action') == 'submit': if event.get('actor') == member.getId(): self_submitted = True break if self_submitted: item['after']['state_title'] = \ "<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/>" % \ t(_("Cannot verify: Submitted by current user")) except Exception: pass return item
def folderitems(self, full_objects = False): items = BikaListingView.folderitems(self) props = getToolByName(self.context, 'portal_properties').bika_properties datepicker_format = props.getProperty('datepicker_format') bsc = getToolByName(self.context, 'bika_setup_catalog') containers = [({'ResultValue':o.UID, 'ResultText':o.title}) for o in bsc(portal_type="Container", inactive_state="active")] preservations = [({'ResultValue':o.UID, 'ResultText':o.title}) for o in bsc(portal_type="Preservation", inactive_state="active")] for x in range(len(items)): if not items[x].has_key('obj'): continue obj = items[x]['obj'] items[x]['PartTitle'] = obj.getId() container = obj.getContainer() if self.allow_edit: items[x]['getContainer'] = container and container.UID() or '' else: items[x]['getContainer'] = container and container.Title() or '' preservation = obj.getPreservation() if self.allow_edit: items[x]['getPreservation'] = preservation and preservation.UID() or '' else: items[x]['getPreservation'] = preservation and preservation.Title() or '' ## sampler = obj.getSampler().strip() ## items[x]['getSampler'] = \ ## sampler and pretty_user_name_or_id(self.context, sampler) or '' ## datesampled = obj.getDateSampled() ## items[x]['getDateSampled'] = \ ## datesampled and TimeOrDate(self.context, datesampled) or '' preserver = obj.getPreserver().strip() items[x]['getPreserver'] = \ preserver and pretty_user_name_or_id(self.context, preserver) or '' datepreserved = obj.getDatePreserved() items[x]['getDatePreserved'] = \ datepreserved and TimeOrDate(self.context, datepreserved) or '' disposaldate = obj.getDisposalDate() items[x]['getDisposalDate'] = \ disposaldate and TimeOrDate(self.context, disposaldate) or '' samplingdate = obj.getSamplingDate() # inline edits for Container and Preservation items[x]['allow_edit'] = ['getContainer', 'getPreservation'] items[x]['choices']['getPreservation'] = preservations items[x]['choices']['getContainer'] = containers # inline edits for Sampler and Date Sampled ## checkPermission = self.context.portal_membership.checkPermission ## if checkPermission(SampleSample, obj) \ ## and not samplingdate > DateTime(): ## items[x]['required'] += ['getSampler', 'getDateSampled'] ## items[x]['allow_edit'] += ['getSampler', 'getDateSampled'] ## samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) ## getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember ## username = getAuthenticatedMember().getUserName() ## users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) ## for u in samplers] ## items[x]['choices']['getSampler'] = users ## items[x]['getSampler'] = sampler and sampler or \ ## (username in samplers.keys() and username) or '' ## items[x]['getDateSampled'] = items[x]['getDateSampled'] \ ## or DateTime().strftime(datepicker_format) ## items[x]['class']['getSampler'] = 'provisional' ## items[x]['class']['getDateSampled'] = 'provisional' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] += ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] += ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] items[x]['choices']['getPreserver'] = users items[x]['getPreserver'] = preserver and preserver or \ (username in preservers.keys() and username) or '' items[x]['getDatePreserved'] = items[x]['getDatePreserved'] \ or DateTime().strftime(datepicker_format) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' return items
def folderitems(self, full_objects=False): items = BikaListingView.folderitems(self) bsc = getToolByName(self.context, 'bika_setup_catalog') containers = [({ 'ResultValue': o.UID, 'ResultText': o.title }) for o in bsc(portal_type="Container", inactive_state="active")] preservations = [({ 'ResultValue': o.UID, 'ResultText': o.title }) for o in bsc(portal_type="Preservation", inactive_state="active")] for x in range(len(items)): if not items[x].has_key('obj'): continue obj = items[x]['obj'] items[x]['PartTitle'] = obj.getId() container = obj.getContainer() if self.allow_edit: items[x]['getContainer'] = container and container.UID() or '' else: items[x]['getContainer'] = container and container.Title( ) or '' preservation = obj.getPreservation() if self.allow_edit: items[ x]['getPreservation'] = preservation and preservation.UID( ) or '' else: items[x][ 'getPreservation'] = preservation and preservation.Title( ) or '' ## sampler = obj.getSampler().strip() ## items[x]['getSampler'] = \ ## sampler and self.user_fullname(sampler) or '' ## datesampled = obj.getDateSampled() ## items[x]['getDateSampled'] = \ ## datesampled and self.ulocalized_time(datesampled) or '' preserver = obj.getPreserver().strip() items[x]['getPreserver'] = \ preserver and self.user_fullname(preserver) or '' datepreserved = obj.getDatePreserved() items[x]['getDatePreserved'] = \ datepreserved and self.ulocalized_time(datepreserved) or '' disposaldate = obj.getDisposalDate() items[x]['getDisposalDate'] = \ disposaldate and self.ulocalized_time(disposaldate) or '' samplingdate = obj.getSamplingDate() # inline edits for Container and Preservation items[x]['allow_edit'] = ['getContainer', 'getPreservation'] items[x]['choices']['getPreservation'] = preservations items[x]['choices']['getContainer'] = containers # inline edits for Sampler and Date Sampled ## checkPermission = self.context.portal_membership.checkPermission ## if checkPermission(SampleSample, obj) \ ## and not samplingdate > DateTime(): ## items[x]['required'] += ['getSampler', 'getDateSampled'] ## items[x]['allow_edit'] += ['getSampler', 'getDateSampled'] ## samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) ## getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember ## username = getAuthenticatedMember().getUserName() ## users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) ## for u in samplers] ## items[x]['choices']['getSampler'] = users ## items[x]['getSampler'] = sampler and sampler or \ ## (username in samplers.keys() and username) or '' ## items[x]['getDateSampled'] = items[x]['getDateSampled'] \ ## or DateTime().strftime(self.date_format_short) ## items[x]['class']['getSampler'] = 'provisional' ## items[x]['class']['getDateSampled'] = 'provisional' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] += ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] += ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({ 'ResultValue': u, 'ResultText': preservers.getValue(u) }) for u in preservers] items[x]['choices']['getPreserver'] = users items[x]['getPreserver'] = preserver and preserver or \ (username in preservers.keys() and username) or '' items[x]['getDatePreserved'] = items[x]['getDatePreserved'] \ or DateTime().strftime(self.date_format_short) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' return items
def __call__(self): form = self.request.form bc = getToolByName(self.context, 'bika_catalog') bsc = getToolByName(self.context, 'bika_setup_catalog') checkPermission = self.context.portal_membership.checkPermission getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember workflow = getToolByName(self.context, 'portal_workflow') ars = self.context.getAnalysisRequests() props = getToolByName(self.context, 'portal_properties').bika_properties datepicker_format = props.getProperty('datepicker_format') sample = self.context ## Create header_table data rows ar_links = ", ".join( ["<a href='%s'>%s</a>"%(ar.absolute_url(), ar.Title()) for ar in ars]) sp = self.context.getSamplePoint() st = self.context.getSampleType() if workflow.getInfoFor(self.context, 'cancellation_state') == "cancelled": allow_sample_edit = False else: edit_states = ['to_be_sampled', 'to_be_preserved', 'sample_due'] allow_sample_edit = checkPermission(ManageSamples, self.context) \ and workflow.getInfoFor(self.context, 'review_state') in edit_states SamplingWorkflowEnabled =\ self.context.bika_setup.getSamplingWorkflowEnabled() samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) self.header_columns = 3 self.header_rows = [ {'id': 'ClientReference', 'title': _('Client Reference'), 'allow_edit': self.allow_edit, 'value': self.context.getClientReference(), 'condition':True, 'type': 'text'}, {'id': 'ClientSampleID', 'title': _('Client SID'), 'allow_edit': self.allow_edit, 'value': self.context.getClientSampleID(), 'condition':True, 'type': 'text'}, {'id': 'Requests', 'title': _('Requests'), 'allow_edit': False, 'value': ar_links, 'condition':True, 'type': 'text'}, {'id': 'SampleType', 'title': _('Sample Type'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': st and st.Title() or '', 'condition':True, 'type': 'text', 'required': True}, {'id': 'SamplePoint', 'title': _('Sample Point'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sp and sp.Title() or '', 'condition':True, 'type': 'text'}, {'id': 'Composite', 'title': _('Composite'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': self.context.getComposite(), 'condition':True, 'type': 'boolean'}, {'id': 'Creator', 'title': PMF('Creator'), 'allow_edit': False, 'value': pretty_user_name_or_id(self.context, self.context.Creator()), 'condition':True, 'type': 'text'}, {'id': 'DateCreated', 'title': PMF('Date Created'), 'allow_edit': False, 'value': self.context.created(), 'formatted_value': TimeOrDate(self.context, self.context.created()), 'condition':True, 'type': 'text'}, {'id': 'SamplingDate', 'title': _('Sampling Date'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': self.context.getSamplingDate().strftime(datepicker_format), 'formatted_value': TimeOrDate(self.context, self.context.getSamplingDate()), 'condition':True, 'class': 'datepicker', 'type': 'text'}, {'id': 'DateSampled', 'title': _('Date Sampled'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sample.getDateSampled() and sample.getDateSampled().strftime(datepicker_format) or '', 'formatted_value': sample.getDateSampled() and TimeOrDate(self.context, sample.getDateSampled()) or '', 'condition':SamplingWorkflowEnabled, 'class': 'datepicker', 'type': 'text', 'required': True}, {'id': 'Sampler', 'title': _('Sampler'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sample.getSampler(), 'formatted_value': sample.getSampler(), 'condition':SamplingWorkflowEnabled, 'vocabulary': samplers, 'type': 'choices', 'required': True}, {'id': 'DateReceived', 'title': _('Date Received'), 'allow_edit': False, 'value': self.context.getDateReceived(), 'formatted_value': TimeOrDate(self.context, self.context.getDateReceived()), 'condition':True, 'type': 'text'}, {'id': 'DateExpired', 'title': _('Date Expired'), 'allow_edit': False, 'value': self.context.getDateExpired(), 'formatted_value': TimeOrDate(self.context, self.context.getDateExpired()), 'condition':True, 'type': 'text'}, {'id': 'DisposalDate', 'title': _('Disposal Date'), 'allow_edit': False, 'value': self.context.getDisposalDate(), 'formatted_value': TimeOrDate(self.context, self.context.getDisposalDate()), 'condition':True, 'type': 'text'}, {'id': 'DateDisposed', 'title': _('Date Disposed'), 'allow_edit': False, 'value': self.context.getDateDisposed(), 'formatted_value': TimeOrDate(self.context, self.context.getDateDisposed()), 'condition':True, 'type': 'text'}, ] if self.allow_edit: self.header_buttons = [{'name':'save_button', 'title':_('Save')}] else: self.header_buttons = [] ## handle_header table submit if form.get('header_submitted', None): plone.protect.CheckAuthenticator(form) message = None values = {} for row in [r for r in self.header_rows if r['allow_edit']]: value = urllib.unquote_plus(form.get(row['id'], '')) if row['id'] == 'SampleType': if not value: message = PMF( u'error_required', default=u'${name} is required, please correct.', mapping={'name': _('Sample Type')}) break if not bsc(portal_type = 'SampleType', title = value): message = _("${sampletype} is not a valid sample type", mapping={'sampletype':value}) break if row['id'] == 'SamplePoint': if value and \ not bsc(portal_type = 'SamplePoint', title = value): message = _("${samplepoint} is not a valid sample point", mapping={'sampletype':value}) break values[row['id']] = value # boolean - checkboxes are 'true' or 'false in form. for row in [r for r in self.header_rows if r.get('type', '') == 'boolean']: value = form.get(row['id'], 'false') values[row['id']] = value == 'true' and True or False if not message: self.context.edit(**values) self.context.reindexObject() ars = self.context.getAnalysisRequests() for ar in ars: ar.reindexObject() message = PMF("Changes saved.") # If this sample was "To Be Sampled", and the # Sampler and DateSampled fields were completed, # do the Sampled transition. if workflow.getInfoFor(sample, "review_state") == "to_be_sampled" \ and form.get("Sampler", None) \ and form.get("DateSampled", None): workflow.doActionFor(sample, "sample") sample.reindexObject() self.context.plone_utils.addPortalMessage(message, 'info') url = self.context.absolute_url().split("?")[0] self.request.RESPONSE.redirect(url) return ## Create Sample Partitions table parts_table = None if not self.allow_edit: p = SamplePartitionsView(self.context, self.request) p.allow_edit = self.allow_edit p.show_select_column = self.allow_edit p.show_workflow_action_buttons = self.allow_edit p.show_column_toggles = False p.show_select_all_checkbox = False p.review_states[0]['transitions'] = [{'id': 'empty'},] # none parts_table = p.contents_table() self.parts = parts_table ## Create Field and Lab Analyses tables self.tables = {} if not self.allow_edit: for poc in POINTS_OF_CAPTURE: if not self.context.getAnalyses({'getPointOfCapture': poc}): continue t = SampleAnalysesView(self.context, self.request, getPointOfCapture = poc, sort_on = 'getServiceTitle') t.form_id = "sample_%s_analyses" % poc if poc == 'field': t.review_states[0]['columns'].remove('DueDate') t.show_column_toggles = False t.review_states[0]['transitions'] = [{'id':'submit'}, {'id':'retract'}, {'id':'verify'}] self.tables[POINTS_OF_CAPTURE.getValue(poc)] = t.contents_table() return self.template()
def __init__(self, context, request): super(FolderView, self).__init__(context, request) self.catalog = CATALOG_WORKSHEET_LISTING self.contentFilter = { 'review_state':['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on':'CreationDate', '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.restrict_results = False self.wf = getToolByName(self, 'portal_workflow') self.rc = getToolByName(self, REFERENCE_CATALOG) self.pm = getToolByName(self.context, "portal_membership") 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 = "" # this is a property of self, because self.getAnalysts returns it self.analysts = getUsers(self, ['Manager', 'LabManager', 'Analyst']) self.analysts = self.analysts.sortedByKey() self.allowed_department_filtering = \ self.context.bika_setup.getAllowDepartmentFiltering() self.columns = { 'Title': {'title': _('Worksheet'), 'index': 'getId'}, 'Analyst': {'title': _('Analyst'), 'index': 'getAnalyst', }, 'Template': {'title': _('Template'), 'attr': 'getWorksheetTemplateTitle', 'replace_url': 'getWorksheetTemplateURL', }, 'NumRegularSamples': { 'title': _('Samples'), 'sortable': False, }, 'NumQCAnalyses': { 'title': _('QC Analyses'), 'sortable': False, }, 'NumRegularAnalyses': { 'title': _('Routine Analyses'), 'sortable': False, }, 'CreationDate': {'title': PMF('Date Created'), 'index': 'created'}, 'state_title': {'title': _('State'), 'index': 'review_state', 'attr': 'state_title'}, } self.review_states = [ {'id':'default', 'title': _('All'), 'contentFilter': {'review_state': ['open', 'to_be_verified', 'verified'], 'sort_on':'CreationDate', 'sort_order': 'reverse'}, 'transitions':[{'id':'retract'}, {'id':'verify'}, {'id':'reject'}], 'columns':['Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title']}, # getAuthenticatedMember does not work in __init__ # so 'mine' is configured further in 'folderitems' below. {'id':'mine', 'title': _('Mine'), 'contentFilter': {'review_state':['open', 'to_be_verified', 'verified', 'rejected'], 'sort_on':'CreationDate', 'sort_order': 'reverse'}, 'transitions':[{'id':'retract'}, {'id':'verify'}, {'id':'reject'}], 'columns':['Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title']}, {'id':'open', 'title': _('Open'), 'contentFilter': {'review_state':'open', 'sort_on':'CreationDate', 'sort_order': 'reverse'}, 'transitions':[], 'columns':['Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title']}, {'id':'to_be_verified', 'title': _('To be verified'), 'contentFilter': {'review_state':'to_be_verified', 'sort_on':'CreationDate', 'sort_order': 'reverse'}, 'transitions':[{'id':'retract'}, {'id':'verify'}, {'id':'reject'}], 'columns':['Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title']}, {'id':'verified', 'title': _('Verified'), 'contentFilter': {'review_state':'verified', 'sort_on':'CreationDate', 'sort_order': 'reverse'}, 'transitions':[], 'columns':['Title', 'Analyst', 'Template', 'NumRegularSamples', 'NumQCAnalyses', 'NumRegularAnalyses', 'CreationDate', 'state_title']}, ]
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.getAnalysts = getUsers(context, ['Manager', 'LabManager', 'Analyst']) self.layout_displaylist = WORKSHEET_LAYOUT_OPTIONS
def __init__(self, context, request): BikaListingView.__init__(self, context, request) 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 request.set('disable_border', 1) self.icon = "++resource++bika.lims.images/worksheet_big.png" self.title = _("Worksheets") self.description = "" self.TimeOrDate = TimeOrDate pm = getToolByName(context, "portal_membership") # this is a property of self, because self.getAnalysts returns it self.analysts = getUsers(self, ['Manager', 'LabManager', 'Analyst']) 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' }, '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 }, 'QC': { 'title': _('QC'), 'sortable': False, 'toggle': False }, 'CreationDate': { 'title': _('Creation Date'), 'toggle': True }, #'index': 'created'}, 'state_title': { 'title': _('State'), 'index': 'review_state' }, } self.review_states = [ { 'id': 'all', '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', 'Analyst', 'Template', 'Services', 'SampleTypes', 'QC', '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', 'Analyst', 'Template', 'Services', 'SampleTypes', 'QC', 'CreationDate', 'state_title' ] }, { 'id': 'open', 'title': _('Open'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': 'open', 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Analyst', 'Template', 'Services', 'SampleTypes', 'QC', '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', 'Analyst', 'Template', 'Services', 'SampleTypes', 'QC', 'CreationDate', 'state_title' ] }, { 'id': 'verified', 'title': _('Verified'), 'contentFilter': { 'portal_type': 'Worksheet', 'review_state': 'verified', 'sort_on': 'id', 'sort_order': 'reverse' }, 'transitions': [], 'columns': [ 'Title', 'Analyst', 'Template', 'Services', 'SampleTypes', 'QC', 'CreationDate', 'state_title' ] }, ]
def getSamplers(self): return getUsers(self, [ 'Sampler', ])
def getSamplers(self): return getUsers(self, ['Sampler', ])
def folderitems(self, full_objects = False): mtool = getToolByName(self.context, 'portal_membership') workflow = getToolByName(self.context, 'portal_workflow') checkPermission = mtool.checkPermission edit_states = ['sample_registered', 'to_be_sampled', 'sampled', 'to_be_preserved', 'sample_due', 'attachment_due', 'sample_received', 'to_be_verified'] if self.context.portal_type == 'AnalysisRequest': self.sample = self.context.getSample() else: self.sample = self.context self.allow_edit = checkPermission(EditSamplePartition, self.sample) \ and workflow.getInfoFor(self.sample, 'review_state') in edit_states \ and workflow.getInfoFor(self.sample, 'cancellation_state') == 'active' self.show_select_column = self.allow_edit if self.allow_edit == False: self.review_states[0]['custom_actions'] = [] bsc = getToolByName(self.context, 'bika_setup_catalog') containers = [({'ResultValue':o.UID, 'ResultText':o.title}) for o in bsc(portal_type="Container", inactive_state="active")] preservations = [({'ResultValue':o.UID, 'ResultText':o.title}) for o in bsc(portal_type="Preservation", inactive_state="active")] parts = [p for p in self.sample.objectValues() if p.portal_type == 'SamplePartition'] items = [] for part in parts: # this folderitems doesn't subclass from the bika_listing.py # so we create items from scratch item = { 'obj': part, 'id': part.id, 'uid': part.UID(), 'title': part.Title(), 'type_class': 'contenttype-SamplePartition', 'url': part.aq_parent.absolute_url(), 'relative_url': part.aq_parent.absolute_url(), 'view_url': part.aq_parent.absolute_url(), 'created': self.ulocalized_time(part.created()), 'replace': {}, 'before': {}, 'after': {}, 'choices': {}, 'class': {}, 'allow_edit': [], 'required': [], } state = workflow.getInfoFor(part, 'review_state') item['state_class'] = 'state-'+state item['state_title'] = _(state) item['PartTitle'] = part.getId() container = part.getContainer() if self.allow_edit: item['getContainer'] = container and container.UID() or '' else: item['getContainer'] = container and container.Title() or '' preservation = part.getPreservation() if self.allow_edit: item['getPreservation'] = preservation and preservation.UID() or '' else: item['getPreservation'] = preservation and preservation.Title() or '' ## sampler = part.getSampler().strip() ## item['getSampler'] = \ ## sampler and self.user_fullname(sampler) or '' ## datesampled = part.getDateSampled() ## item['getDateSampled'] = \ ## datesampled and self.ulocalized_time(datesampled) or '' preserver = part.getPreserver().strip() item['getPreserver'] = \ preserver and self.user_fullname(preserver) or '' datepreserved = part.getDatePreserved() item['getDatePreserved'] = \ datepreserved and self.ulocalized_time(datepreserved, long_format=False) or '' disposaldate = part.getDisposalDate() item['getDisposalDate'] = \ disposaldate and self.ulocalized_time(disposaldate, long_format=False) or '' # inline edits for Container and Preservation if self.allow_edit: item['allow_edit'] = ['getContainer', 'getPreservation'] item['choices']['getPreservation'] = preservations item['choices']['getContainer'] = containers # inline edits for Sampler and Date Sampled ## checkPermission = self.context.portal_membership.checkPermission ## if checkPermission(SampleSample, part) \ ## and not samplingdate > DateTime(): ## item['required'] += ['getSampler', 'getDateSampled'] ## item['allow_edit'] += ['getSampler', 'getDateSampled'] ## samplers = getUsers(part, ['Sampler', 'LabManager', 'Manager']) ## getAuthenticatedMember = part.portal_membership.getAuthenticatedMember ## username = getAuthenticatedMember().getUserName() ## users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) ## for u in samplers] ## item['choices']['getSampler'] = users ## item['getSampler'] = sampler and sampler or \ ## (username in samplers.keys() and username) or '' ## item['getDateSampled'] = item['getDateSampled'] \ ## or DateTime().strftime(self.date_format_short) ## item['class']['getSampler'] = 'provisional' ## item['class']['getDateSampled'] = 'provisional' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, part): item['required'] += ['getPreserver', 'getDatePreserved'] if self.allow_edit: item['allow_edit'] += ['getPreserver', 'getDatePreserved'] preservers = getUsers(part, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = part.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] item['choices']['getPreserver'] = users item['getPreserver'] = preserver and preserver or \ (username in preservers.keys() and username) or '' item['getDatePreserved'] = item['getDatePreserved'] \ or DateTime().strftime(self.date_format_short) item['class']['getPreserver'] = 'provisional' item['class']['getDatePreserved'] = 'provisional' items.append(item) items = sorted(items, key=itemgetter('id')) return items
def select_analyst(self, allow_blank=False, style=None): self.style = style self.analysts = getUsers(self.context, ['Manager', 'Analyst', 'LabManager'], allow_blank) return self.select_analyst_pt()
def folderitems(self, full_objects=False): mtool = getToolByName(self.context, 'portal_membership') workflow = getToolByName(self.context, 'portal_workflow') checkPermission = mtool.checkPermission edit_states = [ 'sample_registered', 'to_be_sampled', 'sampled', 'to_be_preserved', 'sample_due', 'attachment_due', 'sample_received', 'to_be_verified' ] if self.context.portal_type == 'AnalysisRequest': self.sample = self.context.getSample() else: self.sample = self.context self.allow_edit = checkPermission(EditSamplePartition, self.sample) \ and workflow.getInfoFor(self.sample, 'review_state') in edit_states \ and workflow.getInfoFor(self.sample, 'cancellation_state') == 'active' self.show_select_column = self.allow_edit if self.allow_edit == False: self.review_states[0]['custom_actions'] = [] bsc = getToolByName(self.context, 'bika_setup_catalog') containers = [({ 'ResultValue': o.UID, 'ResultText': o.title }) for o in bsc(portal_type="Container", inactive_state="active")] preservations = [({ 'ResultValue': o.UID, 'ResultText': o.title }) for o in bsc(portal_type="Preservation", inactive_state="active")] parts = [ p for p in self.sample.objectValues() if p.portal_type == 'SamplePartition' ] items = [] for part in parts: # this folderitems doesn't subclass from the bika_listing.py # so we create items from scratch item = { 'obj': part, 'id': part.id, 'uid': part.UID(), 'title': part.Title(), 'type_class': 'contenttype-SamplePartition', 'url': part.aq_parent.absolute_url(), 'relative_url': part.aq_parent.absolute_url(), 'view_url': part.aq_parent.absolute_url(), 'created': self.ulocalized_time(part.created()), 'replace': {}, 'before': {}, 'after': {}, 'choices': {}, 'class': {}, 'allow_edit': [], 'required': [], } state = workflow.getInfoFor(part, 'review_state') item['state_class'] = 'state-' + state item['state_title'] = _(state) item['PartTitle'] = part.getId() container = part.getContainer() if self.allow_edit: item['getContainer'] = container and container.UID() or '' else: item['getContainer'] = container and container.Title() or '' item['SecuritySealIntact'] = container.getSecuritySealIntact( ) if container else True preservation = part.getPreservation() if self.allow_edit: item['getPreservation'] = preservation and preservation.UID( ) or '' else: item['getPreservation'] = preservation and preservation.Title( ) or '' ## sampler = part.getSampler().strip() ## item['getSampler'] = \ ## sampler and self.user_fullname(sampler) or '' ## datesampled = part.getDateSampled() ## item['getDateSampled'] = \ ## datesampled and self.ulocalized_time(datesampled) or '' preserver = part.getPreserver().strip() item['getPreserver'] = \ preserver and self.user_fullname(preserver) or '' datepreserved = part.getDatePreserved() item['getDatePreserved'] = \ datepreserved and self.ulocalized_time(datepreserved, long_format=False) or '' disposaldate = part.getDisposalDate() item['getDisposalDate'] = \ disposaldate and self.ulocalized_time(disposaldate, long_format=False) or '' # inline edits for Container and Preservation if self.allow_edit: item['allow_edit'] = [ 'getContainer', 'getPreservation', 'SecuritySealIntact' ] item['choices']['getPreservation'] = preservations item['choices']['getContainer'] = containers # inline edits for Sampler and Date Sampled ## checkPermission = self.context.portal_membership.checkPermission ## if checkPermission(SampleSample, part) \ ## and not samplingdate > DateTime(): ## item['required'] += ['getSampler', 'getDateSampled'] ## item['allow_edit'] += ['getSampler', 'getDateSampled'] ## samplers = getUsers(part, ['Sampler', 'LabManager', 'Manager']) ## getAuthenticatedMember = part.portal_membership.getAuthenticatedMember ## username = getAuthenticatedMember().getUserName() ## users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) ## for u in samplers] ## item['choices']['getSampler'] = users ## item['getSampler'] = sampler and sampler or \ ## (username in samplers.keys() and username) or '' ## item['getDateSampled'] = item['getDateSampled'] \ ## or DateTime().strftime(self.date_format_short) ## item['class']['getSampler'] = 'provisional' ## item['class']['getDateSampled'] = 'provisional' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, part): item['required'] += ['getPreserver', 'getDatePreserved'] if self.allow_edit: item['allow_edit'] += ['getPreserver', 'getDatePreserved'] preservers = getUsers(part, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = part.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({ 'ResultValue': u, 'ResultText': preservers.getValue(u) }) for u in preservers] item['choices']['getPreserver'] = users item['getPreserver'] = preserver and preserver or \ (username in preservers.keys() and username) or '' item['getDatePreserved'] = item['getDatePreserved'] \ or DateTime().strftime(self.date_format_short) item['class']['getPreserver'] = 'provisional' item['class']['getDatePreserved'] = 'provisional' items.append(item) items = sorted(items, key=itemgetter('id')) return items
def getSamplers(self): return getUsers(self, ['LabManager', 'Sampler'])
def folderitems(self, full_objects=False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) mtool = getToolByName(self.context, "portal_membership") member = mtool.getAuthenticatedMember() roles = member.getRoles() hideclientlink = ( "RegulatoryInspector" in roles and "Manager" not in roles and "LabManager" not in roles and "LabClerk" not in roles ) for x in range(len(items)): if "obj" not in items[x]: continue obj = items[x]["obj"] sample = obj.getSample() if getSecurityManager().checkPermission(EditResults, obj): url = obj.absolute_url() + "/manage_results" else: url = obj.absolute_url() items[x]["Client"] = obj.aq_parent.Title() if hideclientlink is False: items[x]["replace"]["Client"] = "<a href='%s'>%s</a>" % ( obj.aq_parent.absolute_url(), obj.aq_parent.Title(), ) items[x]["Creator"] = self.user_fullname(obj.Creator()) items[x]["getRequestID"] = obj.getRequestID() items[x]["replace"]["getRequestID"] = "<a href='%s'>%s</a>" % (url, items[x]["getRequestID"]) items[x]["getSample"] = sample items[x]["replace"]["getSample"] = "<a href='%s'>%s</a>" % (sample.absolute_url(), sample.Title()) items[x]["replace"]["getProfilesTitle"] = ", ".join([p.Title() for p in obj.getProfiles()]) if obj.getAnalysesNum(): items[x]["getAnalysesNum"] = str(obj.getAnalysesNum()[0]) + "/" + str(obj.getAnalysesNum()[1]) else: items[x]["getAnalysesNum"] = "" batch = obj.getBatch() if batch: items[x]["BatchID"] = batch.getBatchID() items[x]["replace"]["BatchID"] = "<a href='%s'>%s</a>" % (batch.absolute_url(), items[x]["BatchID"]) else: items[x]["BatchID"] = "" val = obj.Schema().getField("SubGroup").get(obj) items[x]["SubGroup"] = val.Title() if val else "" samplingdate = obj.getSample().getSamplingDate() items[x]["SamplingDate"] = self.ulocalized_time(samplingdate, long_format=1) items[x]["getDateReceived"] = self.ulocalized_time(obj.getDateReceived()) items[x]["getDatePublished"] = self.ulocalized_time(obj.getDatePublished()) deviation = sample.getSamplingDeviation() items[x]["SamplingDeviation"] = deviation and deviation.Title() or "" priority = obj.getPriority() items[x]["Priority"] = "" # priority.Title() items[x]["getStorageLocation"] = sample.getStorageLocation() and sample.getStorageLocation().Title() or "" items[x]["AdHoc"] = sample.getAdHoc() and True or "" after_icons = "" state = workflow.getInfoFor(obj, "worksheetanalysis_review_state") if state == "assigned": after_icons += "<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/>" % ( self.portal_url, t(_("All analyses assigned")), ) if workflow.getInfoFor(obj, "review_state") == "invalid": after_icons += "<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/>" % ( self.portal_url, t(_("Results have been withdrawn")), ) if obj.getLate(): after_icons += "<img src='%s/++resource++bika.lims.images/late.png' title='%s'>" % ( self.portal_url, t(_("Late Analyses")), ) if samplingdate > DateTime(): after_icons += "<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'>" % ( self.portal_url, t(_("Future dated sample")), ) if obj.getInvoiceExclude(): after_icons += "<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'>" % ( self.portal_url, t(_("Exclude from invoice")), ) if sample.getSampleType().getHazardous(): after_icons += "<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'>" % ( self.portal_url, t(_("Hazardous")), ) if after_icons: items[x]["after"]["getRequestID"] = after_icons items[x]["Created"] = self.ulocalized_time(obj.created()) contact = obj.getContact() if contact: items[x]["ClientContact"] = contact.Title() items[x]["replace"]["ClientContact"] = "<a href='%s'>%s</a>" % (contact.absolute_url(), contact.Title()) else: items[x]["ClientContact"] = "" SamplingWorkflowEnabled = sample.getSamplingWorkflowEnabled() if SamplingWorkflowEnabled and not samplingdate > DateTime(): datesampled = self.ulocalized_time(sample.getDateSampled()) if not datesampled: datesampled = self.ulocalized_time(DateTime(), long_format=1) items[x]["class"]["getDateSampled"] = "provisional" sampler = sample.getSampler().strip() if sampler: items[x]["replace"]["getSampler"] = self.user_fullname(sampler) if "Sampler" in member.getRoles() and not sampler: sampler = member.id items[x]["class"]["getSampler"] = "provisional" else: datesampled = "" sampler = "" items[x]["getDateSampled"] = datesampled items[x]["getSampler"] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = workflow.getInfoFor(obj, "review_state") if state == "to_be_sampled" and checkPermission(SampleSample, obj) and not samplingdate > DateTime(): items[x]["required"] = ["getSampler", "getDateSampled"] items[x]["allow_edit"] = ["getSampler", "getDateSampled"] samplers = getUsers(sample, ["Sampler", "LabManager", "Manager"]) username = member.getUserName() users = [({"ResultValue": u, "ResultText": samplers.getValue(u)}) for u in samplers] items[x]["choices"] = {"getSampler": users} Sampler = sampler and sampler or (username in samplers.keys() and username) or "" items[x]["getSampler"] = Sampler # These don't exist on ARs # XXX This should be a list of preservers... items[x]["getPreserver"] = "" items[x]["getDatePreserved"] = "" # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]["required"] = ["getPreserver", "getDatePreserved"] items[x]["allow_edit"] = ["getPreserver", "getDatePreserved"] preservers = getUsers(obj, ["Preserver", "LabManager", "Manager"]) username = member.getUserName() users = [({"ResultValue": u, "ResultText": preservers.getValue(u)}) for u in preservers] items[x]["choices"] = {"getPreserver": users} preserver = username in preservers.keys() and username or "" items[x]["getPreserver"] = preserver items[x]["getDatePreserved"] = self.ulocalized_time(DateTime(), long_format=1) items[x]["class"]["getPreserver"] = "provisional" items[x]["class"]["getDatePreserved"] = "provisional" # Submitting user may not verify results if items[x]["review_state"] == "to_be_verified" and not checkPermission(VerifyOwnResults, obj): self_submitted = False try: review_history = list(workflow.getInfoFor(obj, "review_history")) review_history.reverse() for event in review_history: if event.get("action") == "submit": if event.get("actor") == member.getId(): self_submitted = True break if self_submitted: items[x]["after"]["state_title"] = ( "<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/>" % t(_("Cannot verify: Submitted by current user")) ) except Exception: pass # Hide Preservation/Sampling workflow actions if the edit columns # are not displayed. toggle_cols = self.get_toggle_cols() new_states = [] for i, state in enumerate(self.review_states): if state["id"] == self.review_state: if "getSampler" not in toggle_cols or "getDateSampled" not in toggle_cols: if "hide_transitions" in state: state["hide_transitions"].append("sample") else: state["hide_transitions"] = ["sample"] if "getPreserver" not in toggle_cols or "getDatePreserved" not in toggle_cols: if "hide_transitions" in state: state["hide_transitions"].append("preserve") else: state["hide_transitions"] = ["preserve"] new_states.append(state) self.review_states = new_states return items
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.getAnalysts = getUsers(context, ['Manager', 'LabManager', 'Analyst'])
def __call__(self): form = self.request.form bc = getToolByName(self.context, 'bika_catalog') bsc = getToolByName(self.context, 'bika_setup_catalog') checkPermission = self.context.portal_membership.checkPermission getAuthenticatedMember = self.context.portal_membership.getAuthenticatedMember workflow = getToolByName(self.context, 'portal_workflow') ars = self.context.getAnalysisRequests() sample = self.context ## Create header_table data rows ar_links = ", ".join([ "<a href='%s'>%s</a>" % (ar.absolute_url(), ar.Title()) for ar in ars ]) sp = self.context.getSamplePoint() st = self.context.getSampleType() if workflow.getInfoFor(self.context, 'cancellation_state') == "cancelled": allow_sample_edit = False else: edit_states = ['to_be_sampled', 'to_be_preserved', 'sample_due'] allow_sample_edit = checkPermission(ManageSamples, self.context) \ and workflow.getInfoFor(self.context, 'review_state') in edit_states SamplingWorkflowEnabled =\ self.context.bika_setup.getSamplingWorkflowEnabled() samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) samplingdeviations = DisplayList( [(sd.UID, sd.title) for sd \ in bsc(portal_type = 'SamplingDeviation', inactive_state = 'active')]) self.header_columns = 3 self.header_rows = [ { 'id': 'ClientReference', 'title': _('Client Reference'), 'allow_edit': self.allow_edit, 'value': self.context.getClientReference(), 'condition': True, 'type': 'text' }, { 'id': 'ClientSampleID', 'title': _('Client SID'), 'allow_edit': self.allow_edit, 'value': self.context.getClientSampleID(), 'condition': True, 'type': 'text' }, { 'id': 'Requests', 'title': _('Requests'), 'allow_edit': False, 'value': ar_links, 'condition': True, 'type': 'text' }, { 'id': 'SampleType', 'title': _('Sample Type'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': st and st.Title() or '', 'condition': True, 'type': 'text', 'required': True }, { 'id': 'SampleMatrix', 'title': _('Sample Matrix'), 'allow_edit': False, 'value': st.getSampleMatrix() and st.getSampleMatrix().Title() or '', 'condition': True, 'type': 'text' }, { 'id': 'SamplePoint', 'title': _('Sample Point'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sp and sp.Title() or '', 'condition': True, 'type': 'text' }, { 'id': 'Creator', 'title': PMF('Creator'), 'allow_edit': False, 'value': self.user_fullname(self.context.Creator()), 'condition': True, 'type': 'text' }, { 'id': 'Composite', 'title': _('Composite'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': self.context.getComposite(), 'condition': True, 'type': 'boolean' }, { 'id': 'AdHoc', 'title': _('Ad-Hoc'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': self.context.getAdHoc(), 'condition': True, 'type': 'boolean' }, { 'id': 'DateCreated', 'title': PMF('Date Created'), 'allow_edit': False, 'value': self.context.created(), 'formatted_value': self.ulocalized_time(self.context.created()), 'condition': True, 'type': 'text' }, { 'id': 'SamplingDate', 'title': _('Sampling Date'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': self.ulocalized_time(self.context.getSamplingDate()), 'formatted_value': self.ulocalized_time(self.context.getSamplingDate()), 'condition': True, 'class': 'datepicker', 'type': 'text' }, { 'id': 'DateSampled', 'title': _('Date Sampled'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sample.getDateSampled() and self.ulocalized_time(sample.getDateSampled()) or '', 'formatted_value': sample.getDateSampled() and self.ulocalized_time(sample.getDateSampled()) or '', 'condition': SamplingWorkflowEnabled, 'class': 'datepicker', 'type': 'text', 'required': True }, { 'id': 'Sampler', 'title': _('Sampler'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sample.getSampler(), 'formatted_value': sample.getSampler(), 'condition': SamplingWorkflowEnabled, 'vocabulary': samplers, 'type': 'choices', 'required': True }, { 'id': 'SamplingDeviation', 'title': _('Sampling Deviation'), 'allow_edit': self.allow_edit and allow_sample_edit, 'value': sample.getSamplingDeviation() and sample.getSamplingDeviation().UID() or '', 'formatted_value': sample.getSamplingDeviation() and sample.getSamplingDeviation().Title() or '', 'condition': True, 'vocabulary': samplingdeviations, 'type': 'choices' }, { 'id': 'DateReceived', 'title': _('Date Received'), 'allow_edit': False, 'value': self.context.getDateReceived(), 'formatted_value': self.ulocalized_time(self.context.getDateReceived()), 'condition': True, 'type': 'text' }, { 'id': 'DateExpired', 'title': _('Date Expired'), 'allow_edit': False, 'value': self.context.getDateExpired(), 'formatted_value': self.ulocalized_time(self.context.getDateExpired()), 'condition': True, 'type': 'text' }, { 'id': 'DisposalDate', 'title': _('Disposal Date'), 'allow_edit': False, 'value': self.context.getDisposalDate(), 'formatted_value': self.ulocalized_time(self.context.getDisposalDate()), 'condition': True, 'type': 'text' }, { 'id': 'DateDisposed', 'title': _('Date Disposed'), 'allow_edit': False, 'value': self.context.getDateDisposed(), 'formatted_value': self.ulocalized_time(self.context.getDateDisposed()), 'condition': True, 'type': 'text' }, ] if self.allow_edit: self.header_buttons = [{'name': 'save_button', 'title': _('Save')}] else: self.header_buttons = [] ## handle_header table submit if form.get('header_submitted', None): plone.protect.CheckAuthenticator(form) message = None values = {} for row in [r for r in self.header_rows if r['allow_edit']]: value = urllib.unquote_plus(form.get(row['id'], '')) if row['id'] == 'SampleType': if not value: message = PMF( u'error_required', default=u'${name} is required, please correct.', mapping={'name': _('Sample Type')}) break if not bsc(portal_type='SampleType', title=value): message = _("${sampletype} is not a valid sample type", mapping={'sampletype': value}) break if row['id'] == 'SamplePoint': if value and \ not bsc(portal_type = 'SamplePoint', title = value): message = _( "${samplepoint} is not a valid sample point", mapping={'sampletype': value}) break values[row['id']] = value # boolean - checkboxes are 'true'/'on' or 'false'/missing in form. for row in [ r for r in self.header_rows if r.get('type', '') == 'boolean' ]: value = form.get(row['id'], 'false') values[row[ 'id']] = value == 'true' and True or value == 'on' and True or False if not message: self.context.edit(**values) self.context.reindexObject() ars = self.context.getAnalysisRequests() # Analyses and AnalysisRequets have calculated fields # that are indexed; re-index all these objects. for ar in ars: ar.reindexObject() analyses = self.context.getAnalyses( {'review_state': 'to_be_sampled'}) for a in analyses: a.getObject().reindexObject() message = PMF("Changes saved.") # If this sample was "To Be Sampled", and the # Sampler and DateSampled fields were completed, # do the Sampled transition. if workflow.getInfoFor(sample, "review_state") == "to_be_sampled" \ and form.get("Sampler", None) \ and form.get("DateSampled", None): # This transition does not invoke the regular WorkflowAction # in analysisrequest.py workflow.doActionFor(sample, "sample") sample.reindexObject() self.context.plone_utils.addPortalMessage(message, 'info') url = self.context.absolute_url().split("?")[0] self.request.RESPONSE.redirect(url) return ## Create Sample Partitions table parts_table = None if not self.allow_edit: p = SamplePartitionsView(self.context, self.request) p.allow_edit = self.allow_edit p.show_select_column = self.allow_edit p.show_workflow_action_buttons = self.allow_edit p.show_column_toggles = False p.show_select_all_checkbox = False p.review_states[0]['transitions'] = [ { 'id': 'empty' }, ] # none parts_table = p.contents_table() self.parts = parts_table ## Create Field and Lab Analyses tables self.tables = {} if not self.allow_edit: for poc in POINTS_OF_CAPTURE: if not self.context.getAnalyses({'getPointOfCapture': poc}): continue t = SampleAnalysesView(self.context, self.request, getPointOfCapture=poc, sort_on='getServiceTitle') t.form_id = "sample_%s_analyses" % poc if poc == 'field': t.review_states[0]['columns'].remove('DueDate') t.show_column_toggles = False t.review_states[0]['transitions'] = [{ 'id': 'submit' }, { 'id': 'retract' }, { 'id': 'verify' }] self.tables[POINTS_OF_CAPTURE.getValue( poc)] = t.contents_table() return self.template()
def folderitem(self, obj, item, index): # Additional info from AnalysisRequest to be added in the item generated # by default by bikalisting. # Call the folderitem method from the base class item = BikaListingView.folderitem(self, obj, item, index) if not item: return None member = self.mtool.getAuthenticatedMember() roles = member.getRoles() hideclientlink = 'RegulatoryInspector' in roles \ and 'Manager' not in roles \ and 'LabManager' not in roles \ and 'LabClerk' not in roles sample = obj.getSample() url = obj.absolute_url() if getSecurityManager().checkPermission(EditResults, obj): url += "/manage_results" item['Client'] = obj.aq_parent.Title() if (hideclientlink == False): item['replace']['Client'] = "<a href='%s'>%s</a>" % \ (obj.aq_parent.absolute_url(), obj.aq_parent.Title()) item['Creator'] = self.user_fullname(obj.Creator()) item['getRequestID'] = obj.getRequestID() item['replace']['getRequestID'] = "<a href='%s'>%s</a>" % \ (url, item['getRequestID']) item['getSample'] = sample item['replace']['getSample'] = \ "<a href='%s'>%s</a>" % (sample.absolute_url(), sample.Title()) item['replace']['getProfilesTitle'] = ", ".join( [p.Title() for p in obj.getProfiles()]) analysesnum = obj.getAnalysesNum() if analysesnum: item['getAnalysesNum'] = str(analysesnum[0]) + '/' + str( analysesnum[1]) else: item['getAnalysesNum'] = '' batch = obj.getBatch() if batch: item['BatchID'] = batch.getBatchID() item['replace']['BatchID'] = "<a href='%s'>%s</a>" % \ (batch.absolute_url(), item['BatchID']) else: item['BatchID'] = '' val = obj.Schema().getField('SubGroup').get(obj) item['SubGroup'] = val.Title() if val else '' sd = obj.getSample().getSamplingDate() item['SamplingDate'] = \ self.ulocalized_time(sd, long_format=1) if sd else '' item['getDateReceived'] = \ self.ulocalized_time(obj.getDateReceived()) item['getDatePublished'] = \ self.ulocalized_time(getTransitionDate(obj, 'publish')) item['getDateVerified'] = \ self.ulocalized_time(getTransitionDate(obj, 'verify')) deviation = sample.getSamplingDeviation() item['SamplingDeviation'] = deviation and deviation.Title() or '' priority = obj.getPriority() item['Priority'] = '' # priority.Title() item['getStorageLocation'] = sample.getStorageLocation( ) and sample.getStorageLocation().Title() or '' item['AdHoc'] = sample.getAdHoc() and True or '' after_icons = "" state = self.workflow.getInfoFor(obj, 'worksheetanalysis_review_state') if state == 'assigned': after_icons += "<img src='%s/++resource++bika.lims.images/worksheet.png' title='%s'/>" % \ (self.portal_url, t(_("All analyses assigned"))) if self.workflow.getInfoFor(obj, 'review_state') == 'invalid': after_icons += "<img src='%s/++resource++bika.lims.images/delete.png' title='%s'/>" % \ (self.portal_url, t(_("Results have been withdrawn"))) if obj.getLate(): after_icons += "<img src='%s/++resource++bika.lims.images/late.png' title='%s'>" % \ (self.portal_url, t(_("Late Analyses"))) if sd and sd > DateTime(): after_icons += "<img src='%s/++resource++bika.lims.images/calendar.png' title='%s'>" % \ (self.portal_url, t(_("Future dated sample"))) if obj.getInvoiceExclude(): after_icons += "<img src='%s/++resource++bika.lims.images/invoice_exclude.png' title='%s'>" % \ (self.portal_url, t(_("Exclude from invoice"))) if sample.getSampleType().getHazardous(): after_icons += "<img src='%s/++resource++bika.lims.images/hazardous.png' title='%s'>" % \ (self.portal_url, t(_("Hazardous"))) if after_icons: item['after']['getRequestID'] = after_icons item['Created'] = self.ulocalized_time(obj.created()) contact = obj.getContact() if contact: item['ClientContact'] = contact.Title() item['replace']['ClientContact'] = "<a href='%s'>%s</a>" % \ (contact.absolute_url(), contact.Title()) else: item['ClientContact'] = "" SamplingWorkflowEnabled = sample.getSamplingWorkflowEnabled() if SamplingWorkflowEnabled and (not sd or not sd > DateTime()): datesampled = self.ulocalized_time(sample.getDateSampled(), long_format=True) if not datesampled: datesampled = self.ulocalized_time(DateTime(), long_format=True) item['class']['getDateSampled'] = 'provisional' sampler = sample.getSampler().strip() if sampler: item['replace']['getSampler'] = self.user_fullname(sampler) if 'Sampler' in member.getRoles() and not sampler: sampler = member.id item['class']['getSampler'] = 'provisional' else: datesampled = '' sampler = '' item['getDateSampled'] = datesampled item['getSampler'] = sampler # sampling workflow - inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission state = self.workflow.getInfoFor(obj, 'review_state') if state == 'to_be_sampled' \ and checkPermission(SampleSample, obj) \ and (not sd or not sd > DateTime()): item['required'] = ['getSampler', 'getDateSampled'] item['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(sample, ['Sampler', 'LabManager', 'Manager']) username = member.getUserName() users = [({ 'ResultValue': u, 'ResultText': samplers.getValue(u) }) for u in samplers] item['choices'] = {'getSampler': users} Sampler = sampler and sampler or \ (username in samplers.keys() and username) or '' item['getSampler'] = Sampler # These don't exist on ARs # XXX This should be a list of preservers... item['getPreserver'] = '' item['getDatePreserved'] = '' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): item['required'] = ['getPreserver', 'getDatePreserved'] item['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) username = member.getUserName() users = [({ 'ResultValue': u, 'ResultText': preservers.getValue(u) }) for u in preservers] item['choices'] = {'getPreserver': users} preserver = username in preservers.keys() and username or '' item['getPreserver'] = preserver item['getDatePreserved'] = self.ulocalized_time(DateTime(), long_format=1) item['class']['getPreserver'] = 'provisional' item['class']['getDatePreserved'] = 'provisional' # Submitting user may not verify results if item['review_state'] == 'to_be_verified': username = member.getUserName() allowed = api.user.has_permission(VerifyPermission, username=username) if allowed and not obj.isUserAllowedToVerify(member): item['after']['state_title'] = \ "<img src='++resource++bika.lims.images/submitted-by-current-user.png' title='%s'/>" % \ t(_("Cannot verify: Submitted by current user")) return item
def folderitems(self, full_objects = False): workflow = getToolByName(self.context, "portal_workflow") items = BikaListingView.folderitems(self) props = getToolByName(self.context, 'portal_properties').bika_properties datepicker_format = props.getProperty('datepicker_format') for x in range(len(items)): if not items[x].has_key('obj'): continue obj = items[x]['obj'] container = obj.getContainer() items[x]['getContainer'] = container and container.Title() or '' preservation = obj.getPreservation() items[x]['getPreservation'] = \ preservation and preservation.Title() or '' sampler = obj.getSampler().strip() items[x]['getSampler'] = \ sampler and pretty_user_name_or_id(self.context, sampler) or '' datesampled = obj.getDateSampled() items[x]['getDateSampled'] = \ datesampled and TimeOrDate(self.context, datesampled) or '' preserver = obj.getPreserver().strip() items[x]['getPreserver'] = \ preserver and pretty_user_name_or_id(self.context, preserver) or '' datepreserved = obj.getDatePreserved() items[x]['getDatePreserved'] = \ datepreserved and TimeOrDate(self.context, datepreserved) or '' disposaldate = obj.getDisposalDate() items[x]['getDisposalDate'] = \ disposaldate and TimeOrDate(self.context, disposaldate) or '' samplingdate = obj.getSamplingDate() # inline edits for Sampler and Date Sampled checkPermission = self.context.portal_membership.checkPermission if checkPermission(SampleSample, obj) \ and not samplingdate > DateTime(): items[x]['required'] = ['getSampler', 'getDateSampled'] items[x]['allow_edit'] = ['getSampler', 'getDateSampled'] samplers = getUsers(obj, ['Sampler', 'LabManager', 'Manager']) getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': samplers.getValue(u)}) for u in samplers] items[x]['choices'] = {'getSampler': users} items[x]['getSampler'] = sampler and sampler or \ (username in samplers.keys() and username) or '' items[x]['getDateSampled'] = items[x]['getDateSampled'] \ or DateTime().strftime(datepicker_format) items[x]['class']['getSampler'] = 'provisional' items[x]['class']['getDateSampled'] = 'provisional' # inline edits for Preserver and Date Preserved checkPermission = self.context.portal_membership.checkPermission if checkPermission(PreserveSample, obj): items[x]['required'] = ['getPreserver', 'getDatePreserved'] items[x]['allow_edit'] = ['getPreserver', 'getDatePreserved'] preservers = getUsers(obj, ['Preserver', 'LabManager', 'Manager']) getAuthenticatedMember = obj.portal_membership.getAuthenticatedMember username = getAuthenticatedMember().getUserName() users = [({'ResultValue': u, 'ResultText': preservers.getValue(u)}) for u in preservers] items[x]['choices'] = {'getPreserver': users} items[x]['getPreserver'] = preserver and preserver or \ (username in preservers.keys() and username) or '' items[x]['getDatePreserved'] = items[x]['getDatePreserved'] \ or DateTime().strftime(datepicker_format) items[x]['class']['getPreserver'] = 'provisional' items[x]['class']['getDatePreserved'] = 'provisional' return items
def select_user(self): self.users = getUsers(self.context, ['Manager', 'LabManager', 'LabClerk', 'Analyst', 'Sampler', 'Preserver', 'Verifier']) return self.select_user_pt()