| 1 | from trac.core import * |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | class CustomReportManager: |
|---|
| 5 | """A Class to manage custom reports""" |
|---|
| 6 | version = 1 |
|---|
| 7 | name = "custom_report_manager_version" |
|---|
| 8 | env = None |
|---|
| 9 | log = None |
|---|
| 10 | |
|---|
| 11 | def __init__(self, env, log): |
|---|
| 12 | self.env = env |
|---|
| 13 | self.log = log |
|---|
| 14 | self.upgrade() |
|---|
| 15 | |
|---|
| 16 | def upgrade(self): |
|---|
| 17 | # Check to see what version we have |
|---|
| 18 | db = self.env.get_db_cnx() |
|---|
| 19 | cursor = db.cursor() |
|---|
| 20 | cursor.execute("SELECT value FROM system WHERE name=%s", (self.name,)) |
|---|
| 21 | try: |
|---|
| 22 | version = int(cursor.fetchone()[0]) |
|---|
| 23 | except: |
|---|
| 24 | version = 0 |
|---|
| 25 | cursor.execute("INSERT INTO system (name,value) VALUES(%s,%s)", |
|---|
| 26 | (self.name, version)) |
|---|
| 27 | |
|---|
| 28 | if version > self.version: |
|---|
| 29 | raise TracError("Fatal Error: You appear to be running two plugins with conflicting versions " |
|---|
| 30 | "of the CustomReportManager class. Please ensure that '%s' is updated to " |
|---|
| 31 | "version %s of the file reportmanager.py (currently using version %s)." |
|---|
| 32 | % (__name__, str(version), str(self.version))) |
|---|
| 33 | |
|---|
| 34 | # Do the staged updates |
|---|
| 35 | try: |
|---|
| 36 | if version < 1: |
|---|
| 37 | cursor.execute("CREATE TABLE custom_report (" |
|---|
| 38 | "id INTEGER," |
|---|
| 39 | "uuid VARCHAR(64)," |
|---|
| 40 | "maingroup VARCHAR(255)," |
|---|
| 41 | "subgroup VARCHAR(255)," |
|---|
| 42 | "version INTEGER," |
|---|
| 43 | "ordering INTEGER)") |
|---|
| 44 | |
|---|
| 45 | #if version < 2: |
|---|
| 46 | # cursor.execute("...") |
|---|
| 47 | |
|---|
| 48 | # Updates complete, set the version |
|---|
| 49 | cursor.execute("UPDATE system SET value=%s WHERE name=%s", |
|---|
| 50 | (self.version, self.name)) |
|---|
| 51 | db.commit() |
|---|
| 52 | db.close() |
|---|
| 53 | |
|---|
| 54 | except Exception, e: |
|---|
| 55 | self.log.error("CustomReportManager Exception: %s" % (e,)); |
|---|
| 56 | db.rollback() |
|---|
| 57 | |
|---|
| 58 | def add_report(self, title, author, description, query, uuid, version, maingroup, subgroup=""): |
|---|
| 59 | # First check to see if we can load an existing version of this report |
|---|
| 60 | db = self.env.get_db_cnx() |
|---|
| 61 | cursor = db.cursor() |
|---|
| 62 | try: |
|---|
| 63 | cursor.execute("SELECT id, version FROM custom_report " |
|---|
| 64 | "WHERE uuid=%s", (uuid,)) |
|---|
| 65 | (id, currentversion) = cursor.fetchone() |
|---|
| 66 | except: |
|---|
| 67 | id = None |
|---|
| 68 | currentversion = 0 |
|---|
| 69 | |
|---|
| 70 | try: |
|---|
| 71 | if not id: |
|---|
| 72 | cursor.execute("SELECT MAX(id) FROM report") |
|---|
| 73 | next_id = int(cursor.fetchone()[0]) + 1 |
|---|
| 74 | self.log.debug("Inserting new report with uuid '%s'" % (uuid,)); |
|---|
| 75 | |
|---|
| 76 | # Get the ordering of any current reports in this group/subgroup. |
|---|
| 77 | try: |
|---|
| 78 | cursor.execute("SELECT MAX(ordering) FROM custom_report " |
|---|
| 79 | "WHERE maingroup=%s AND subgroup=%s", (maingroup, subgroup)) |
|---|
| 80 | ordering = int(cursor.fetchone()[0]) + 1 |
|---|
| 81 | except: |
|---|
| 82 | ordering = 0 |
|---|
| 83 | |
|---|
| 84 | cursor.execute("INSERT INTO report (id, title, author, description, query) " |
|---|
| 85 | "VALUES (%s, %s, %s, %s, %s)", |
|---|
| 86 | (next_id, title, author, description, query)) |
|---|
| 87 | cursor.execute("INSERT INTO custom_report (id, uuid, maingroup, subgroup, version, ordering) " |
|---|
| 88 | "VALUES (%s, %s, %s, %s, %s, %s)", |
|---|
| 89 | (next_id, uuid, maingroup, subgroup, version, ordering)) |
|---|
| 90 | db.commit() |
|---|
| 91 | db.close() |
|---|
| 92 | return True |
|---|
| 93 | if currentversion < version: |
|---|
| 94 | self.log.debug("Updating report with uuid '%s' to version %s" % (uuid,version)); |
|---|
| 95 | cursor.execute("UPDATE report SET title=%s, author=%s, description=%s, query=%s " |
|---|
| 96 | "WHERE id=%s", (title, author, description, query, id)) |
|---|
| 97 | cursor.execute("UPDATE custom_report SET version=%s, maingroup=%s, subgroup=%s " |
|---|
| 98 | "WHERE id=%s", (version, maingroup, subgroup, id)) |
|---|
| 99 | db.commit() |
|---|
| 100 | db.close() |
|---|
| 101 | return True |
|---|
| 102 | except Exception, e: |
|---|
| 103 | self.log.error("CustomReportManager Exception: %s" % (e,)); |
|---|
| 104 | db.rollback() |
|---|
| 105 | |
|---|
| 106 | return False |
|---|
| 107 | |
|---|
| 108 | def get_report_by_uuid(self, uuid): |
|---|
| 109 | db = self.env.get_db_cnx() |
|---|
| 110 | cursor = db.cursor() |
|---|
| 111 | rv = None |
|---|
| 112 | try: |
|---|
| 113 | cursor.execute("SELECT report.id,report.title FROM custom_report " |
|---|
| 114 | "LEFT JOIN report ON custom_report.id=report.id " |
|---|
| 115 | "WHERE custom_report.uuid=%s", (uuid,)) |
|---|
| 116 | row = cursor.fetchone() |
|---|
| 117 | rv = (row[0], row[1]) |
|---|
| 118 | except: |
|---|
| 119 | pass |
|---|
| 120 | |
|---|
| 121 | return rv |
|---|
| 122 | |
|---|
| 123 | def get_reports_by_group(self, group): |
|---|
| 124 | db = self.env.get_db_cnx() |
|---|
| 125 | cursor = db.cursor() |
|---|
| 126 | rv = {} |
|---|
| 127 | try: |
|---|
| 128 | cursor.execute("SELECT custom_report.subgroup,report.id,report.title " |
|---|
| 129 | "FROM custom_report " |
|---|
| 130 | "LEFT JOIN report ON custom_report.id=report.id " |
|---|
| 131 | "WHERE custom_report.maingroup=%s " |
|---|
| 132 | "ORDER BY custom_report.subgroup,custom_report.ordering", (group,)) |
|---|
| 133 | for subgroup,id,title in cursor: |
|---|
| 134 | if not rv.has_key(subgroup): |
|---|
| 135 | rv[subgroup] = { "title": subgroup, |
|---|
| 136 | "reports": [] } |
|---|
| 137 | rv[subgroup]["reports"].append( { "id": int(id), "title": title } ) |
|---|
| 138 | except: |
|---|
| 139 | pass |
|---|
| 140 | |
|---|
| 141 | return rv |
|---|
| 142 | |
|---|