Changeset 2349

Show
Ignore:
Timestamp:
06/28/07 09:23:54 (2 years ago)
Author:
bobbysmith007
Message:

TimingAndEstimationPlugin:

closes #1043

There is now a way to add custom reports to the management page. This is explained in the user manual (which is also upgraded in this version).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • timingandestimationplugin/branches/trac0.10/setup.py

    r2331 r2349  
    88      description='Plugin to make Trac support time estimation and tracking', 
    99      keywords='trac plugin estimation timetracking', 
    10       version='0.4.2', 
     10      version='0.4.3', 
    1111      url='', 
    1212      license='http://www.opensource.org/licenses/mit-license.php', 
     
    1919      """, 
    2020      packages=[PACKAGE], 
    21       package_data={PACKAGE : ['templates/*.cs', 'htdocs/*']}, 
     21      package_data={PACKAGE : ['templates/*.cs', 'htdocs/*', 'migrate/*.py']}, 
    2222      entry_points={'trac.plugins': '%s = %s' % (PACKAGE, PACKAGE)}) 
    2323 
  • timingandestimationplugin/branches/trac0.10/timingandestimationplugin/api.py

    r1840 r2349  
    8383            """ 
    8484            dbhelper.execute_non_query(self.env.get_db_cnx(), sql) 
    85         dbhelper.set_plugin_db_version(self.env.get_db_cnx); 
     85        dbhelper.migrate_up_to_version(self.env.get_db_cnx, dbhelper) 
     86        dbhelper.set_plugin_db_version(self.env.get_db_cnx) 
    8687     
    8788    def reports_need_upgrade(self): 
     
    9192            return True 
    9293         
    93         #make versions hash         
    94         _versions = dbhelper.get_result_set(self.env.get_db_cnx(), 
    95                                            """ 
    96                                            SELECT report as id, version, r.title as title 
    97                                            FROM report_version 
    98                                            JOIN report r ON r.Id = report_version.report 
    99                                            """) 
     94        #make versions hash 
     95        try: 
     96            _versions = dbhelper.get_result_set(self.env.get_db_cnx(),""" 
     97               SELECT report as id, version, r.title as title 
     98               FROM report_version 
     99               JOIN report r ON r.Id = report_version.report 
     100               WHERE tags LIKE '%T&E%' """) 
     101        except Exception: 
     102            return True; 
    100103        versions = {} 
     104 
     105        if _versions.rows == None: 
     106            return True 
     107 
    101108        for (id, version, title) in _versions.rows: 
    102109            versions[title] = (id, version) 
    103          
     110 
    104111             
    105112        for report_group in all_reports: 
     
    132139                                           FROM report_version 
    133140                                           JOIN report r ON r.Id = report_version.report 
     141                                           WHERE tags LIKE '%T&E%' 
    134142                                           """) 
    135143        versions = {} 
     
    139147        biggestId = dbhelper.get_scalar(self.env.get_db_cnx(), 
    140148                                        "SELECT ID FROM report ORDER BY ID DESC LIMIT 1") 
    141         def insert_report_version(id, ver): 
     149        def insert_report_version(id, ver, tag): 
    142150            sql = "DELETE FROM report_version WHERE report = %s;" 
    143151            dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id  ) 
    144152            sql = """ 
    145             INSERT INTO report_version (report, version
    146             VALUES (%s, %s);""" 
     153            INSERT INTO report_version (report, version, tags
     154            VALUES (%s, %s, %s);""" 
    147155            # print "about to insert report_version" 
    148             dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id, ver
     156            dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id, ver, tag
    149157            # print "inserted report_version" 
    150158             
    151159        for report_group in all_reports: 
    152160            rlist = report_group["reports"] 
     161            group_title = report_group["title"] 
     162            tag = "T&E %s" % group_title 
    153163            for report in rlist: 
    154164                title = report["title"] 
     
    164174                    dbhelper.execute_non_query(self.env.get_db_cnx(), sql, 
    165175                                               biggestId, title, report["sql"]) 
    166                     insert_report_version(biggestId, new_version
     176                    insert_report_version(biggestId, new_version, tag
    167177 
    168178                    report["reportnumber"] = biggestId 
     
    184194                        dbhelper.execute_non_query(self.env.get_db_cnx(), sql, 
    185195                                                   report["sql"], report_id ) 
    186                         insert_report_version( report_id, new_version
     196                        insert_report_version( report_id, new_version, tag
    187197                    elif ver < new_version: 
    188198                        sql = """ 
     
    196206                        sql = """ 
    197207                        UPDATE report_version 
    198                         SET version = %s 
     208                        SET version = %s, tags = %s 
     209                         
    199210                        WHERE report = %s 
    200211                        """ 
    201                         dbhelper.execute_non_query(self.env.get_db_cnx(), sql, new_version, report_id) 
     212                        dbhelper.execute_non_query(self.env.get_db_cnx(), sql, new_version, tag, report_id) 
    202213                         
    203214    def ticket_fields_need_upgrade(self): 
     
    303314 
    304315 
    305  
    306  
     316         
     317 
     318 
  • timingandestimationplugin/branches/trac0.10/timingandestimationplugin/dbhelper.py

    r1693 r2349  
    11db_version_key = 'TimingAndEstimationPlugin_Db_Version'; 
    2 db_version = 3 
     2db_version = 4 
    33mylog = None; 
    44 
     
    104104    return ResultSet(get_all(db, sql, *params)) 
    105105 
     106def migrate_up_to_version( db_fn, helper ): 
     107    try: 
     108        start = int(get_plugin_db_version(db_fn())) 
     109    except Exception: 
     110        start = 1 
     111    end = db_version 
     112    r = range( start+1, end+1) 
     113    import migrate 
     114    for i in  r: 
     115        key = "upgrade"+str(i) 
     116        try: 
     117            m = __import__("migrate."+key, globals(), locals(), ["up"]) 
     118            m.up(db_fn, helper) 
     119        except Exception, e: 
     120            print "no migration for %s %s %s "% (key, e.args, dir(e)) 
     121         
     122 
    106123class ResultSet: 
    107124    """ the result of calling getResultSet """ 
  • timingandestimationplugin/branches/trac0.10/timingandestimationplugin/reports.py

    r2331 r2349  
    99    "title":"Ticket Work Summary", 
    1010    "reportnumber":None, 
    11     "version":13
     11    "version":14
    1212    "sql":""" 
    1313SELECT __ticket__ as __group__, __style__, __ticket__, 
     
    5050    "title":"Milestone Work Summary", 
    5151    "reportnumber":None, 
    52     "version":12
     52    "version":13
    5353    "sql":""" 
    5454 
     
    9797    "title":"Developer Work Summary", 
    9898    "reportnumber":None, 
    99     "version":12
     99    "version":13
    100100    "sql":""" 
    101101SELECT author as __group__,__style__, ticket, 
     
    138138    "title": "Ticket Hours", 
    139139    "reportnumber": None, 
    140     "version":9
     140    "version":10
    141141    "sql": """ 
    142142SELECT __color__, __style__, ticket, summary, component ,version, severity, 
     
    207207    "title": "Ticket Hours with Description", 
    208208    "reportnumber": None, 
    209     "version":10
     209    "version":11
    210210    "sql": """ 
    211211SELECT __color__,  __style__,  ticket, summary, component ,version, severity, 
     
    285285    "title":"Ticket Hours Grouped By Component", 
    286286    "reportnumber":None, 
    287     "version":9
     287    "version":10
    288288    "sql": """ 
    289289SELECT __color__, __group__, __style__, ticket, summary, __component__ ,version, 
     
    365365    "title":"Ticket Hours Grouped By Component with Description", 
    366366    "reportnumber":None, 
    367     "version":8
     367    "version":9
    368368    "sql": """ 
    369369SELECT __color__, __group__, __style__,  ticket, summary, __component__ , 
     
    440440    "title":"Ticket Hours Grouped By Milestone", 
    441441    "reportnumber":None, 
    442     "version":9
     442    "version":10
    443443    "sql": """ 
    444444SELECT __color__, __group__, __style__,  ticket, summary, component ,version, 
     
    516516    "title":"Ticket Hours Grouped By MileStone with Description", 
    517517    "reportnumber":None, 
    518     "version":9
     518    "version":10
    519519    "sql": """ 
    520520SELECT __color__, __group__, __style__,  ticket, summary, component ,version, severity, 
  • timingandestimationplugin/branches/trac0.10/timingandestimationplugin/usermanual.py

    r2284 r2349  
    11user_manual_title = "Timing and Estimation Plugin User Manual" 
    2 user_manual_version = 8 
     2user_manual_version = 9 
    33user_manual_wiki_title = "TimingAndEstimationPluginUserManual" 
    44user_manual_content = """ 
     
    3737 
    3838== Reports == 
     39=== Report Types === 
    3940We provide a few different reports for querying different types of data: 
    4041    * '''Billing Reports''' Currently the billing reports are the only time based reports, and are therefore useful for getting an estimate what tickets had times (and totals), and which developers spent their time where. 
     
    4950       * Ticket Hours Grouped By Milestone 
    5051       * Ticket Hours Grouped By Milestone with Description 
     52=== Adding More Reports === 
     53To add reports to the Management screen sections, you must run the following sql against your trac database 
     54Remember to fill in the @reportID of the report you want to insert, and to select the insert statement for the section of your choice. 
     55 * '''INSERT INTO report_version (report, version, tags) VALUES ( @reportID , 1, 'Ticket/Hour Reports');''' 
     56 * '''INSERT INTO report_version (report, version, tags) VALUES ( @reportID , 1, 'Billing Reports');''' 
     57 
     58=== Removing a Report === 
     59To remove reports from the Management page, run the following query.  
     60Remember to fill in the @reportID of the report you want to insert, and to select the insert statement for the section of your choice. 
     61 * To remove for this version of the plugin (will be over written in future plugin upgrades) 
     62   * '''UPDATE report_version SET tags=!'' WHERE report = @reportID ;''' 
     63 * To remove permanently (wont be over written in future plugin upgrades) 
     64   * '''UPDATE report_version SET version=9999, tags=!'' WHERE report = @reportID ;''' 
     65 
     66=== TAKE NOTE === 
     67 '''The reports can only be called from the Management Page. They will not work from the Trac View Tickets page. (Due to the custom variables that need values).''' 
    5168 
    5269== Future Improvements == 
  • timingandestimationplugin/branches/trac0.10/timingandestimationplugin/webui.py

    r2291 r2349  
    2222        new_reports = [] 
    2323        sql = "SELECT id, title FROM report ORDER BY ID" 
    24         self.reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
     24        reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
    2525         
    2626        for report_group in all_reports: 
    2727            new_group = { "title" : report_group["title"] } 
    28             reports_list = report_group["reports"] 
     28            sql = """ 
     29            SELECT id, title 
     30            FROM report 
     31            JOIN report_version on report.id = report_version.report 
     32            WHERE tags LIKE '%%%s%%' 
     33            ORDER BY ID""" % report_group["title"] 
     34            reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
    2935            new_reports_list = [] 
    30             for report in reports_list: 
    31                 title = report["title"] 
     36             
     37            for (r_id, r_name) in reportmap: 
    3238                #find the report id for the name 
    33                 try: 
    34                     reportid = [r_id 
    35                                 for (r_id, r_name) in self.reportmap 
    36                                 if r_name == title][0] 
    37                  
    38                     new_report = {"title" : title, 
    39                                   "reportnumber" : reportid, 
    40                                   "href" : "%s/%s" % (req.href.report(), reportid)} 
    41                     new_reports_list.extend([ new_report ]) 
    42                 except: 
    43                     pass 
     39                new_report = {"title" : r_name, 
     40                              "reportnumber" : r_id, 
     41                              "href" : "%s/%s" % (req.href.report(), r_id)} 
     42                new_reports_list.extend([ new_report ]) 
    4443            new_group["reports"] = new_reports_list 
    4544            new_reports.extend([new_group]) 
  • timingandestimationplugin/branches/trac0.11/setup.py

    r2331 r2349  
    88      description='Plugin to make Trac support time estimation and tracking', 
    99      keywords='trac plugin estimation timetracking', 
    10       version='0.4.2', 
     10      version='0.4.3', 
    1111      url='http://trac-hacks.org/wiki/TimingAndEstimationPlugin', 
    1212      license='http://www.opensource.org/licenses/mit-license.php', 
     
    1919      """, 
    2020      packages=[PACKAGE], 
    21       package_data={PACKAGE : ['templates/*.html', 'htdocs/*']}, 
     21      package_data={PACKAGE : ['templates/*.cs', 'htdocs/*', 'migrate/*.py']}, 
    2222      entry_points={'trac.plugins': '%s = %s' % (PACKAGE, PACKAGE)}) 
    2323 
  • timingandestimationplugin/branches/trac0.11/timingandestimationplugin/api.py

    r2298 r2349  
    8484            """ 
    8585            dbhelper.execute_non_query(self.env.get_db_cnx(), sql) 
    86         dbhelper.set_plugin_db_version(self.env.get_db_cnx); 
     86        dbhelper.migrate_up_to_version(self.env.get_db_cnx, dbhelper) 
     87        dbhelper.set_plugin_db_version(self.env.get_db_cnx) 
    8788     
    8889    def reports_need_upgrade(self): 
     
    9293            return True 
    9394         
    94         #make versions hash         
    95         _versions = dbhelper.get_result_set(self.env.get_db_cnx(), 
    96                                            """ 
    97                                            SELECT report as id, version, r.title as title 
    98                                            FROM report_version 
    99                                            JOIN report r ON r.Id = report_version.report 
    100                                            """) 
     95        #make versions hash 
     96        try: 
     97            _versions = dbhelper.get_result_set(self.env.get_db_cnx(),""" 
     98               SELECT report as id, version, r.title as title 
     99               FROM report_version 
     100               JOIN report r ON r.Id = report_version.report 
     101               WHERE tags LIKE '%T&E%' """) 
     102        except Exception: 
     103            return True; 
    101104        versions = {} 
     105 
     106        if _versions.rows == None: 
     107            return True 
     108 
    102109        for (id, version, title) in _versions.rows: 
    103110            versions[title] = (id, version) 
    104          
     111 
    105112             
    106113        for report_group in all_reports: 
     
    133140                                           FROM report_version 
    134141                                           JOIN report r ON r.Id = report_version.report 
     142                                           WHERE tags LIKE '%T&E%' 
    135143                                           """) 
    136144        versions = {} 
     
    140148        biggestId = dbhelper.get_scalar(self.env.get_db_cnx(), 
    141149                                        "SELECT ID FROM report ORDER BY ID DESC LIMIT 1") 
    142         def insert_report_version(id, ver): 
     150        def insert_report_version(id, ver, tag): 
    143151            sql = "DELETE FROM report_version WHERE report = %s;" 
    144152            dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id  ) 
    145153            sql = """ 
    146             INSERT INTO report_version (report, version
    147             VALUES (%s, %s);""" 
     154            INSERT INTO report_version (report, version, tags
     155            VALUES (%s, %s, %s);""" 
    148156            # print "about to insert report_version" 
    149             dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id, ver
     157            dbhelper.execute_non_query(self.env.get_db_cnx(), sql, id, ver, tag
    150158            # print "inserted report_version" 
    151159             
    152160        for report_group in all_reports: 
    153161            rlist = report_group["reports"] 
     162            group_title = report_group["title"] 
     163            tag = "T&E %s" % group_title 
    154164            for report in rlist: 
    155165                title = report["title"] 
     
    165175                    dbhelper.execute_non_query(self.env.get_db_cnx(), sql, 
    166176                                               biggestId, title, report["sql"]) 
    167                     insert_report_version(biggestId, new_version
     177                    insert_report_version(biggestId, new_version, tag
    168178 
    169179                    report["reportnumber"] = biggestId 
     
    185195                        dbhelper.execute_non_query(self.env.get_db_cnx(), sql, 
    186196                                                   report["sql"], report_id ) 
    187                         insert_report_version( report_id, new_version
     197                        insert_report_version( report_id, new_version, tag
    188198                    elif ver < new_version: 
    189199                        sql = """ 
     
    197207                        sql = """ 
    198208                        UPDATE report_version 
    199                         SET version = %s 
     209                        SET version = %s, tags = %s 
     210                         
    200211                        WHERE report = %s 
    201212                        """ 
    202                         dbhelper.execute_non_query(self.env.get_db_cnx(), sql, new_version, report_id) 
     213                        dbhelper.execute_non_query(self.env.get_db_cnx(), sql, new_version, tag, report_id) 
    203214                         
    204215    def ticket_fields_need_upgrade(self): 
     
    304315 
    305316 
    306  
    307  
     317         
     318 
     319 
  • timingandestimationplugin/branches/trac0.11/timingandestimationplugin/dbhelper.py

    r1693 r2349  
    11db_version_key = 'TimingAndEstimationPlugin_Db_Version'; 
    2 db_version = 3 
     2db_version = 4 
    33mylog = None; 
    44 
     
    104104    return ResultSet(get_all(db, sql, *params)) 
    105105 
     106def migrate_up_to_version( db_fn, helper ): 
     107    try: 
     108        start = int(get_plugin_db_version(db_fn())) 
     109    except Exception: 
     110        start = 1 
     111    end = db_version 
     112    r = range( start+1, end+1) 
     113    import migrate 
     114    for i in  r: 
     115        key = "upgrade"+str(i) 
     116        try: 
     117            m = __import__("migrate."+key, globals(), locals(), ["up"]) 
     118            m.up(db_fn, helper) 
     119        except Exception, e: 
     120            print "no migration for %s %s %s "% (key, e.args, dir(e)) 
     121         
     122 
    106123class ResultSet: 
    107124    """ the result of calling getResultSet """ 
  • timingandestimationplugin/branches/trac0.11/timingandestimationplugin/reports.py

    r2331 r2349  
    99    "title":"Ticket Work Summary", 
    1010    "reportnumber":None, 
    11     "version":13
     11    "version":14
    1212    "sql":""" 
    1313SELECT __ticket__ as __group__, __style__, __ticket__, 
     
    5050    "title":"Milestone Work Summary", 
    5151    "reportnumber":None, 
    52     "version":12
     52    "version":13
    5353    "sql":""" 
    5454 
     
    9797    "title":"Developer Work Summary", 
    9898    "reportnumber":None, 
    99     "version":12
     99    "version":13
    100100    "sql":""" 
    101101SELECT author as __group__,__style__, ticket, 
     
    138138    "title": "Ticket Hours", 
    139139    "reportnumber": None, 
    140     "version":9
     140    "version":10
    141141    "sql": """ 
    142142SELECT __color__, __style__, ticket, summary, component ,version, severity, 
     
    207207    "title": "Ticket Hours with Description", 
    208208    "reportnumber": None, 
    209     "version":10
     209    "version":11
    210210    "sql": """ 
    211211SELECT __color__,  __style__,  ticket, summary, component ,version, severity, 
     
    285285    "title":"Ticket Hours Grouped By Component", 
    286286    "reportnumber":None, 
    287     "version":9
     287    "version":10
    288288    "sql": """ 
    289289SELECT __color__, __group__, __style__, ticket, summary, __component__ ,version, 
     
    365365    "title":"Ticket Hours Grouped By Component with Description", 
    366366    "reportnumber":None, 
    367     "version":8
     367    "version":9
    368368    "sql": """ 
    369369SELECT __color__, __group__, __style__,  ticket, summary, __component__ , 
     
    440440    "title":"Ticket Hours Grouped By Milestone", 
    441441    "reportnumber":None, 
    442     "version":9
     442    "version":10
    443443    "sql": """ 
    444444SELECT __color__, __group__, __style__,  ticket, summary, component ,version, 
     
    516516    "title":"Ticket Hours Grouped By MileStone with Description", 
    517517    "reportnumber":None, 
    518     "version":9
     518    "version":10
    519519    "sql": """ 
    520520SELECT __color__, __group__, __style__,  ticket, summary, component ,version, severity, 
  • timingandestimationplugin/branches/trac0.11/timingandestimationplugin/usermanual.py

    r2284 r2349  
    11user_manual_title = "Timing and Estimation Plugin User Manual" 
    2 user_manual_version = 8 
     2user_manual_version = 9 
    33user_manual_wiki_title = "TimingAndEstimationPluginUserManual" 
    44user_manual_content = """ 
     
    3737 
    3838== Reports == 
     39=== Report Types === 
    3940We provide a few different reports for querying different types of data: 
    4041    * '''Billing Reports''' Currently the billing reports are the only time based reports, and are therefore useful for getting an estimate what tickets had times (and totals), and which developers spent their time where. 
     
    4950       * Ticket Hours Grouped By Milestone 
    5051       * Ticket Hours Grouped By Milestone with Description 
     52=== Adding More Reports === 
     53To add reports to the Management screen sections, you must run the following sql against your trac database 
     54Remember to fill in the @reportID of the report you want to insert, and to select the insert statement for the section of your choice. 
     55 * '''INSERT INTO report_version (report, version, tags) VALUES ( @reportID , 1, 'Ticket/Hour Reports');''' 
     56 * '''INSERT INTO report_version (report, version, tags) VALUES ( @reportID , 1, 'Billing Reports');''' 
     57 
     58=== Removing a Report === 
     59To remove reports from the Management page, run the following query.  
     60Remember to fill in the @reportID of the report you want to insert, and to select the insert statement for the section of your choice. 
     61 * To remove for this version of the plugin (will be over written in future plugin upgrades) 
     62   * '''UPDATE report_version SET tags=!'' WHERE report = @reportID ;''' 
     63 * To remove permanently (wont be over written in future plugin upgrades) 
     64   * '''UPDATE report_version SET version=9999, tags=!'' WHERE report = @reportID ;''' 
     65 
     66=== TAKE NOTE === 
     67 '''The reports can only be called from the Management Page. They will not work from the Trac View Tickets page. (Due to the custom variables that need values).''' 
    5168 
    5269== Future Improvements == 
  • timingandestimationplugin/branches/trac0.11/timingandestimationplugin/webui.py

    r2298 r2349  
    2222        new_reports = [] 
    2323        sql = "SELECT id, title FROM report ORDER BY ID" 
    24         self.reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
     24        reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
    2525         
    2626        for report_group in all_reports: 
    2727            new_group = { "title" : report_group["title"] } 
    28             reports_list = report_group["reports"] 
     28            sql = """ 
     29            SELECT id, title 
     30            FROM report 
     31            JOIN report_version on report.id = report_version.report 
     32            WHERE tags LIKE '%%%s%%' 
     33            ORDER BY ID""" % report_group["title"] 
     34            reportmap = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 
    2935            new_reports_list = [] 
    30             for report in reports_list: 
    31                 title = report["title"] 
     36             
     37            for (r_id, r_name) in reportmap: 
    3238                #find the report id for the name 
    33                 try: 
    34                     reportid = [r_id 
    35                                 for (r_id, r_name) in self.reportmap 
    36                                 if r_name == title][0] 
    37                  
    38                     new_report = {"title" : title, 
    39                                   "reportnumber" : reportid, 
    40                                   "href" : "%s/%s" % (req.href.report(), reportid)} 
    41                     new_reports_list.extend([ new_report ]) 
    42                 except: 
    43                     pass 
     39                new_report = {"title" : r_name, 
     40                              "reportnumber" : r_id, 
     41                              "href" : "%s/%s" % (req.href.report(), r_id)} 
     42                new_reports_list.extend([ new_report ]) 
    4443            new_group["reports"] = new_reports_list 
    4544            new_reports.extend([new_group])