def folderitem(self, obj, item, index): """Service triggered each time an item is iterated in folderitems. The use of this service prevents the extra-loops in child objects. :obj: the instance of the class to be foldered :item: dict containing the properties of the object to be used by the template :index: current index of the item """ DueDate = obj.getDueDate item["getDateReceived"] = self.ulocalized_time(obj.getDateReceived) item["getDueDate"] = self.ulocalized_time(DueDate) if DueDate and DueDate < DateTime(): item["after"]["DueDate"] = get_image("late.png", title=t(_("Late Analysis"))) # Add Priority column 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 = t(PRIORITIES.getValue(priority)) html = "<div title='{}' class='priority-ico priority-{}'><div>" item["replace"]["Priority"] = html.format(priority_text, priority) return item
def folderitem(self, obj, item, index): """ :obj: is a brain """ # Call the folderitem method from the base class item = BikaListingView.folderitem(self, obj, item, index) item['getDateReceived'] = self.ulocalized_time(obj.getDateReceived) DueDate = obj.getDueDate item['getDueDate'] = self.ulocalized_time(DueDate) if DueDate < DateTime(): item['after']['DueDate'] = '<img width="16" height="16"' ' src="%s/++resource++bika.lims.images/late.png" title="%s"/>' % \ (self.context.absolute_url(), t(_("Late Analysis"))) if self.hideclientlink: del item['replace']['Client'] # Add Priority column 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) 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 = 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 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