source: scrumburndownplugin/tags/1.9.1/burndown/dbhelper.py

Last change on this file was 5058, checked in by daan, 15 years ago

Release of version 1.9.1 of the Trac Scrum burndown plugin. See http://stuq.nl/weblog/2008-12-25/scrum-burndown-plugin-191-released for more information.

A new version of the Scrum Burndown plugin for Trac is released, bringing compatibility for PostgreSQL, MySQL, Trac 0.11.2.1, and many bug fixes. Upgrading is recommended.

New features
The Scrum burndown plugin is currently compatible and tested with Trac 0.10.5, Trac 0.11.1, Trac 0.11.2.1 Python 2.4 and Python 2.5. Additional to the previous SQLite compatibility, support for both PostgreSQL 8.3 and MySQL 5 has been added.

The following issues are fixed:

  • Fixes #1462 better control of milestone: a way to ‘reset’ a milestone
  • Fixes #1217 database upgrade fails after installing latest scrumburndownplugin
  • Fixes #2476 Error: ‘line_graph’ is undefined - stop graph from displaying
  • Fixes #1730 couldn’t upgrade
  • Fixes #2729 Error while running under PostgreSQL
  • Fixes #3102 burndown_job.py fails INSERT NULL id
  • Fixes #1909 Overshooting estimate reduces remaining effort while ticket is open
  • Fixes #1189 TracBurndown-01.05.10-py2.4.egg error
  • Fixes #1800 No chart when clicking Burndown chart button.
  • Fixes #4047 AttributeError: ‘NoneType’ object has no attribute ‘getValue’
  • Fixes #2224 Changing ticket component causes removal from burndown
  • Fixes #2562 Creating a new component breaks the burndown graphic for “All Components”
  • Fixes #4222 Install fails on mysql
  • Fixes #2218 ScrumBurndownPlugin, trac 0.10.4, mysql
File size: 5.8 KB
Line 
1from datetime import datetime
2import time
3
4
5from trac.core import ComponentManager
6from trac.db import Table, Column, Index, DatabaseManager
7
8burndown_table = Table('burndown', key=('id'))[Column('id', auto_increment=True),
9                                             Column('component_name'), 
10                                             Column('milestone_name'), 
11                                             Column('date'), 
12                                             Column('hours_remaining', type='int'), 
13                                             Index(['id'])]
14                           
15milestone_table = Table('milestone', key='name')[Column('name'),
16                                                 Column('due', type='int'),
17                                                 Column('completed', type='int'),
18                                                 Column('description'),
19                                                 Column('started', type='int')]
20
21def get_current_milestone(db, milestone_name):
22    cursor = db.cursor()
23    mile = None
24   
25    if milestone_name != None:
26        mile = get_milestone(db, milestone_name)
27       
28    if not mile:
29        cursor.execute("select name from milestone order by started desc, name limit 1")
30        milestone = cursor.fetchone()
31        if milestone:
32            mile = get_milestone(db, milestone[0])
33       
34    return mile
35
36def empty_db_for_testing(db):
37    cursor = db.cursor()
38    cursor.execute("delete from ticket_custom;")
39    cursor.execute("delete from ticket;")
40    cursor.execute("delete from burndown;")   
41    cursor.execute("update milestone set started=0, completed=0, due=0;")   
42    cursor.execute("update milestone set due=%s where name='milestone1';", [time.time() + 3600*24*7])   
43    db.commit()
44   
45def get_milestone(db, milestone):
46    cursor = db.cursor()
47    cursor.execute("SELECT name, due, completed, started, description FROM milestone WHERE name = %s", [milestone])
48    mile = cursor.fetchone()
49    if mile != None:
50        return {'name': mile[0], 'due': mile[1], 'completed': mile[2], 'started': mile[3], 'description': mile[4]}
51    else:
52        return None
53           
54def get_milestones(db):
55    cursor = db.cursor()
56    cursor.execute("SELECT name, due, completed, started, description FROM milestone order by name")
57    milestone_lists = cursor.fetchall()
58    milestones = []
59    for mile in milestone_lists:
60        milestones.append({'name': mile[0], 'due': mile[1], 'completed': mile[2], 'started': mile[3], 'description': mile[4]})
61    return milestones
62           
63def get_components(db):
64    cursor = db.cursor()
65    cursor.execute("SELECT name, owner, description FROM component")
66    component_lists = cursor.fetchall()
67    components = []
68    for comp in component_lists:
69        components.append({'name': comp[0], 'owner': comp[1], 'description': comp[2]})
70    return components
71       
72def table_exists(db, table_name):
73    cursor = db.cursor()
74    try:
75        cursor.execute("SELECT * FROM %s" % table_name)
76    except:
77        cursor.connection.rollback()
78        return False
79    return True
80       
81def table_field_exists(db, table_name, field_name):
82    cursor = db.cursor()
83    try:
84        cursor.execute("SELECT %s FROM %s" % (field_name, table_name))
85    except:
86        cursor.connection.rollback()
87        return False
88    return True
89       
90def get_startdate_for_milestone(db, milestone):
91    cursor = db.cursor()
92    cursor.execute("SELECT started FROM milestone WHERE name = %s", [milestone])
93    row = cursor.fetchone()
94
95    if(row and row[0]!=0):
96        return datetime.fromtimestamp(row[0])
97    else:
98        return None
99
100def set_startdate_for_milestone(db, milestone, startdate):
101    cursor = db.cursor()
102    try:
103        cursor.execute("UPDATE milestone SET started = %s WHERE name = %s", [startdate, milestone])
104    except Exception, e:
105        print "Error while updating milestone start date, %s" % (e)
106        db.rollback();
107        return
108    db.commit()
109
110def create_burndown_table(db, env):
111    cursor = db.cursor()
112   
113    db_backend, _ = DatabaseManager(env)._get_connector()
114    for stmt in db_backend.to_sql(burndown_table):
115        try:
116            cursor.execute(stmt)
117        except Exception, e:
118            print "Upgrade failed\nSQL:\n%s\nError message: %s" % (stmt, e)
119            db.rollback();
120            return
121    db.commit()
122   
123def upgrade_burndown_table(db, env):
124    cursor = db.cursor()
125
126    try:
127        cursor.execute("CREATE TEMPORARY TABLE burndown_old as SELECT * FROM burndown;")
128        cursor.execute("DROP TABLE burndown;")
129   
130        db_backend, _ = DatabaseManager(env)._get_connector()
131        for stmt in db_backend.to_sql(burndown_table):
132            cursor.execute(stmt)
133   
134        cursor.execute("""INSERT INTO burndown (id, component_name, milestone_name, date, hours_remaining)
135                          SELECT id, component_name, milestone_name, date, hours_remaining FROM burndown_old;""")
136
137        db.commit()
138    except Exception, e:
139        print "Upgrade of the Burndown plugin failed\nError message: %s" % (e)
140        db.rollback();
141        return
142   
143
144def upgrade_milestone_table(db, env):
145    cursor = db.cursor()
146
147    try:
148        cursor.execute("CREATE TEMPORARY TABLE milestone_old as SELECT * FROM milestone;")
149        cursor.execute("DROP TABLE milestone;")
150   
151        db_backend, _ = DatabaseManager(env)._get_connector()
152        for stmt in db_backend.to_sql(milestone_table):
153            cursor.execute(stmt)
154   
155        cursor.execute("""INSERT INTO milestone(name, due, completed, started, description)
156                          SELECT name, due, completed, 0, description FROM milestone_old;""")
157       
158        db.commit()
159    except Exception, e:
160        print "Upgrade of the Burndown plugin failed\nError message: %s" % (e)
161        db.rollback();
162        return
163
Note: See TracBrowser for help on using the repository browser.