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 """ layout = obj.getLayout title = api.get_title(obj) url = api.get_url(obj) item["CreationDate"] = self.ulocalized_time(obj.created) if len(obj.getAnalysesUIDs) == 0: item["table_row_class"] = "state-empty-worksheet" title_link = "{}/{}".format(url, "add_analyses") if len(layout) > 0: title_link = "{}/{}".format(url, "manage_results") item["Title"] = title item["replace"]["Title"] = get_link(title_link, value=title) pos_parent = {} for slot in layout: # compensate for bad data caused by a stupid bug. if type(slot["position"]) in (list, tuple): slot["position"] = slot["position"][0] if slot["position"] == "new": continue if slot["position"] in pos_parent: continue pos_parent[slot["position"]] =\ self.rc.lookupObject(slot.get("container_uid")) # Total QC Analyses item["NumQCAnalyses"] = str(obj.getNumberOfQCAnalyses) # Total Routine Analyses item["NumRegularAnalyses"] = str(obj.getNumberOfRegularAnalyses) # Total Number of Samples item["NumRegularSamples"] = str(obj.getNumberOfRegularSamples) # Progress progress_perc = obj.getProgressPercentage item["replace"]["Progress"] = get_progress_bar_html(progress_perc) review_state = item["review_state"] if self.can_reassign and review_state == "open": item["Analyst"] = obj.getAnalyst item["allow_edit"] = ["Analyst"] item["required"] = ["Analyst"] item["choices"] = {"Analyst": self.analyst_choices} else: fullname = user_fullname(self.context, obj.getAnalyst) item["Analyst"] = fullname return item
def folderitem(self, obj, item, index): """Applies new properties to item (StorageContainer) that is currently being rendered as a row in the list """ item = super(ContainersView, self).folderitem(obj, item, index) # Get the object (the passed-in "obj" is a brain) obj = api.get_object(obj) # Containers/Positions usage # Samples containers cannot have containers inside! if not IStorageSamplesContainer.providedBy(obj): capacity = obj.get_capacity() taken = len(obj.get_non_available_positions()) percentage = capacity and taken*100/capacity or 0 item["replace"]["ContainersUsage"] = get_progress_bar_html(percentage) item["replace"]["Containers"] = "{:01d} / {:01d} ({:01d}%)"\ .format(taken, capacity, percentage) # append the UID of the primary AR as parent parent = api.get_uid(api.get_parent(obj)) item["parent"] = parent != api.get_uid(self.context) and parent or "" # append partition UIDs of this AR as children containers = obj.get_layout_containers() item["children"] = map(lambda cont: api.get_uid(cont), containers) return item
def get_usage_bar_html(self, percentage): """Returns an html that represents an usage bar """ css_class = "bg-success" if percentage > 90: css_class = "bg-danger" elif percentage > 75: css_class = "bg-warning" p_bar = get_progress_bar_html(percentage) return p_bar.replace('class="progress-bar', 'class="progress-bar {}'.format(css_class))
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 """ title = api.get_title(obj) url = api.get_url(obj) item["CreationDate"] = self.ulocalized_time(obj.created) title_link = "{}/{}".format(url, "add_analyses") if len(obj.getAnalysesUIDs) > 0: title_link = "{}/{}".format(url, "manage_results") item["Title"] = title item["replace"]["Title"] = get_link(title_link, value=title) # Total QC Analyses item["getNumberOfQCAnalyses"] = str(obj.getNumberOfQCAnalyses) # Total Routine Analyses item["getNumberOfRegularAnalyses"] = str( obj.getNumberOfRegularAnalyses) # Total Number of Samples item["getNumberOfRegularSamples"] = str(obj.getNumberOfRegularSamples) # Progress progress = obj.getProgressPercentage progress_bar_html = get_progress_bar_html(progress) item["replace"]["getProgressPercentage"] = progress_bar_html review_state = item["review_state"] if self.can_reassign and review_state == "open": item["Analyst"] = obj.getAnalyst item["allow_edit"] = ["Analyst"] item["required"] = ["Analyst"] item["choices"] = {"Analyst": self.analyst_choices} else: fullname = user_fullname(self.context, obj.getAnalyst) item["Analyst"] = fullname return item
def folderitem(self, obj, item, index): """Applies new properties to the item (Batch) that is currently being rendered as a row in the list :param obj: client to be rendered as a row in the list :param item: dict representation of the batch, suitable for the list :param index: current position of the item within the list :type obj: ATContentType/DexterityContentType :type item: dict :type index: int :return: the dict representation of the item :rtype: dict """ obj = api.get_object(obj) url = "{}/analysisrequests".format(api.get_url(obj)) bid = api.get_id(obj) cbid = obj.getClientBatchID() title = api.get_title(obj) client = obj.getClient() created = api.get_creation_date(obj) date = obj.getBatchDate() # total sample progress progress = obj.getProgress() item["Progress"] = progress item["replace"]["Progress"] = get_progress_bar_html(progress) item["BatchID"] = bid item["ClientBatchID"] = cbid item["replace"]["BatchID"] = get_link(url, bid) item["Title"] = title item["replace"]["Title"] = get_link(url, title) item["created"] = self.ulocalized_time(created, long_format=True) item["BatchDate"] = self.ulocalized_time(date, long_format=True) if client: client_url = api.get_url(client) client_name = client.getName() client_id = client.getClientID() item["Client"] = client_name item["ClientID"] = client_id item["replace"]["Client"] = get_link(client_url, client_name) item["replace"]["ClientID"] = get_link(client_url, client_id) 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