Author: jaz
Date: Thu May 14 05:12:24 2009 New Revision: 774634 URL: http://svn.apache.org/viewvc?rev=774634&view=rev Log: refactored "markEventRead" service to allow updating when status is COM_COMPLETE (the default after a messge is sent), also stopped 'admin' users from marking other user's events as read (do a manual status change instead), implemented a little event which marks a communication event as read, and returns a 1px gif image (spacer.gif) to the browser/mail client; include the following in your communication email: <img src="http://localhost:8080/partymgr/control/ceimages/${communicationEventId}/logo.gif"/> and when the message is opened, the event will be marked as read (assuming images are loaded); logo.gif can be any name, everything after the communication event ID in pathInfo is ignored Modified: ofbiz/trunk/applications/party/data/PartyTypeData.xml ofbiz/trunk/applications/party/script/org/ofbiz/party/communication/CommunicationEventServices.xml ofbiz/trunk/applications/party/servicedef/services.xml ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml Modified: ofbiz/trunk/applications/party/data/PartyTypeData.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/data/PartyTypeData.xml?rev=774634&r1=774633&r2=774634&view=diff ============================================================================== --- ofbiz/trunk/applications/party/data/PartyTypeData.xml (original) +++ ofbiz/trunk/applications/party/data/PartyTypeData.xml Thu May 14 05:12:24 2009 @@ -311,13 +311,16 @@ <StatusItem description="Bounced" sequenceId="50" statusCode="BOUNCED" statusId="COM_BOUNCED" statusTypeId="COM_EVENT_STATUS"/> <StatusItem description="Cancelled" sequenceId="99" statusCode="CANCELLED" statusId="COM_CANCELLED" statusTypeId="COM_EVENT_STATUS"/> <StatusValidChange condition="" statusId="COM_ENTERED" statusIdTo="COM_PENDING" transitionName="Set Pending"/> + <StatusValidChange condition="" statusId="COM_ENTERED" statusIdTo="COM_READ" transitionName="Read"/> <StatusValidChange condition="" statusId="COM_ENTERED" statusIdTo="COM_COMPLETE" transitionName="Complete"/> - <StatusValidChange condition="" statusId="COM_PENDING" statusIdTo="COM_READ" transitionName="Mark Read"/> + <StatusValidChange condition="" statusId="COM_PENDING" statusIdTo="COM_READ" transitionName="Read"/> <StatusValidChange condition="" statusId="COM_PENDING" statusIdTo="COM_IN_PROGRESS" transitionName="Set In Progress"/> <StatusValidChange condition="" statusId="COM_READ" statusIdTo="COM_IN_PROGRESS" transitionName="Set In Progress"/> <StatusValidChange condition="" statusId="COM_READ" statusIdTo="COM_COMPLETE" transitionName="Complete"/> + <StatusValidChange condition="" statusId="COM_IN_PROGRESS" statusIdTo="COM_READ" transitionName="Read"/> <StatusValidChange condition="" statusId="COM_IN_PROGRESS" statusIdTo="COM_COMPLETE" transitionName="Complete"/> <StatusValidChange condition="" statusId="COM_IN_PROGRESS" statusIdTo="COM_BOUNCED" transitionName="Bounced"/> + <StatusValidChange condition="" statusId="COM_COMPLETE" statusIdTo="COM_READ" transitionName="Read"/> <StatusValidChange condition="" statusId="COM_COMPLETE" statusIdTo="COM_RESOLVED" transitionName="Resolve"/> <StatusValidChange condition="" statusId="COM_COMPLETE" statusIdTo="COM_REFERRED" transitionName="Refer"/> <StatusValidChange condition="" statusId="COM_COMPLETE" statusIdTo="COM_BOUNCED" transitionName="Bounced"/> Modified: ofbiz/trunk/applications/party/script/org/ofbiz/party/communication/CommunicationEventServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/script/org/ofbiz/party/communication/CommunicationEventServices.xml?rev=774634&r1=774633&r2=774634&view=diff ============================================================================== --- ofbiz/trunk/applications/party/script/org/ofbiz/party/communication/CommunicationEventServices.xml (original) +++ ofbiz/trunk/applications/party/script/org/ofbiz/party/communication/CommunicationEventServices.xml Thu May 14 05:12:24 2009 @@ -393,34 +393,49 @@ </if-not-empty> </simple-method> - <simple-method method-name="markEventRead" short-description="Marks a Communication Event as Read"> + <simple-method method-name="markEventRead" short-description="Automatically Marks a Communication Event as Read" login-required="false"> <if-empty field="parameters.communicationEventId"> <set from-field="parameters.messageId" field="parameters.communicationEventId"/> </if-empty> <entity-one entity-name="CommunicationEvent" value-field="event"/> + <!-- get the 'system' user to run the update service as --> + <entity-one entity-name="UserLogin" value-field="system"> + <field-map field-name="userLoginId" value="system"/> + </entity-one> + <if> <condition> - <or> - <if-compare-field field="event.partyIdTo" to-field="userLogin.partyId" operator="equals"/> - <if-has-permission permission="PARTYMGR" action="_CME_UPDATE"/> - </or> + <and> + <or> + <!-- valid statuses which can go to read --> + <if-compare field="event.statusId" operator="equals" value="COM_ENTERED"/> + <if-compare field="event.statusId" operator="equals" value="COM_PENDING"/> + <if-compare field="event.statusId" operator="equals" value="COM_IN_PROGRESS"/> + <if-compare field="event.statusId" operator="equals" value="COM_COMPLETE"/> + </or> + <or> + <!-- if the user is not logged in, its okay to update, assumption is an external event --> + <if-empty field="userLogin"/> + <!-- if the user is logged in, make sure they are the owner of the event --> + <and> + <not><if-empty field="userLogin"/></not> + <if-compare-field field="event.partyIdTo" to-field="userLogin.partyId" operator="equals"/> + <!-- note: it is not okay for an admin to mark another user's event as read --> + </and> + </or> + </and> </condition> - <then> - <if> - <condition> - <or> - <if-compare field="event.statusId" operator="equals" value="COM_ENTERED"/> - <if-compare field="event.statusId" operator="equals" value="COM_PENDING"/> - </or> - </condition> - <then> - <set value="COM_READ" field="event.statusId"/> - <store-value value-field="event"/> - </then> - </if> - </then> - </if> + <then> + <set field="updateCtx.communicationEventId" from-field="event.communicationEventId"/> + <set field="updateCtx.statusId" value="COM_READ"/> + <set field="updateCtx.userLogin" from-field="userLogin"/> + <if-empty field="userLogin"> + <set field="updateCtx.userLogin" from-field="system"/> + </if-empty> + <call-service service-name="updateCommunicationEvent" in-map-name="updateCtx" include-user-login="false"/> + </then> + </if> </simple-method> <simple-method method-name="sendEmailDated" Modified: ofbiz/trunk/applications/party/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/servicedef/services.xml?rev=774634&r1=774633&r2=774634&view=diff ============================================================================== --- ofbiz/trunk/applications/party/servicedef/services.xml (original) +++ ofbiz/trunk/applications/party/servicedef/services.xml Thu May 14 05:12:24 2009 @@ -776,13 +776,13 @@ <auto-attributes include="nonpk" mode="IN" optional="true" entity-name="CommunicationEventWorkEff"/> </service> <service name="markCommEventRead" engine="simple" - location="component://party/script/org/ofbiz/party/communication/CommunicationEventServices.xml" invoke="markEventRead" auth="true"> - <description>Marks a communication event as read if in the entered/pending status</description> + location="component://party/script/org/ofbiz/party/communication/CommunicationEventServices.xml" invoke="markEventRead" auth="false"> + <description>Marks a communication event as read</description> <attribute name="communicationEventId" type="String" mode="IN" optional="false"/> </service> <service name="markMessageRead" engine="simple" - location="component://party/script/org/ofbiz/party/communication/CommunicationEventServices.xml" invoke="markEventRead" auth="true"> - <description>Marks a communication event as read if in the entered/pending status</description> + location="component://party/script/org/ofbiz/party/communication/CommunicationEventServices.xml" invoke="markEventRead" auth="false"> + <description>Marks a communication event as read</description> <attribute name="messageId" type="String" mode="IN" optional="false"/> </service> <service name="sendCommEventAsEmail" engine="java" Modified: ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java?rev=774634&r1=774633&r2=774634&view=diff ============================================================================== --- ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java (original) +++ ofbiz/trunk/applications/party/src/org/ofbiz/party/communication/CommunicationEventServices.java Thu May 14 05:12:24 2009 @@ -19,6 +19,10 @@ package org.ofbiz.party.communication; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.ByteBuffer; import java.sql.Timestamp; import java.util.Enumeration; @@ -34,12 +38,17 @@ import javax.mail.Address; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import javolution.util.FastList; import javolution.util.FastMap; +import org.ofbiz.base.location.FlexibleLocation; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.StringUtil; import org.ofbiz.base.util.UtilDateTime; +import org.ofbiz.base.util.UtilHttp; import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.UtilValidate; @@ -938,8 +947,7 @@ * Calls findPartyFromEmailAddress service and returns a List of the results for the array of addresses */ private static List<Map<String, Object>> buildListOfPartyInfoFromEmailAddresses(Address [] addresses, GenericValue userLogin, LocalDispatcher dispatcher) throws GenericServiceException { - InternetAddress emailAddress = null; - Map map = null; + InternetAddress emailAddress = null; Map<String, Object> result = null; List<Map<String, Object>> tempResults = FastList.newInstance(); @@ -1115,4 +1123,50 @@ return ServiceUtil.returnSuccess(); } + + /* + * Event which marks a communication event as read, and returns a 1px image to the browser/mail client + */ + public static String markCommunicationAsRead(HttpServletRequest request, HttpServletResponse response) { + String communicationEventId = null; + + // pull the communication event from path info, so we can hide the process from the user + String pathInfo = request.getPathInfo(); + String[] pathParsed = pathInfo.split("/", 3); + if (pathParsed != null && pathParsed.length > 2) { + pathInfo = pathParsed[2]; + } else { + pathInfo = null; + } + if (pathInfo != null & pathInfo.indexOf("/") > -1) { + pathParsed = pathInfo.split("/"); + communicationEventId = pathParsed[0]; + } + + // update the communication event + if (communicationEventId != null) { + Debug.logInfo("Marking communicationEventId [" + communicationEventId + "] from path info : " + request.getPathInfo() + " as read.", module); + LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); + try { + dispatcher.runAsync("markCommEventRead", UtilMisc.toMap("communicationEventId", communicationEventId)); + } catch (GenericServiceException e) { + Debug.logError(e, module); + } + } + + // return the 1px image (spacer.gif) + URL imageUrl; + try { + imageUrl = FlexibleLocation.resolveLocation("component://images/webapp/images/spacer.gif"); + InputStream imageStream = imageUrl.openStream(); + UtilHttp.streamContentToBrowser(response, imageStream, 43, "image/gif", null); + } catch (MalformedURLException e) { + Debug.logError(e, module); + } catch (IOException e) { + Debug.logError(e, module); + } + + // return null to not return any view + return null; + } } Modified: ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml?rev=774634&r1=774633&r2=774634&view=diff ============================================================================== --- ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml (original) +++ ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml Thu May 14 05:12:24 2009 @@ -1181,6 +1181,12 @@ <response name="error" type="view" value="viewprofile"/> </request-map> + <!-- external communication event; mark as read using 1px image request --> + <request-map uri="ceimages"> + <security https="false" auth="false"/> + <event type="java" path="org.ofbiz.party.communication.CommunicationEventServices" invoke="markCommunicationAsRead"/> + <response name="success" type="none"/> + </request-map> <!-- end of request mappings --> <!-- View Mappings --> |
Free forum by Nabble | Edit this page |