Skip to content

Commit

Permalink
Merge pull request #82 from vboctor/standard_filters
Browse files Browse the repository at this point in the history
Fixes #15807: Support standard filters like ones in My View page in SOAP API

Implemented mc_project_get_issues_for_user() that supports the following:

Assigned To User (or 0 for unassigned)
Reported By User
Monitored By User
  • Loading branch information
vboctor committed May 10, 2013
2 parents c659a5e + 0927b6d commit 6a9ad6b
Show file tree
Hide file tree
Showing 6 changed files with 421 additions and 137 deletions.
20 changes: 20 additions & 0 deletions api/soap/mantisconnect.wsdl
Expand Up @@ -552,6 +552,16 @@
<part name="project_name" type="xsd:string" /></message>
<message name="mc_project_get_id_from_nameResponse">
<part name="return" type="xsd:integer" /></message>
<message name="mc_project_get_issues_for_userRequest">
<part name="username" type="xsd:string" />
<part name="password" type="xsd:string" />
<part name="project_id" type="xsd:integer" />
<part name="filter_type" type="xsd:string" />
<part name="target_user" type="tns:AccountData" />
<part name="page_number" type="xsd:integer" />
<part name="per_page" type="xsd:integer" /></message>
<message name="mc_project_get_issues_for_userResponse">
<part name="return" type="tns:IssueDataArray" /></message>
<message name="mc_project_get_issuesRequest">
<part name="username" type="xsd:string" />
<part name="password" type="xsd:string" />
Expand Down Expand Up @@ -933,6 +943,11 @@
<input message="tns:mc_project_get_id_from_nameRequest"/>
<output message="tns:mc_project_get_id_from_nameResponse"/>
</operation>
<operation name="mc_project_get_issues_for_user">
<documentation>Get the issues filtered by the specified user within the specified project. Supported types include "assigned", "monitored", "reported". Pass &quot;-1&quot; for the per_page parameter to get all issues. Use project id &quot;0&quot; for all projects.</documentation>
<input message="tns:mc_project_get_issues_for_userRequest"/>
<output message="tns:mc_project_get_issues_for_userResponse"/>
</operation>
<operation name="mc_project_get_issues">
<documentation>Get the issues that match the specified project id and paging details. Pass &quot;-1&quot; for the per_page parameter to get all issues.</documentation>
<input message="tns:mc_project_get_issuesRequest"/>
Expand Down Expand Up @@ -1261,6 +1276,11 @@
<input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
<output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
</operation>
<operation name="mc_project_get_issues_for_user">
<soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_project_get_issues_for_user" style="rpc"/>
<input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
<output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
</operation>
<operation name="mc_project_get_issues">
<soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_project_get_issues" style="rpc"/>
<input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
Expand Down
1 change: 0 additions & 1 deletion api/soap/mc_api.php
Expand Up @@ -227,7 +227,6 @@ function mci_get_project_view_state_id( $p_view_state ) {
}

function mci_get_user_id( $p_user ) {

$p_user = SoapObjectsFactory::unwrapObject( $p_user );

$t_user_id = 0;
Expand Down
72 changes: 72 additions & 0 deletions api/soap/mc_project_api.php
Expand Up @@ -6,6 +6,78 @@
# change the license of future releases.
# See docs/ folder for more details


/**
* Use a standard filter to get issues associated with the specified user.
*
* @param $p_username logged in user name.
* @param $p_password login password.
* @param $p_project_id id of project to filter on, or ALL_PROJECTS.
* @param $p_filter_type The name of the filter to apply
* "assigned" - target user specified - issues assigned to target user that are not resolved.
* "assigned" - target user 0 - unassigned issues that are not resolved.
* "reported" - target user specified - issues reported by user.
* "reported" - target user 0 - will throw.
* "monitored" - target user specified - issues monitored by user.
* "monitored" - target user 0 - issues not monitored.
* @param $p_target_user AccountData for target user, can include id, name, or both.
* @param $p_page_number the page to return (1 based).
* @param $p_per_page number of issues per page.
* @return IssueDataArray a page of matching issues.
*/
function mc_project_get_issues_for_user( $p_username, $p_password, $p_project_id, $p_filter_type, $p_target_user, $p_page_number, $p_per_page ) {
$t_user_id = mci_check_login( $p_username, $p_password );
if ( $t_user_id === false ) {
return mci_soap_fault_login_failed();
}

if ( $p_project_id != ALL_PROJECTS && !project_exists( $p_project_id ) ) {
return SoapObjectsFactory::newSoapFault( 'Client', "Project '$p_project_id' does not exist." );
}

if ( !mci_has_readonly_access( $t_user_id, $p_project_id ) ) {
return mci_soap_fault_access_denied( $t_user_id );
}

$t_lang = mci_get_user_lang( $t_user_id );

$t_orig_page_number = $p_page_number < 1 ? 1 : $p_page_number;
$t_page_count = 0;
$t_bug_count = 0;
$t_target_user_id = mci_get_user_id( $p_target_user );
$t_show_sticky = true;

if ( strcasecmp( $p_filter_type, 'assigned' ) == 0 ) {
$t_filter = filter_create_assigned_to_unresolved( $p_project_id, $t_target_user_id );
} else if ( strcasecmp( $p_filter_type, 'reported' ) == 0 ) {
// target id 0 for reporter doesn't make sense.
if ( $t_target_user_id == 0 ) {
return SoapObjectsFactory::newSoapFault( 'Client', "Target user id must be specified for 'reported' filter." );
}

$t_filter = filter_create_reported_by( $p_project_id, $t_target_user_id );
} else if ( strcasecmp( $p_filter_type, 'monitored' ) == 0 ) {
$t_filter = filter_create_monitored_by( $p_project_id, $t_target_user_id );
} else {
return SoapObjectsFactory::newSoapFault( 'Client', "Unknown filter type '$p_filter_type'." );
}

$t_rows = filter_get_bug_rows( $p_page_number, $p_per_page, $t_page_count, $t_bug_count, $t_filter, $p_project_id, $t_target_user_id, $t_show_sticky );

$t_result = array();

// the page number was moved back, so we have exceeded the actual page number, see bug #12991
if ( $t_orig_page_number > $p_page_number ) {
return $t_result;
}

foreach( $t_rows as $t_issue_data ) {
$t_result[] = mci_issue_data_as_array( $t_issue_data, $t_user_id, $t_lang );
}

return $t_result;
}

function mc_project_get_issues( $p_username, $p_password, $p_project_id, $p_page_number, $p_per_page ) {
$t_user_id = mci_check_login( $p_username, $p_password );
if( $t_user_id === false ) {
Expand Down
68 changes: 67 additions & 1 deletion core/filter_api.php
Expand Up @@ -1046,7 +1046,7 @@ function filter_get_bug_rows( &$p_page_number, &$p_per_page, &$p_page_count, &$p

$t_current_user_id = auth_get_current_user_id();

if( null === $p_user_id ) {
if ( $p_user_id === null || $p_user_id === 0 ) {
$t_user_id = $t_current_user_id;
} else {
$t_user_id = $p_user_id;
Expand Down Expand Up @@ -4774,3 +4774,69 @@ function filter_name_valid_length( $p_name ) {
return true;
}
}

/**
* Create a filter for getting issues assigned to the specified project and user that
* are not yet resolved.
*
* @param $p_project_id the project id or ALL_PROJECTS.
* @param $p_user_id the user id or 0 to get unassigned issues.
* @return a valid filter.
*/
function filter_create_assigned_to_unresolved( $p_project_id, $p_user_id ) {
$t_filter = filter_get_default();

if ( $p_user_id == 0 ) {
$t_filter[FILTER_PROPERTY_HANDLER_ID] = array( '0' => META_FILTER_NONE );
} else {
$t_filter[FILTER_PROPERTY_HANDLER_ID] = array( '0' => $p_user_id );
}

$t_bug_resolved_status_threshold = config_get( 'bug_resolved_status_threshold', /* default */ null, $p_user_id, $p_project_id );
$t_filter[FILTER_PROPERTY_HIDE_STATUS_ID] = array( '0' => $t_bug_resolved_status_threshold );

if ( $p_project_id != ALL_PROJECTS ) {
$t_filter[FILTER_PROPERTY_PROJECT_ID] = array( '0' => $p_project_id );
}

return filter_ensure_valid_filter( $t_filter );
}

/**
* Create a filter for getting issues reported by the specified project and user.
* @param $p_project_id the project id or ALL_PROJECTS.
* @param $p_user_id the user id.
* @return a valid filter.
*/
function filter_create_reported_by( $p_project_id, $p_user_id ) {
$t_filter = filter_get_default();
$t_filter[FILTER_PROPERTY_REPORTER_ID] = array( '0' => $p_user_id );

if ( $p_project_id != ALL_PROJECTS ) {
$t_filter[FILTER_PROPERTY_PROJECT_ID] = array( '0' => $p_project_id );
}

return filter_ensure_valid_filter( $t_filter );
}

/**
* Create a filter for getting issues monitored by the specified project and user.
* @param $p_project_id the project id or ALL_PROJECTS.
* @param $p_user_id the user id.
* @return a valid filter.
*/
function filter_create_monitored_by( $p_project_id, $p_user_id ) {
$t_filter = filter_get_default();

if ( $p_user_id == 0 ) {
$t_filter[FILTER_PROPERTY_MONITOR_USER_ID] = array( '0' => META_FILTER_NONE );
} else {
$t_filter[FILTER_PROPERTY_MONITOR_USER_ID] = array( '0' => $p_user_id );
}

if ( $p_project_id != ALL_PROJECTS ) {
$t_filter[FILTER_PROPERTY_PROJECT_ID] = array( '0' => $p_project_id );
}

return filter_ensure_valid_filter( $t_filter );
}
138 changes: 4 additions & 134 deletions my_view_inc.php
Expand Up @@ -56,39 +56,7 @@
$t_hide_status_default = config_get( 'hide_status_default' );
$t_default_show_changed = config_get( 'default_show_changed' );

$c_filter['assigned'] = array(
FILTER_PROPERTY_CATEGORY => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_SEVERITY_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_STATUS_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIGHLIGHT_CHANGED => $t_default_show_changed,
FILTER_PROPERTY_REPORTER_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HANDLER_ID => Array(
'0' => $t_current_user_id,
),
FILTER_PROPERTY_RESOLUTION_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_BUILD => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_VERSION => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIDE_STATUS_ID => Array(
'0' => $t_bug_resolved_status_threshold,
),
FILTER_PROPERTY_MONITOR_USER_ID => Array(
'0' => META_FILTER_ANY,
),
);
$c_filter['assigned'] = filter_create_assigned_to_unresolved( helper_get_current_project(), $t_current_user_id );
$url_link_parameters['assigned'] = FILTER_PROPERTY_HANDLER_ID . '=' . $t_current_user_id . '&' . FILTER_PROPERTY_HIDE_STATUS_ID . '=' . $t_bug_resolved_status_threshold;

$c_filter['recent_mod'] = array(
Expand Down Expand Up @@ -126,40 +94,7 @@
);
$url_link_parameters['recent_mod'] = FILTER_PROPERTY_HIDE_STATUS_ID . '=none';

$c_filter['reported'] = array(
FILTER_PROPERTY_CATEGORY => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_SEVERITY_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_STATUS_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIGHLIGHT_CHANGED => $t_default_show_changed,
FILTER_PROPERTY_REPORTER_ID => Array(
'0' => $t_current_user_id,
),
FILTER_PROPERTY_HANDLER_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_SORT_FIELD_NAME => 'last_updated',
FILTER_PROPERTY_RESOLUTION_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_BUILD => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_VERSION => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIDE_STATUS_ID => Array(
'0' => $t_hide_status_default,
),
FILTER_PROPERTY_MONITOR_USER_ID => Array(
'0' => META_FILTER_ANY,
),
);
$c_filter['reported'] = filter_create_reported_by( helper_get_current_project(), $t_current_user_id );
$url_link_parameters['reported'] = FILTER_PROPERTY_REPORTER_ID . '=' . $t_current_user_id . '&' . FILTER_PROPERTY_HIDE_STATUS_ID . '=' . $t_hide_status_default;

$c_filter['resolved'] = array(
Expand Down Expand Up @@ -197,79 +132,14 @@
);
$url_link_parameters['resolved'] = FILTER_PROPERTY_STATUS_ID . '=' . $t_bug_resolved_status_threshold . '&' . FILTER_PROPERTY_HIDE_STATUS_ID . '=' . $t_bug_resolved_status_threshold;

$c_filter['unassigned'] = array(
FILTER_PROPERTY_CATEGORY => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_SEVERITY_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_STATUS_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIGHLIGHT_CHANGED => $t_default_show_changed,
FILTER_PROPERTY_REPORTER_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HANDLER_ID => Array(
'0' => META_FILTER_NONE,
),
FILTER_PROPERTY_RESOLUTION_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_BUILD => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_VERSION => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIDE_STATUS_ID => Array(
'0' => $t_hide_status_default,
),
FILTER_PROPERTY_MONITOR_USER_ID => Array(
'0' => META_FILTER_ANY,
),
);
$c_filter['unassigned'] = filter_create_assigned_to_unresolved( helper_get_current_project(), 0 );
$url_link_parameters['unassigned'] = FILTER_PROPERTY_HANDLER_ID . '=[none]' . '&' . FILTER_PROPERTY_HIDE_STATUS_ID . '=' . $t_hide_status_default;

# TODO: check. handler value looks wrong

$c_filter['monitored'] = array(
FILTER_PROPERTY_CATEGORY => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_SEVERITY_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_STATUS_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIGHLIGHT_CHANGED => $t_default_show_changed,
FILTER_PROPERTY_REPORTER_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HANDLER_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_RESOLUTION_ID => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_BUILD => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_PRODUCT_VERSION => Array(
'0' => META_FILTER_ANY,
),
FILTER_PROPERTY_HIDE_STATUS_ID => Array(
'0' => $t_hide_status_default,
),
FILTER_PROPERTY_MONITOR_USER_ID => Array(
'0' => $t_current_user_id,
),
);
$c_filter['monitored'] = filter_create_monitored_by( helper_get_current_project(), $t_current_user_id );
$url_link_parameters['monitored'] = FILTER_PROPERTY_MONITOR_USER_ID . '=' . $t_current_user_id . '&' . FILTER_PROPERTY_HIDE_STATUS_ID . '=' . $t_hide_status_default;


$c_filter['feedback'] = array(
FILTER_PROPERTY_CATEGORY => Array(
'0' => META_FILTER_ANY,
Expand Down

0 comments on commit 6a9ad6b

Please sign in to comment.