|
23 | 23 |
|
24 | 24 | from bika.lims import _
|
25 | 25 | from bika.lims import api
|
26 |
| -from senaite.core.catalog import SAMPLE_CATALOG |
| 26 | +from bika.lims.api.security import check_permission |
27 | 27 | from bika.lims.config import PRIORITIES
|
28 | 28 | from bika.lims.permissions import AddAnalysisRequest
|
29 | 29 | from bika.lims.permissions import TransitionSampleSample
|
|
33 | 33 | from bika.lims.utils import t
|
34 | 34 | from DateTime import DateTime
|
35 | 35 | from senaite.app.listing import ListingView
|
| 36 | +from senaite.core.catalog import SAMPLE_CATALOG |
36 | 37 | from senaite.core.interfaces import ISamplesView
|
37 | 38 | from zope.interface import implementer
|
38 | 39 |
|
@@ -66,6 +67,8 @@ def __init__(self, context, request):
|
66 | 67 | # Toggle some columns if the sampling workflow is enabled
|
67 | 68 | sampling_enabled = api.get_setup().getSamplingWorkflowEnabled()
|
68 | 69 |
|
| 70 | + now = DateTime().strftime("%Y-%m-%d %H:%M") |
| 71 | + |
69 | 72 | self.columns = collections.OrderedDict((
|
70 | 73 | ("Priority", {
|
71 | 74 | "title": "",
|
@@ -102,12 +105,13 @@ def __init__(self, context, request):
|
102 | 105 | "title": _("Date Sampled"),
|
103 | 106 | "toggle": True,
|
104 | 107 | "type": "datetime",
|
105 |
| - "input_width": "10"}), |
| 108 | + "max": now, |
| 109 | + "sortable": True}), |
106 | 110 | ("getDatePreserved", {
|
107 | 111 | "title": _("Date Preserved"),
|
108 | 112 | "toggle": False,
|
109 | 113 | "type": "datetime",
|
110 |
| - "input_width": "10", |
| 114 | + "max": now, |
111 | 115 | "sortable": False}), # no datesort without index
|
112 | 116 | ("getDateReceived", {
|
113 | 117 | "title": _("Date Received"),
|
@@ -506,6 +510,7 @@ def folderitem(self, obj, item, index):
|
506 | 510 | # item['SubGroup'] = val.Title() if val else ''
|
507 | 511 |
|
508 | 512 | item["SamplingDate"] = self.str_date(obj.getSamplingDate)
|
| 513 | + item["getDateSampled"] = self.str_date(obj.getDateSampled) |
509 | 514 | item["getDateReceived"] = self.str_date(obj.getDateReceived)
|
510 | 515 | item["getDueDate"] = self.str_date(obj.getDueDate)
|
511 | 516 | item["getDatePublished"] = self.str_date(obj.getDatePublished)
|
@@ -571,58 +576,34 @@ def folderitem(self, obj, item, index):
|
571 | 576 | # full object to check the user permissions, so far this is
|
572 | 577 | # a performance hit.
|
573 | 578 | if obj.getSamplingWorkflowEnabled:
|
574 |
| - # We don't do anything with Sampling Date. |
575 |
| - # User can modify Sampling date |
576 |
| - # inside AR view. In this listing view, |
577 |
| - # we only let the user to edit Date Sampled |
578 |
| - # and Sampler if he wants to make 'sample' transaction. |
579 |
| - if not obj.getDateSampled: |
580 |
| - datesampled = self.ulocalized_time( |
581 |
| - DateTime(), long_format=True) |
582 |
| - item["class"]["getDateSampled"] = "provisional" |
583 |
| - else: |
584 |
| - datesampled = self.ulocalized_time(obj.getDateSampled, |
585 |
| - long_format=True) |
586 | 579 |
|
587 | 580 | sampler = obj.getSampler
|
588 | 581 | if sampler:
|
| 582 | + item["getSampler"] = obj.getSampler |
589 | 583 | item["replace"]["getSampler"] = obj.getSamplerFullName
|
590 |
| - if "Sampler" in self.roles and not sampler: |
591 |
| - sampler = self.member.id |
592 |
| - item["class"]["getSampler"] = "provisional" |
| 584 | + |
593 | 585 | # sampling workflow - inline edits for Sampler and Date Sampled
|
594 |
| - if item["review_state"] == 'to_be_sampled': |
| 586 | + if item["review_state"] == "to_be_sampled": |
595 | 587 | # We need to get the full object in order to check
|
596 | 588 | # the permissions
|
597 |
| - full_object = obj.getObject() |
598 |
| - checkPermission = \ |
599 |
| - self.context.portal_membership.checkPermission |
600 |
| - |
601 |
| - # TODO Do we really need this check? |
602 |
| - if checkPermission(TransitionSampleSample, full_object): |
| 589 | + full_object = api.get_object(obj) |
| 590 | + if check_permission(TransitionSampleSample, full_object): |
| 591 | + # make fields required and editable |
603 | 592 | item["required"] = ["getSampler", "getDateSampled"]
|
604 | 593 | item["allow_edit"] = ["getSampler", "getDateSampled"]
|
605 |
| - # TODO-performance: hit performance while getting the |
606 |
| - # sample object... |
607 |
| - # TODO Can LabManagers be a Sampler?! |
608 |
| - samplers = getUsers(full_object, ["Sampler", ]) |
609 |
| - username = self.member.getUserName() |
| 594 | + date = obj.getDateSampled or DateTime() |
| 595 | + # provide date and time in a valid input format |
| 596 | + item["getDateSampled"] = self.to_datetime_input_value(date) |
| 597 | + sampler_roles = ["Sampler", "LabManager", ""] |
| 598 | + samplers = getUsers(full_object, sampler_roles) |
610 | 599 | users = [({
|
611 | 600 | "ResultValue": u,
|
612 | 601 | "ResultText": samplers.getValue(u)}) for u in samplers]
|
613 |
| - item['choices'] = {'getSampler': users} |
614 |
| - Sampler = sampler and sampler or (username in samplers.keys() and username) or '' |
615 |
| - sampler = Sampler |
616 |
| - else: |
617 |
| - datesampled = self.ulocalized_time(obj.getDateSampled, |
618 |
| - long_format=True) |
619 |
| - sampler = obj.getSamplerFullName if obj.getSampler else '' |
620 |
| - else: |
621 |
| - datesampled = self.ulocalized_time(obj.getDateSampled, |
622 |
| - long_format=True) |
623 |
| - sampler = "" |
624 |
| - item["getDateSampled"] = datesampled |
625 |
| - item["getSampler"] = sampler |
| 602 | + item["choices"] = {"getSampler": users} |
| 603 | + # preselect the current user as sampler |
| 604 | + if not sampler and "Sampler" in self.roles: |
| 605 | + sampler = self.member.getUserName() |
| 606 | + item["getSampler"] = sampler |
626 | 607 |
|
627 | 608 | # These don't exist on ARs
|
628 | 609 | # XXX This should be a list of preservers...
|
@@ -715,6 +696,13 @@ def str_date(self, date, long_format=1, default=""):
|
715 | 696 | return default
|
716 | 697 | return self.ulocalized_time(date, long_format=long_format)
|
717 | 698 |
|
| 699 | + def to_datetime_input_value(self, date): |
| 700 | + """Converts to a compatible datetime format |
| 701 | + """ |
| 702 | + if not isinstance(date, DateTime): |
| 703 | + return "" |
| 704 | + return date.strftime("%Y-%m-%d %H:%M") |
| 705 | + |
718 | 706 | def getDefaultAddCount(self):
|
719 | 707 | return self.context.bika_setup.getDefaultNumberOfARsToAdd()
|
720 | 708 |
|
|
0 commit comments