I have added some additional features to ticket assignment.  Administrators may 
assign on ticket creation/editing.  Normal developers may now assign and 
unassign themselves without any special privileges.  Viewing who has what 
ticket and self assigning/unassigning is done right in the "all tickets" 
listing.  

Jeremy, a per project security attribute that allows all developers to assign 
to each other is an interesting idea.  That may be where I head next, but I 
wanted to see if anyone had any comments about the design and implementation of 
what I have done so far.

diff -rupN fossil_src_orig/src/report.c fossil/src/report.c
--- fossil_src_orig/src/report.c        2010-03-18 10:20:53.000000000 -0400
+++ fossil/src/report.c 2010-05-12 22:08:36.372518961 -0400
@@ -646,13 +646,14 @@ static int generate_html(
   int i;
   const char *zTid;  /* Ticket UUID.  (value of column named '#') */
   int rn;            /* Report number */
+  char zrn[4];
   char *zBg = 0;     /* Use this background color */
   char zPage[30];    /* Text version of the ticket number */
 
   /* Get the report number
   */
   rn = pState->rn;
-
+  sprintf(zrn, "%d", rn);
   /* Do initialization
   */
   if( pState->nCount==0 ){
@@ -759,6 +760,13 @@ static int generate_html(
       }else{
         @ <td valign="top">%h(zData)</td>
       }
+    }else if ( strcmp(azName[i], "assignedto") == 0 ){
+      if ( zData[0]==0 )
+        @ <td valign="top"><a 
href="/tktassign?name=%h(zTid)&rn=%h(zrn)">unassigned</a></td>
+      else if ( strcmp(zData, g.zLogin) == 0 )
+        @ <td valign="top">%h(zData) <a 
href="/tktunassign?name=%h(zTid)&rn=%h(zrn)">(unassign)</a></td>
+      else
+        @ <td valign="top">%h(zData)</td>
     }else if( zData[0]==0 ){
       @ <td valign="top">&nbsp;</td>
     }else{
diff -rupN fossil_src_orig/src/schema.c fossil/src/schema.c
--- fossil_src_orig/src/schema.c        2010-03-18 10:20:53.000000000 -0400
+++ fossil/src/schema.c 2010-05-09 11:15:12.108214371 -0400
@@ -171,10 +171,33 @@ const char zRepositorySchema1[] = 
 @   datetime(tkt_mtime) AS ''mtime'',
 @   type,
 @   status,
+@   assignedto,
 @   subsystem,
 @   title
 @ FROM ticket');
 @
+@ INSERT INTO reportfmt(title,cols,sqlcode) VALUES('My Tickets','#ffffff Key:
+@ #f2dcdc Active
+@ #e8e8e8 Review
+@ #cfe8bd Fixed
+@ #bde5d6 Tested
+@ #cacae5 Deferred
+@ #c8c8c8 Closed','SELECT
+@   CASE WHEN status IN (''Open'',''Verified'') THEN ''#f2dcdc''
+@        WHEN status=''Review'' THEN ''#e8e8e8''
+@        WHEN status=''Fixed'' THEN ''#cfe8bd''
+@        WHEN status=''Tested'' THEN ''#bde5d6''
+@        WHEN status=''Deferred'' THEN ''#cacae5''
+@        ELSE ''#c8c8c8'' END AS ''bgcolor'',
+@   substr(tkt_uuid,1,10) AS ''#'',
+@   datetime(tkt_mtime) AS ''mtime'',
+@   type,
+@   status,
+@   assignedto,
+@   subsystem,
+@   title
+@ FROM ticket WHERE assignedto=user()');
+@
 @ -- Some ticket content (such as the originators email address or contact
 @ -- information) needs to be obscured to protect privacy.  This is achieved
 @ -- by storing an SHA1 hash of the content.  For display, the hash is
@@ -358,6 +381,7 @@ const char zRepositorySchema2[] =
 @   priority TEXT,
 @   severity TEXT,
 @   foundin TEXT,
+@   assignedto TEXT,
 @   private_contact TEXT,
 @   resolution TEXT,
 @   title TEXT,
diff -rupN fossil_src_orig/src/tkt.c fossil/src/tkt.c
--- fossil_src_orig/src/tkt.c   2010-03-18 10:20:53.000000000 -0400
+++ fossil/src/tkt.c    2010-05-12 21:52:11.766531533 -0400
@@ -291,6 +291,74 @@ void ticket_rebuild(void){
 }
 
 /*
+** WEBPAGE: tktassign
+** URL: tktassign?name=UUID
+**
+** Assign current user to ticket.
+*/
+void tktassign(void){
+  const char *zUuid;
+  const char *zFrom;
+  const char *zFullName;
+
+  Stmt q;
+  zUuid = PD("name", "");
+  zFrom = PD("rn", "");
+  
+  login_check_credentials();
+  
+  zFullName = db_text(0, 
+     "SELECT tkt_uuid FROM ticket"
+     " WHERE tkt_uuid GLOB '%q*'", zUuid);   
+  
+  db_prepare(&q, "UPDATE ticket SET assignedto=:user WHERE tkt_uuid=:ticket");
+  db_bind_text(&q, ":user", g.zLogin);
+  db_bind_text(&q, ":ticket", zFullName);
+  
+  db_step(&q);
+  db_finalize(&q);  
+  cgi_redirectf("rptview?rn=%T", zFrom);
+}
+
+/*
+** WEBPAGE: tktunassign
+** URL:  tktunassign?name=UUID
+**
+** Unassign from a ticket.
+*/
+void tktunassign(void){
+  const char *zUuid;
+  const char *zFrom;
+  const char *zFullName;
+  const char *zAssignedto;
+
+  Stmt q;
+  zUuid = PD("name", "");
+  zFrom = PD("rn", "");
+  
+  login_check_credentials();
+  
+  zFullName = db_text(0, 
+     "SELECT tkt_uuid FROM ticket"
+     " WHERE tkt_uuid GLOB '%q*'", zUuid);    
+
+  db_prepare(&q, "SELECT assignedto FROM ticket WHERE tkt_uuid=%Q", zFullName);
+  db_step(&q);
+  
+  zAssignedto = db_column_text(&q, 0);
+
+  if (strcmp(g.zLogin, zAssignedto) != 0){
+      cgi_redirect("home");
+  }
+  
+  db_prepare(&q, "UPDATE ticket SET assignedto='' WHERE tkt_uuid=%Q", 
zFullName);
+  
+  db_step(&q);
+  db_finalize(&q);  
+  cgi_redirectf("rptview?rn=%T", zFrom);
+}
+
+/*
 ** WEBPAGE: tktview
 ** URL:  tktview?name=UUID
 **
diff -rupN fossil_src_orig/src/tktsetup.c fossil/src/tktsetup.c
--- fossil_src_orig/src/tktsetup.c      2010-03-18 10:20:53.000000000 -0400
+++ fossil/src/tktsetup.c       2010-05-09 12:04:54.879214088 -0400
@@ -289,6 +289,17 @@ static const char zDefaultNew[] =
 @ affect the operation of the product?</td>
 @ </tr>
 @ 
+@ <th1>
+@ if {[hascap a]} {
+@ html "<tr>"
+@ html "<td align='right'>Assigned To:"
+@ html "<input type='text' name='assignedto' value=''>"
+@ html "</td>"
+@ html "<td>Should this issue be assigned to a particular developer?</td>"
+@ html "</tr>"
+@ }
+@ </th1>
+@
 @ <tr>
 @ <td align="right">EMail:
 @ <input type="text" name="private_contact" value="$<private_contact>" 
size="30">
@@ -377,8 +388,11 @@ static const char zDefaultView[] =
 @ </td></tr>
 @ <tr><td align="right">Severity:</td><td bgcolor="#d0d0d0">
 @ $<severity>
-@ </td>
-@ <td align="right">Priority:</td><td bgcolor="#d0d0d0">
+@ </td></tr>
+@ <tr><td align="right">Assigned:</td><td bgcolor="#d0d0d0">
+@ $<assignedto>
+@ </td></tr>
+@ <tr><td align="right">Priority:</td><td bgcolor="#d0d0d0">
 @ $<priority>
 @ </td></tr>
 @ <tr><td align="right">Subsystem:</td><td bgcolor="#d0d0d0">
@@ -464,6 +478,11 @@ static const char zDefaultEdit[] =
 @ <tr><td align="right">Severity:</td><td>
 @ <th1>combobox severity $severity_choices 1</th1>
 @ </td></tr>
+@ <th1>enable_output [hascap a]</th1>
+@ <tr><td align="right">Assigned To:</td><td>
+@ <input type='text' name='assignedto' value='$<assignedto>'>
+@ </td></tr>
+@ <th1>enable_output 1</th1>
 @ <tr><td align="right">Priority:</td><td>
 @ <th1>combobox priority $priority_choices 1</th1>
 @ </td></tr>

_______________________________________________
fossil-users mailing list
[email protected]
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to