Changeset 623 for WorldVistAEHR/trunk/r/IMAGING-MAG-ZMAG/MAGGSIV.m
- Timestamp:
- Dec 4, 2009, 12:11:15 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
WorldVistAEHR/trunk/r/IMAGING-MAG-ZMAG/MAGGSIV.m
r613 r623 1 MAGGSIV ;WOIFO/GEK - Imaging RPC Broker calls. Validate Image data array ; [ 12/27/2000 10:49 ] 2 ;;3.0;IMAGING;**7,8,20,59**;Nov 27, 2007;Build 20 3 ;;Per VHA Directive 2004-038, this routine should not be modified. 4 ;; +---------------------------------------------------------------+ 5 ;; | Property of the US Government. | 6 ;; | No permission to copy or redistribute this software is given. | 7 ;; | Use of unreleased versions of this software requires the user | 8 ;; | to execute a written test agreement with the VistA Imaging | 9 ;; | Development Office of the Department of Veterans Affairs, | 10 ;; | telephone (301) 734-0100. | 11 ;; | | 12 ;; | The Food and Drug Administration classifies this software as | 13 ;; | a medical device. As such, it may not be changed in any way. | 14 ;; | Modifications to this software may result in an adulterated | 15 ;; | medical device under 21CFR820, the use of which is considered | 16 ;; | to be a violation of US Federal Statutes. | 17 ;; +---------------------------------------------------------------+ 18 ;; 19 Q 20 VAL(MAGRY,MAGARRAY,ALL) ;RPC [MAG4 VALIDATE DATA] 21 ;Call to Validate the Image Data Array before a new image/modified entry is attempted. 22 ; Called from MAGGSIA, MAGGSIUI and Capture GUI. 23 ; Parameters : 24 ; MAGARRAY - array of 'Field numbers'|'Action codes' and their Values 25 ; MAGARRAY(1)="5^38" Field#: 5 Value: 38 26 ; an example of an action code is the Code for File Extension 27 ; MAGARRAY(2)="EXT^JPG" Action: EXT Value: JPG 28 ; ALL - "1" = Validate ALL fields, returning an array of error messages. 29 ; "0" = Stop validating if an error occurs, return 30 ; the error message in (0) node. 31 ; Return Variable 32 ; MAGRY() - Array 33 ; Successful MAGRY(0) = 1^Image Data is Valid. 34 ; UNsuccessful MAGRY(0) = 0^Error desc 35 ; IF ALL then MAGRY(1..N) =0^Error desc of all errors 36 N MAGGFLD,MAGGDAT,MAGFSPEC,CHKOK,MAGETXT,MAGRET,MAGRES 37 N Y,AITEM,CT,MAGERR,DFNFLAG,DAT1,X,MAX 38 N $ETRAP,$ESTACK S $ETRAP="D ERR^"_$T(+0) 39 S ALL=$G(ALL) 40 S MAGRY(0)="0^Validating the Data Array..." 41 S MAGERR="",DFNFLAG=0,CT=0 42 ; Do we have any data ? 43 I ($D(MAGARRAY)<10) S MAGRY(0)="0^No input data, Operation CANCELED" Q 44 ; Flag if from Maximus 45 S MAX=0 46 S X="" F S X=$O(MAGARRAY(X)) Q:X="" I $P(MAGARRAY(X),U,1)="TRKID"!($P(MAGARRAY(X),U,1)="108") I $P($P(MAGARRAY(X),U,2),";",1)="MAX" S MAX=1 47 ; Loop through Input Array 48 S AITEM="" F S AITEM=$O(MAGARRAY(AITEM)) Q:AITEM="" D I $L(MAGERR) Q:'ALL S CT=CT+1,MAGRY(CT)=MAGERR,MAGERR="" 49 . S MAGERR="" 50 . S MAGGFLD=$P(MAGARRAY(AITEM),U,1),MAGGDAT=$P(MAGARRAY(AITEM),U,2,99) 51 . I MAGGFLD="" S MAGERR="0^A Field Number/Action Code is required: "_" Item: "_MAGARRAY(AITEM) Q 52 . I MAGGDAT="" S MAGERR="0^A Value is required."_" Item: "_MAGARRAY(AITEM) Q 53 . I MAGGFLD=5 S DFNFLAG=1 54 . ; This inadvertently disallowed Tracking ID's on Group Images. 55 . ;I MAGGFLD=108 I $D(^MAG(2005,"ATRKID",MAGGDAT)) S MAGERR="0^Tracking ID Must be Unique !" Q 56 . I MAGGFLD=108 I ($L(MAGGDAT,";")<2) S MAGRY(0)="0^Tracking ID Must have "";"" Delimiter" Q 57 . ; Check for possible action codes that could be in the array. 58 . I $$ACTCODE(MAGGFLD) D Q 59 . . S DAT1=MAGGDAT 60 . . S Y=$$VALCODE(MAGGFLD,.MAGGDAT) S:'Y MAGERR=Y_" Item: "_MAGARRAY(AITEM) 61 . . I DAT1'=MAGGDAT S MAGARRAY(AITEM)=MAGGFLD_"^"_MAGGDAT 62 . ; If we are adding Multiple Images to a Group, they must be Validated. 63 . ; we could have multiple "2005.04^IENs" in this array. Which means we are 64 . ; adding existing Images to a New/Existing Group. 65 . I MAGGFLD=2005.04 D Q ; 2005.04 isn't the field number, #4 is the field number 66 . . I $G(MAGGDAT,0)=0 Q ;Creating a new Group, with no group entries is the usual way 67 . . ; to do it. Then make successive calls to ADD, Adding each Image to the 68 . . ; Object Group multiple of the Group Parent (fld#14) as it is created. 69 . . I '$D(^MAG(2005,MAGGDAT,0)) S MAGERR="0^Group Object "_MAGGDAT_" doesn't exist"_" Item: "_MAGARRAY(AITEM) 70 . . ; We can't allow adding an image if it already has a group parent. 71 . . I $P(^MAG(2005,MAGGDAT,0),U,10) S MAGERR="0^The Image to be added to the Group, already has a Group Parent"_" Item: "_MAGARRAY(AITEM) 72 . ; if we are getting a WP line of text for Long Desc Field. Can't validate it. 73 . I MAGGFLD=11 Q ; this is a line of the WP Long Desc field. 74 . ; NEW CALL TO VALIDATE FILE,FIELD,DATA 75 . S DAT1=MAGGDAT 76 . I '$$VALID^MAGGSIV1(2005,MAGGFLD,.MAGGDAT,.MAGRES) S MAGERR="0^"_MAGRES Q 77 . I DAT1'=MAGGDAT S MAGARRAY(AITEM)=MAGGFLD_"^"_MAGGDAT 78 . Q 79 ; 80 ; if there was an Error in data we'll quit now. 81 ; If ALL is true, then MAGRY(1...N) will exist if there were errors. 82 I $O(MAGRY(0)) S MAGRY(0)="0^Errors were found in data." Q 83 ; If ALL is false, then MAGERR will exist if there was an error. 84 I $L(MAGERR) S MAGRY(0)=MAGERR Q 85 ; 86 ; If all data is valid we get here. 87 ; Last Test, see if a Patient was in array, 88 ; (Patient is the only Required field check done in this routine). 89 I 'DFNFLAG S MAGRY(0)="0^A Patient DFN is required. " Q 90 S MAGRY(0)="1^Data is Valid." 91 Q 92 ACTCODE(CODE) ;Function that returns True (1) if this code is a valid Import API Action Code 93 ; Patch 8. We're adding 107 as an action code, so it will pass validation even if the entry 94 ; in the Acquisition Device File doesn't exist; 95 ; it will be validated in PRE^MAGGSIA1 and a new Acquisition Device entry made if needed. 96 I ",107,ACQD,IEN,EXT,ABS,JB,WRITE,BIG,DICOMSN,DICOMIN,ACQS,ACQL,STATUSCB,CALLMTH,USERNAME,PASSWORD,DELFLAG,TRNSTYP,"[(","_CODE_",") Q 1 97 Q 0 98 VALCODE(CODE,VALUE) ; We validate the values for the possible action codes 99 N MAGY 100 I VALUE="" Q "0^NO VALUE in Action Code string: """_X_"" 101 ; Patch 8, added 107 102 I ",ACQL,CALLMTH,USERNAME,PASSWORD,"[(","_CODE_",") Q 1 ; NO VALIDATION FOR THESE CODES 103 D @CODE 104 Q MAGY 105 ; Each Tag is a valid Action code 106 IEN I $D(^MAG(2005,VALUE)) S MAGY=1 107 E S MAGY="0^INVALID IMAGE IEN." 108 Q 109 EXT ; code will go here to validate the extension type. i.e. we won't let types .exe .bat .com .zip ... etc. 110 ; Maybe a modification to Object Type file, to have allowable extensions in the file, and a 111 ; cross reference on a new field EXTENSION. The capture workstation wouldn't have to ask the 112 ; user for the file type of each file, and we wouldn't get WORD .DOC files that the user called Color Images 113 ABS ; Meaning: Have the BP create the abstract 114 JB ; Meaning: Have the BP copy the image to the JukeBox 115 BIG ; Meaning: There is a big file also, set the Image File field ? to indicate there is a BIG File. 116 S MAGY=1 117 Q 118 WRITE ; Meaning: This is the Internal Entry (or "PACS") of the WRITE Directory. Images will be written 119 ; here instead of the default WRITE Directory. 120 S MAGY=$$DRIVE^MAGGTU1(VALUE) 121 Q 122 DICOMSN ;Meaning: DICOM Series Number. This will be entered in the Group Object multiple, field #1 123 ;We were validating this as an integer, but it can be anything, no way to validate. 124 S MAGY=1 125 Q 126 DICOMIN ;Meaning: DICOM Image Number. This will be entered in the Group Object multiple, field #2 127 ; We were validating this as an integer, but it can be anything, no way to validate. 128 S MAGY=1 129 Q 130 DELFLAG ;Meaning: This flag tells the Delphi Import Component to Delete the Image files after successful processing 131 I ",TRUE,FALSE,0,1,"[(","_$$UPPER(VALUE)_",") S MAGY=1 132 E S MAGY="0^INVALID Value " 133 I VALUE="1" S VALUE="TRUE" 134 I VALUE="0" S VALUE="FALSE" 135 Q 136 TRNSTYP ;Meaning: This flag is for future use, for now it is ignored, defaults to "NEW" 137 S MAGY=1 138 Q 139 STATUSCB ; Meaning: This is the TAG^RTN that Imaging calls to report the 140 ; status of the Import. 141 S MAGY="0^Error validating TAG^RTN: "_VALUE 142 I '$L($T(@VALUE)) S MAGY="0^Invalid Status CallBack "_VALUE 143 E S MAGY=1 144 Q 145 ACQS ; We need to make sure the ACQS (Acquisition Site) is a Valid entry in Imaging Site Params. 146 S VALUE=$P(VALUE,";") ; Stop error, when old OCX sends data. 147 ; Next Block is for VIC (Maximus) that sends Station Number. 148 N ERR S ERR=0 149 I MAX D Q:ERR 150 . S X=$O(^DIC(4,"D",VALUE,"")) 151 . I X="" S MAGY="0^Invalid STATION NUMBER: (ACQS): "_VALUE,ERR=1 Q 152 . S VALUE=X 153 . Q 154 I '$$CONSOLID^MAGBAPI S MAGY=1 Q 155 ;Patch 20 will have this. 156 I '$D(^MAG(2006.1,"B",VALUE)) S MAGY="0^Acquisition Site ("_VALUE_") is Not in Site Param File." Q 157 S MAGY=1 158 Q 159 107 ; 107 and ACQD are the same. Calling 107 falls into validation for ACQD. 160 ACQD ; 107 and ACQD are ACQUISITION DEVICE FILE (2006.04) pointers or Values. 161 ; If it is an integer, We assume the value is an IEN and validate it here. 162 I ((+VALUE)=VALUE),'$D(^MAG(2006.04,VALUE)) S MAGY="0^Invalid IEN ("_VALUE_") for ACQUISITION DEVICE File." Q 163 ; if it is not an integer, it is either a new/existing entry for 2006.04 Result is Success, 164 ; and it will be validated in PRE^MAGGSIA1 and added to File 2006.04 if needed. 165 S MAGY=1 166 Q 167 UPPER(X) ; 168 Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") 169 ; 170 ERR ; ERROR TRAP FOR Import API 171 N ERR S ERR=$$EC^%ZOSV 172 S MAGRY(0)="0^ETRAP: "_ERR 173 D @^%ZOSF("ERRTN") 174 Q 1 MAGGSIV ;WOIFO/GEK - Imaging RPC Broker calls. Validate Image data array ; [ 12/27/2000 10:49 ] 2 ;;3.0;IMAGING;**7,8,20**;Apr 12, 2006 3 ;; +---------------------------------------------------------------+ 4 ;; | Property of the US Government. | 5 ;; | No permission to copy or redistribute this software is given. | 6 ;; | Use of unreleased versions of this software requires the user | 7 ;; | to execute a written test agreement with the VistA Imaging | 8 ;; | Development Office of the Department of Veterans Affairs, | 9 ;; | telephone (301) 734-0100. | 10 ;; | | 11 ;; | The Food and Drug Administration classifies this software as | 12 ;; | a medical device. As such, it may not be changed in any way. | 13 ;; | Modifications to this software may result in an adulterated | 14 ;; | medical device under 21CFR820, the use of which is considered | 15 ;; | to be a violation of US Federal Statutes. | 16 ;; +---------------------------------------------------------------+ 17 ;; 18 Q 19 VAL(MAGRY,MAGARRAY,ALL) ;RPC [MAG4 VALIDATE DATA] 20 ;Call to Validate the Image Data Array before a new image/modified entry is attempted. 21 ; Called from MAGGSIA, MAGGSIUI and Capture GUI. 22 ; Parameters : 23 ; MAGARRAY - array of 'Field numbers'|'Action codes' and their Values 24 ; MAGARRAY(1)="5^38" Field#: 5 Value: 38 25 ; an example of an action code is the Code for File Extension 26 ; MAGARRAY(2)="EXT^JPG" Action: EXT Value: JPG 27 ; ALL - "1" = Validate ALL fields, returning an array of error messages. 28 ; "0" = Stop validating if an error occurs, return 29 ; the error message in (0) node. 30 ; Return Variable 31 ; MAGRY() - Array 32 ; Successful MAGRY(0) = 1^Image Data is Valid. 33 ; UNsuccessful MAGRY(0) = 0^Error desc 34 ; IF ALL then MAGRY(1..N) =0^Error desc of all errors 35 N MAGGFLD,MAGGDAT,MAGFSPEC,CHKOK,MAGETXT,MAGRET,MAGRES 36 N Y,AITEM,CT,MAGERR,DFNFLAG,DAT1,X,MAX 37 N $ETRAP,$ESTACK S $ETRAP="D ERR^"_$T(+0) 38 S ALL=$G(ALL) 39 S MAGRY(0)="0^Validating the Data Array..." 40 S MAGERR="",DFNFLAG=0,CT=0 41 ; Do we have any data ? 42 I ($D(MAGARRAY)<10) S MAGRY(0)="0^No input data, Operation CANCELED" Q 43 ; Flag if from Maximus 44 S MAX=0 45 S X="" F S X=$O(MAGARRAY(X)) Q:X="" I $P(MAGARRAY(X),U,1)="TRKID"!($P(MAGARRAY(X),U,1)="108") I $P($P(MAGARRAY(X),U,2),";",1)="MAX" S MAX=1 46 ; Loop through Input Array 47 S AITEM="" F S AITEM=$O(MAGARRAY(AITEM)) Q:AITEM="" D I $L(MAGERR) Q:'ALL S CT=CT+1,MAGRY(CT)=MAGERR,MAGERR="" 48 . S MAGERR="" 49 . S MAGGFLD=$P(MAGARRAY(AITEM),U,1),MAGGDAT=$P(MAGARRAY(AITEM),U,2,99) 50 . I MAGGFLD="" S MAGERR="0^A Field Number/Action Code is required: "_" Item: "_MAGARRAY(AITEM) Q 51 . I MAGGDAT="" S MAGERR="0^A Value is required."_" Item: "_MAGARRAY(AITEM) Q 52 . I MAGGFLD=5 S DFNFLAG=1 53 . ; This inadvertently disallowed Tracking ID's on Group Images. 54 . ;I MAGGFLD=108 I $D(^MAG(2005,"ATRKID",MAGGDAT)) S MAGERR="0^Tracking ID Must be Unique !" Q 55 . I MAGGFLD=108 I ($L(MAGGDAT,";")<2) S MAGRY(0)="0^Tracking ID Must have "";"" Delimiter" Q 56 . ; Check for possible action codes that could be in the array. 57 . I $$ACTCODE(MAGGFLD) D Q 58 . . S DAT1=MAGGDAT 59 . . S Y=$$VALCODE(MAGGFLD,.MAGGDAT) S:'Y MAGERR=Y_" Item: "_MAGARRAY(AITEM) 60 . . I DAT1'=MAGGDAT S MAGARRAY(AITEM)=MAGGFLD_"^"_MAGGDAT 61 . ; If we are adding Multiple Images to a Group, they must be Validated. 62 . ; we could have multiple "2005.04^IENs" in this array. Which means we are 63 . ; adding existing Images to a New/Existing Group. 64 . I MAGGFLD=2005.04 D Q ; 2005.04 isn't the field number, #4 is the field number 65 . . I $G(MAGGDAT,0)=0 Q ;Creating a new Group, with no group entries is the usual way 66 . . ; to do it. Then make successive calls to ADD, Adding each Image to the 67 . . ; Object Group multiple of the Group Parent (fld#14) as it is created. 68 . . I '$D(^MAG(2005,MAGGDAT,0)) S MAGERR="0^Group Object "_MAGGDAT_" doesn't exist"_" Item: "_MAGARRAY(AITEM) 69 . . ; We can't allow adding an image if it already has a group parent. 70 . . I $P(^MAG(2005,MAGGDAT,0),U,10) S MAGERR="0^The Image to be added to the Group, already has a Group Parent"_" Item: "_MAGARRAY(AITEM) 71 . ; if we are getting a WP line of text for Long Desc Field. Can't validate it. 72 . I MAGGFLD=11 Q ; this is a line of the WP Long Desc field. 73 . ; NEW CALL TO VALIDATE FILE,FIELD,DATA 74 . S DAT1=MAGGDAT 75 . I '$$VALID^MAGGSIV1(2005,MAGGFLD,.MAGGDAT,.MAGRES) S MAGERR="0^"_MAGRES Q 76 . I DAT1'=MAGGDAT S MAGARRAY(AITEM)=MAGGFLD_"^"_MAGGDAT 77 . Q 78 ; 79 ; if there was an Error in data we'll quit now. 80 ; If ALL is true, then MAGRY(1...N) will exist if there were errors. 81 I $O(MAGRY(0)) S MAGRY(0)="0^Errors were found in data." Q 82 ; If ALL is false, then MAGERR will exist if there was an error. 83 I $L(MAGERR) S MAGRY(0)=MAGERR Q 84 ; 85 ; If all data is valid we get here. 86 ; Last Test, see if a Patient was in array, 87 ; (Patient is the only Required field check done in this routine). 88 I 'DFNFLAG S MAGRY(0)="0^A Patient DFN is required. " Q 89 S MAGRY(0)="1^Data is Valid." 90 Q 91 ACTCODE(CODE) ;Function that returns True (1) if this code is a valid Import API Action Code 92 ; Patch 8. We're adding 107 as an action code, so it will pass validation even if the entry 93 ; in the Acquisition Device File doesn't exist; 94 ; it will be validated in PRE^MAGGSIA1 and a new Acquisition Device entry made if needed. 95 I ",107,ACQD,IEN,EXT,ABS,JB,WRITE,BIG,DICOMSN,DICOMIN,ACQS,ACQL,STATUSCB,CALLMTH,USERNAME,PASSWORD,DELFLAG,TRNSTYP,"[(","_CODE_",") Q 1 96 Q 0 97 VALCODE(CODE,VALUE) ; We validate the values for the possible action codes 98 N MAGY 99 I VALUE="" Q "0^NO VALUE in Action Code string: """_X_"" 100 ; Patch 8, added 107 101 I ",ACQL,CALLMTH,USERNAME,PASSWORD,"[(","_CODE_",") Q 1 ; NO VALIDATION FOR THESE CODES 102 D @CODE 103 Q MAGY 104 ; Each Tag is a valid Action code 105 IEN I $D(^MAG(2005,VALUE)) S MAGY=1 106 E S MAGY="0^INVALID IMAGE IEN." 107 Q 108 EXT ; code will go here to validate the extension type. i.e. we won't let types .exe .bat .com .zip ... etc. 109 ; Maybe a modification to Object Type file, to have allowable extensions in the file, and a 110 ; cross reference on a new field EXTENSION. The capture workstation wouldn't have to ask the 111 ; user for the file type of each file, and we wouldn't get WORD .DOC files that the user called Color Images 112 ABS ; Meaning: Have the BP create the abstract 113 JB ; Meaning: Have the BP copy the image to the JukeBox 114 BIG ; Meaning: There is a big file also, set the Image File field ? to indicate there is a BIG File. 115 S MAGY=1 116 Q 117 WRITE ; Meaning: This is the Internal Entry (or "PACS") of the WRITE Directory. Images will be written 118 ; here instead of the default WRITE Directory. 119 S MAGY=$$DRIVE^MAGGTU1(VALUE) 120 Q 121 DICOMSN ;Meaning: DICOM Series Number. This will be entered in the Group Object multiple, field #1 122 ;We were validating this as an integer, but it can be anything, no way to validate. 123 S MAGY=1 124 Q 125 DICOMIN ;Meaning: DICOM Image Number. This will be entered in the Group Object multiple, field #2 126 ; We were validating this as an integer, but it can be anything, no way to validate. 127 S MAGY=1 128 Q 129 DELFLAG ;Meaning: This flag tells the Delphi Import Component to Delete the Image files after successful processing 130 I ",TRUE,FALSE,0,1,"[(","_$$UPPER(VALUE)_",") S MAGY=1 131 E S MAGY="0^INVALID Value " 132 I VALUE="1" S VALUE="TRUE" 133 I VALUE="0" S VALUE="FALSE" 134 Q 135 TRNSTYP ;Meaning: This flag is for future use, for now it is ignored, defaults to "NEW" 136 S MAGY=1 137 Q 138 STATUSCB ; Meaning: This is the TAG^RTN that Imaging calls to report the 139 ; status of the Import. 140 S MAGY="0^Error validating TAG^RTN: "_VALUE 141 I '$L($T(@VALUE)) S MAGY="0^Invalid Status CallBack "_VALUE 142 E S MAGY=1 143 Q 144 ACQS ; We need to make sure the ACQS (Acquisition Site) is a Valid entry in Imaging Site Params. 145 S VALUE=$P(VALUE,";") ; Stop error, when old OCX sends data. 146 ; Next Block is for VIC (Maximus) that sends Station Number. 147 N ERR S ERR=0 148 I MAX D Q:ERR 149 . S X=$O(^DIC(4,"D",VALUE,"")) 150 . I X="" S MAGY="0^Invalid STATION NUMBER: (ACQS): "_VALUE,ERR=1 Q 151 . S VALUE=X 152 . Q 153 I '$$CONSOLID^MAGBAPI S MAGY=1 Q 154 ;Patch 20 will have this. 155 I '$D(^MAG(2006.1,"B",VALUE)) S MAGY="0^Acquisition Site ("_VALUE_") is Not in Site Param File." Q 156 S MAGY=1 157 Q 158 107 ; 107 and ACQD are the same. Calling 107 falls into validation for ACQD. 159 ACQD ; 107 and ACQD are ACQUISITION DEVICE FILE (2006.04) pointers or Values. 160 ; If it is an integer, We assume the value is an IEN and validate it here. 161 I ((+VALUE)=VALUE),'$D(^MAG(2006.04,VALUE)) S MAGY="0^Invalid IEN ("_VALUE_") for ACQUISITION DEVICE File." Q 162 ; if it is not an integer, it is either a new/existing entry for 2006.04 Result is Success, 163 ; and it will be validated in PRE^MAGGSIA1 and added to File 2006.04 if needed. 164 S MAGY=1 165 Q 166 UPPER(X) ; 167 Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") 168 ; 169 ERR ; ERROR TRAP FOR Import API 170 N ERR S ERR=$$EC^%ZOSV 171 S MAGRY(0)="0^ETRAP: "_ERR 172 D @^%ZOSF("ERRTN") 173 Q
Note:
See TracChangeset
for help on using the changeset viewer.