source: scrumburndownplugin/trunk/burndown/dbhelper.py @ 13148

Last change on this file since 13148 was 13148, checked in by Ryan J Ollos, 11 years ago

Refs #7066, #11069:

  • Removed Trac pre-0.11 compatibility code.
  • Changed module names to follow Trac naming conventions.
  • Updated source file headers and added where missing.

Note: If you enabled the plugin through the web admin, or by providing the full module name, you'll need to re-enable the plugin or edit the [components] section:

burndown.burndown_admin_milestones.burndownmilestonesadminpanel = enabled
burndown.burndown.burndowncomponent = enabled

->

burndown.admin.burndownadminpanel = enabled
burndown.burndown.burndownmodule = enabled
File size: 5.9 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2006 Sam Bloomquist <spooninator@hotmail.com>
4# Copyright (C) 2006-2008 Daan van Etten <daan@stuq.nl>
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution.
9#
10
11from datetime import datetime
12import time
13
14from trac.db import Column, DatabaseManager, Index, Table
15
16burndown_table = Table('burndown', key='id')[
17    Column('id', auto_increment=True),
18    Column('component_name'),
19    Column('milestone_name'),
20    Column('date'),
21    Column('hours_remaining', type='int'),
22    Index(['id'])]
23
24milestone_table = Table('milestone', key='name')[Column('name'),
25                                                 Column('due', type='int'),
26                                                 Column('completed',
27                                                        type='int'),
28                                                 Column('description'),
29                                                 Column('started', type='int')]
30
31
32def get_current_milestone(db, milestone_name):
33    cursor = db.cursor()
34    mile = None
35
36    if milestone_name is not None:
37        mile = get_milestone(db, milestone_name)
38
39    if not mile:
40        cursor.execute(
41            "select name from milestone order by started desc, name limit 1")
42        milestone = cursor.fetchone()
43        if milestone:
44            mile = get_milestone(db, milestone[0])
45
46    return mile
47
48
49def empty_db_for_testing(db):
50    cursor = db.cursor()
51    cursor.execute("delete from ticket_custom")
52    cursor.execute("delete from ticket")
53    cursor.execute("delete from burndown")
54    cursor.execute("update milestone set started=0, completed=0, due=0")
55    cursor.execute("update milestone set due=%s where name='milestone1'",
56                   [time.time() + 3600 * 24 * 7])
57    db.commit()
58
59
60def get_milestone(db, milestone):
61    cursor = db.cursor()
62    cursor.execute("""
63        SELECT name, due, completed, started, description
64        FROM milestone WHERE name = %s""", (milestone,))
65    mile = cursor.fetchone()
66    if mile is not None:
67        return {'name': mile[0], 'due': mile[1], 'completed': mile[2],
68                'started': mile[3], 'description': mile[4]}
69    else:
70        return None
71
72
73def get_milestones(db):
74    cursor = db.cursor()
75    cursor.execute("""
76        SELECT name, due, completed, started, description
77        FROM milestone order by name""")
78    milestone_lists = cursor.fetchall()
79    milestones = []
80    for mile in milestone_lists:
81        milestones.append(
82            {'name': mile[0], 'due': mile[1], 'completed': mile[2],
83             'started': mile[3], 'description': mile[4]})
84    return milestones
85
86
87def get_components(db):
88    cursor = db.cursor()
89    cursor.execute("SELECT name, owner, description FROM component")
90    component_lists = cursor.fetchall()
91    components = []
92    for comp in component_lists:
93        components.append(
94            {'name': comp[0], 'owner': comp[1], 'description': comp[2]})
95    return components
96
97
98def table_exists(db, table_name):
99    cursor = db.cursor()
100    try:
101        cursor.execute("SELECT * FROM %s" % table_name)
102    except:
103        cursor.connection.rollback()
104        return False
105    return True
106
107
108def table_field_exists(db, table_name, field_name):
109    cursor = db.cursor()
110    try:
111        cursor.execute("SELECT %s FROM %s" % (field_name, table_name))
112    except:
113        cursor.connection.rollback()
114        return False
115    return True
116
117
118def get_startdate_for_milestone(db, milestone):
119    cursor = db.cursor()
120    cursor.execute("SELECT started FROM milestone WHERE name = %s",
121                   (milestone,))
122    row = cursor.fetchone()
123    if row and row[0]:
124        return datetime.fromtimestamp(row[0])
125    else:
126        return None
127
128
129def set_startdate_for_milestone(db, milestone, startdate):
130    cursor = db.cursor()
131    try:
132        cursor.execute("UPDATE milestone SET started = %s WHERE name = %s",
133                       [startdate, milestone])
134    except Exception, e:
135        print "Error while updating milestone start date, %s" % e
136        db.rollback()
137        return
138    db.commit()
139
140
141def create_burndown_table(db, env):
142    cursor = db.cursor()
143
144    db_backend, _ = DatabaseManager(env)._get_connector()
145    for stmt in db_backend.to_sql(burndown_table):
146        try:
147            cursor.execute(stmt)
148        except Exception, e:
149            print "Upgrade failed\nSQL:\n%s\nError message: %s" % (stmt, e)
150            db.rollback()
151            return
152    db.commit()
153
154
155def upgrade_burndown_table(db, env):
156    cursor = db.cursor()
157
158    try:
159        cursor.execute(
160            "CREATE TEMPORARY TABLE burndown_old as SELECT * FROM burndown")
161        cursor.execute("DROP TABLE burndown")
162
163        db_backend, _ = DatabaseManager(env)._get_connector()
164        for stmt in db_backend.to_sql(burndown_table):
165            cursor.execute(stmt)
166
167        cursor.execute("""
168            INSERT INTO burndown (id, component_name, milestone_name,
169              date, hours_remaining)
170            SELECT id, component_name, milestone_name, date, hours_remaining
171            FROM burndown_old""")
172
173        db.commit()
174    except Exception, e:
175        print "Upgrade of the Burndown plugin failed\nError message: %s" % e
176        db.rollback()
177        return
178
179
180def upgrade_milestone_table(db, env):
181    cursor = db.cursor()
182
183    try:
184        cursor.execute(
185            "CREATE TEMPORARY TABLE milestone_old as SELECT * FROM milestone")
186        cursor.execute("DROP TABLE milestone")
187
188        db_backend, _ = DatabaseManager(env)._get_connector()
189        for stmt in db_backend.to_sql(milestone_table):
190            cursor.execute(stmt)
191
192        cursor.execute("""
193            INSERT INTO milestone(name, due, completed, started, description)
194            SELECT name, due, completed, 0, description FROM milestone_old""")
195
196        db.commit()
197    except Exception, e:
198        print "Upgrade of the Burndown plugin failed\nError message: %s" % e
199        db.rollback()
200        return
Note: See TracBrowser for help on using the repository browser.