Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sample edit form - some selection widgets empty #1477

Merged
merged 24 commits into from
Nov 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
97524e7
Cleanup getClientUID fields (added IClientBindable and ClientBindable)
xispa Nov 22, 2019
a33ee84
Cleanup getClientUID search criteria for Add form
xispa Nov 22, 2019
49a07b6
No fixme anymore
xispa Nov 22, 2019
7fe9b8e
Sanitize AnalysisRequest content type regarding Client fields
xispa Nov 22, 2019
44532fc
BatchReferenceWidgetVocabulary -> ClientBindableReferenceWidgetVocabu…
xispa Nov 22, 2019
c798735
Upgrade step for client fields reindexing
xispa Nov 22, 2019
2631317
Remove stale js that applies field filters in Sample view
xispa Nov 22, 2019
77ec02a
ajaxGetClientInfo is no longer needed
xispa Nov 22, 2019
b390684
Remove unnecessary stuff (client.ajax.ReferenceWidgetVocabulary)
xispa Nov 22, 2019
17d5a60
Make ARReport ClientBindable
xispa Nov 22, 2019
ae47c20
Omit search filter for non-bindable portal_types
xispa Nov 22, 2019
779254b
Sample edit form - some selection widgets empty (CHANGES)
xispa Nov 22, 2019
28674ee
Typo
xispa Nov 22, 2019
4283628
Fix test
xispa Nov 22, 2019
f78ac4c
Removal of unnecessary functions (provided by ClientBindable)
xispa Nov 22, 2019
1f8369d
Cleanup of code that is no longer necessary
xispa Nov 22, 2019
0472ab0
ClientBindable -> ClientAwareMixin
xispa Nov 25, 2019
71e4039
Better way of returning a Client from acquisition chain
xispa Nov 25, 2019
a423dd4
Replace clientbindable namespace
xispa Nov 25, 2019
a03c694
Use six for isinstance
xispa Nov 25, 2019
29f5d9d
Merge branch 'master' into i1476
xispa Nov 25, 2019
dd1d74f
Merge branch 'master' into i1476
ramonski Nov 27, 2019
f42c257
Minor formatting changes
ramonski Nov 27, 2019
2b067c7
Refactored to use set.intersection instead of map
ramonski Nov 27, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Changelog

**Fixed**

- #1477 Sample edit form - some selection widgets empty
- #1478 Clients default CC E-Mails missing in Add Sample
- #1479 Fixed too many redirects error: Labclerks viewing verified worksheets
- #1480 Worksheet removal results in 404
Expand Down
20 changes: 15 additions & 5 deletions bika/lims/adapters/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,24 @@
provides="bika.lims.interfaces.IReferenceWidgetVocabulary"
/>

<!-- Display the Batches that belong to same client or not assigned to any
client in Analysis Request view -->
<!-- ClientAwareReferenceWidgetVocabulary
Injects getClientUID or getParentUID as additional search criteria for
client-bound reference fields -->
<adapter
for="bika.lims.interfaces.IBatch
zope.publisher.interfaces.browser.IBrowserRequest"
factory=".referencewidgetvocabulary.ClientAwareReferenceWidgetVocabulary"
provides="bika.lims.interfaces.IReferenceWidgetVocabulary" />
<adapter
for="bika.lims.interfaces.IClient
zope.publisher.interfaces.browser.IBrowserRequest"
factory=".referencewidgetvocabulary.ClientAwareReferenceWidgetVocabulary"
provides="bika.lims.interfaces.IReferenceWidgetVocabulary" />
<adapter
for="bika.lims.interfaces.IAnalysisRequest
zope.publisher.interfaces.browser.IBrowserRequest"
factory="bika.lims.adapters.referencewidgetvocabulary.BatchReferenceWidgetVocabulary"
provides="bika.lims.interfaces.IReferenceWidgetVocabulary"
/>
factory=".referencewidgetvocabulary.ClientAwareReferenceWidgetVocabulary"
provides="bika.lims.interfaces.IReferenceWidgetVocabulary" />


<!--
Expand Down
61 changes: 52 additions & 9 deletions bika/lims/adapters/referencewidgetvocabulary.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@
# Some rights reserved, see README and LICENSE.

import json
import six

from zope.interface import implements

from bika.lims import api
from bika.lims import logger
from bika.lims.interfaces import IReferenceWidgetVocabulary, IAnalysisRequest
from bika.lims.interfaces import IReferenceWidgetVocabulary
from bika.lims.utils import get_client
from bika.lims.utils import to_unicode as _u
from bika.lims.utils import to_utf8 as _c
from zope.interface import implements


class DefaultReferenceWidgetVocabulary(object):
Expand Down Expand Up @@ -259,16 +262,56 @@ def __call__(self):
return brains


class BatchReferenceWidgetVocabulary(DefaultReferenceWidgetVocabulary):
class ClientAwareReferenceWidgetVocabulary(DefaultReferenceWidgetVocabulary):
"""Injects search criteria (filters) in the query when the current context
is, belongs or is associated to a Client
"""

# portal_types that might be bound to a client
client_bound_types = [
"Contact",
"Batch",
"AnalysisProfile",
"AnalysisSpec",
"ARTemplate",
"SamplePoint"
]

def get_raw_query(self):
"""Returns the raw query to use for current search, based on the
base query + update query
"""
query = super(BatchReferenceWidgetVocabulary, self).get_raw_query()
if IAnalysisRequest.providedBy(self.context):
# Display the Batches from the Client the Sample belongs to and
# those that do not belong to any Client
client = self.context.getClient()
query["getClientUID"] = [api.get_uid(client), ""]
query = super(
ClientAwareReferenceWidgetVocabulary, self).get_raw_query()

if self.is_client_aware(query):

client = get_client(self.context)
client_uid = client and api.get_uid(client) or None

if client_uid:
# Apply the search criteria for this client
# Contact is the only object bound to a Client that is stored
# in portal_catalog. And in this catalog, getClientUID does not
# exist, rather getParentUID
if "Contact" in self.get_portal_types(query):
query["getParentUID"] = [client_uid]
else:
query["getClientUID"] = [client_uid, ""]

return query

def is_client_aware(self, query):
"""Returns whether the query passed in requires a filter by client
"""
portal_types = self.get_portal_types(query)
intersect = set(portal_types).intersection(self.client_bound_types)
return len(intersect) > 0

def get_portal_types(self, query):
"""Return the list of portal types from the query passed-in
"""
portal_types = query.get("portal_type", [])
if isinstance(portal_types, six.string_types):
portal_types = [portal_types]
return portal_types
47 changes: 9 additions & 38 deletions bika/lims/browser/analysisrequest/add2.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@
from bika.lims import logger
from bika.lims.api.analysisservice import get_calculation_dependencies_for
from bika.lims.api.analysisservice import get_service_dependencies_for
from bika.lims.interfaces import IGetDefaultFieldValueARAddHook, \
IAddSampleFieldsFlush, IAddSampleObjectInfo
from bika.lims.interfaces import IAddSampleFieldsFlush
from bika.lims.interfaces import IAddSampleObjectInfo
from bika.lims.interfaces import IGetDefaultFieldValueARAddHook
from bika.lims.utils import tmpID
from bika.lims.utils.analysisrequest import create_analysisrequest as crar
from bika.lims.workflow import ActionHandlerPool
Expand Down Expand Up @@ -831,25 +832,6 @@ def get_client_info(self, obj):
# UID of the client
uid = api.get_uid(obj)

# Bika Setup folder
bika_setup = api.get_bika_setup()

# bika samplepoints
bika_samplepoints = bika_setup.bika_samplepoints
bika_samplepoints_uid = api.get_uid(bika_samplepoints)

# bika artemplates
bika_artemplates = bika_setup.bika_artemplates
bika_artemplates_uid = api.get_uid(bika_artemplates)

# bika analysisprofiles
bika_analysisprofiles = bika_setup.bika_analysisprofiles
bika_analysisprofiles_uid = api.get_uid(bika_analysisprofiles)

# bika analysisspecs
bika_analysisspecs = bika_setup.bika_analysisspecs
bika_analysisspecs_uid = api.get_uid(bika_analysisspecs)

# catalog queries for UI field filtering
filter_queries = {
"Contact": {
Expand All @@ -862,16 +844,16 @@ def get_client_info(self, obj):
"getParentUID": [uid]
},
"SamplePoint": {
"getClientUID": [uid, bika_samplepoints_uid],
"getClientUID": [uid, ""],
},
"Template": {
"getClientUID": [uid, bika_artemplates_uid],
"getClientUID": [uid, ""],
},
"Profiles": {
"getClientUID": [uid, bika_analysisprofiles_uid],
"getClientUID": [uid, ""],
},
"Specification": {
"getClientUID": [uid, bika_analysisspecs_uid],
"getClientUID": [uid, ""],
},
"SamplingRound": {
"getParentUID": [uid],
Expand Down Expand Up @@ -1019,17 +1001,6 @@ def get_sampletype_info(self, obj):
"""
info = self.get_base_info(obj)

# Bika Setup folder
bika_setup = api.get_bika_setup()

# bika samplepoints
bika_samplepoints = bika_setup.bika_samplepoints
bika_samplepoints_uid = api.get_uid(bika_samplepoints)

# bika analysisspecs
bika_analysisspecs = bika_setup.bika_analysisspecs
bika_analysisspecs_uid = api.get_uid(bika_analysisspecs)

# client
client = self.get_client()
client_uid = client and api.get_uid(client) or ""
Expand All @@ -1045,12 +1016,12 @@ def get_sampletype_info(self, obj):
filter_queries = {
"SamplePoint": {
"getSampleTypeTitles": [obj.Title(), ''],
"getClientUID": [client_uid, bika_samplepoints_uid],
"getClientUID": [client_uid, ""],
"sort_order": "descending",
},
"Specification": {
"getSampleTypeTitle": obj.Title(),
"getClientUID": [client_uid, bika_analysisspecs_uid],
"getClientUID": [client_uid, ""],
"sort_order": "descending",
}
}
Expand Down
3 changes: 0 additions & 3 deletions bika/lims/browser/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,3 @@
from views.contacts import ClientContactsView
from views.contacts import ClientContactVocabularyFactory
from views.samplingrounds import ClientSamplingRoundsView

from ajax import ReferenceWidgetVocabulary
from ajax import ajaxGetClientInfo
64 changes: 0 additions & 64 deletions bika/lims/browser/client/ajax.py

This file was deleted.

15 changes: 0 additions & 15 deletions bika/lims/browser/client/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,6 @@
name="getContacts"
/>

<adapter
for="bika.lims.interfaces.IClient
zope.publisher.interfaces.browser.IBrowserRequest"
factory="bika.lims.browser.client.ReferenceWidgetVocabulary"
provides="bika.lims.interfaces.IReferenceWidgetVocabulary"
/>

<browser:page
for="bika.lims.interfaces.IClient"
name="batches"
Expand Down Expand Up @@ -98,14 +91,6 @@
layer="bika.lims.interfaces.IBikaLIMS"
/>

<browser:page
for="bika.lims.interfaces.IClient"
name="getClientInfo"
class="bika.lims.browser.client.ajaxGetClientInfo"
permission="zope.Public"
layer="bika.lims.interfaces.IBikaLIMS"
/>

<browser:page
for="bika.lims.interfaces.IClient"
name="sampling_rounds_view"
Expand Down
Loading