def isUserAllowedToVerify(self, member): """ Checks if the specified user has enough privileges to verify the current analysis. Apart of roles, the function also checks if the option IsSelfVerificationEnabled is set to true at Service or Bika Setup levels and validates if according to this value, together with the user roles, the analysis can be verified. Note that this function only returns if the user can verify the analysis, but not if the analysis is ready to be verified (see isVerifiable) :member: user to be tested :return: true or false """ # Check if the user has "Bika: Verify" privileges username = member.getUserName() allowed = has_permission(VerifyPermission, username=username) if not allowed: return False # Check if the user who submited the result is the same as the current self_submitted = self.getSubmittedBy() == member.getUser().getId() # The submitter and the user must be different unless the analysis has # the option SelfVerificationEnabled set to true selfverification = self.isSelfVerificationEnabled() if self_submitted and not selfverification: return False # Checking verifiability depending on multi-verification type of # bika_setup if self.bika_setup.getNumberOfRequiredVerifications() > 1: mv_type = self.bika_setup.getTypeOfmultiVerification() # If user verified before and self_multi_disabled, then return False if mv_type == 'self_multi_disabled' and self.wasVerifiedByUser( username): return False # If user is the last verificator and consecutively # multi-verification # is disabled, then return False # Comparing was added just to check if this method is called # before/after # verification elif mv_type == 'self_multi_not_cons' and username == \ self.getLastVerificator() and \ self.getNumberOfVerifications() < \ self.getNumberOfRequiredVerifications(): return False # All checks pass return True
def isUserAllowedToVerify(self, member): """ Checks if the specified user has enough privileges to verify the current analysis. Apart of roles, the function also checks if the option IsSelfVerificationEnabled is set to true at Service or Bika Setup levels and validates if according to this value, together with the user roles, the analysis can be verified. Note that this function only returns if the user can verify the analysis, but not if the analysis is ready to be verified (see isVerifiable) :member: user to be tested :return: true or false """ # Check if the user has "Bika: Verify" privileges username = member.getUserName() allowed = has_permission(VerifyPermission, username=username) if not allowed: return False # Check if the user who submited the result is the same as the current self_submitted = self.getSubmittedBy() == member.getUser().getId() # The submitter and the user must be different unless the analysis has # the option SelfVerificationEnabled set to true selfverification = self.isSelfVerificationEnabled() if self_submitted and not selfverification: return False # Checking verifiability depending on multi-verification type of # bika_setup if self.bika_setup.getNumberOfRequiredVerifications() > 1: mv_type = self.bika_setup.getTypeOfmultiVerification() # If user verified before and self_multi_disabled, then return False if mv_type == 'self_multi_disabled' and self.wasVerifiedByUser( username): return False # If user is the last verificator and consecutively # multi-verification # is disabled, then return False # Comparing was added just to check if this method is called # before/after # verification elif mv_type == 'self_multi_not_cons' and username == \ self.getLastVerificator() and \ self.getNumberOfVerifications() < \ self.getNumberOfRequiredVerifications(): return False # All checks pass return True
def can_edit(self, obj): return has_permission('Modify portal content', obj=obj)
def can_edit(self, obj): if 'eu_country_profiles' in [obj.aq_parent.id, obj.id]: return False return has_permission('Modify portal content', obj=obj)
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