Changeset 638


Ignore:
Timestamp:
10/22/08 16:10:58 (5 years ago)
Author:
rcorsaro
Message:

added warehouse functionality to oforge api and console.

Location:
trunk/plugins/oforgeplugin
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/oforgeplugin/oforge/api.py

    r637 r638  
    7070        props['port'] = \ 
    7171                self.config.get('oforge', 'master_warehouse.port', None) 
     72        props['schema'] = \ 
     73                self.config.get('oforge', 'master_warehouse.schema', None) 
    7274        return props 
    7375 
     
    101103        thepath = path.join(base, name) 
    102104        env = Environment(thepath) 
    103         return  env 
     105        return env 
    104106 
    105107    def getconfig(self, name): 
     
    149151        return ("workspace_%s"%(re.sub('(\W+)', '', name))).lower() 
    150152 
     153    def reload_warehouse_tickets(self, name): 
     154        env = self.getenv(name) 
     155        proj_id = self.config.get('oforge', 'proj_id') 
     156        if proj_id: 
     157            project = Project.objects.filter(id=proj_id) 
     158            tickets = Ticket.objects.filter(project=project) 
     159            tickets.delete() 
     160            for row in cursor.fetchall(): 
     161                t = Ticket.new( 
     162                        project=project, 
     163                        ticket_id=row.id, 
     164                        type=row.type, 
     165                        time=int(row.time), 
     166                        changetime=int(row.changetime), 
     167                        component=row.component, 
     168                        severity=row.severity, 
     169                        priority=row.priority, 
     170                        owner=row.owner, 
     171                        report=row.report, 
     172                        cc=row.cc, 
     173                        version=row.version, 
     174                        milestone=row.milestone, 
     175                        resolution=row.resolution, 
     176                        summary=row.summary, 
     177                        description=row.description, 
     178                        keyword=row.keyword, 
     179                        status=row.status) 
     180                t.save() 
     181 
     182    def warehouse_project(self, name): 
     183        env = self.getenv(name) 
     184        proj_id = env.config.get('oforge', 'proj_id') 
     185        if proj_id: 
     186            fields = ('type', 'time', 'changetime', 'component', 'severity',  
     187                'priority', 'owner', 'reporter', 'cc', 'version', 'milestone',  
     188                'resolution', 'summary', 'description', 'keywords', 'status') 
     189            names = ','.join(fields) 
     190            values = ','.join(map(lambda f: "new.%s"%(f), fields)) 
     191            setters = ','.join(map(lambda f: "%s = new.%s"%(f,f), fields)) 
     192            db_cnx = env.get_db_cnx() 
     193            db_conn_str = env.config.get('trac', 'database') 
     194            conn_regex = re.compile('^postgres://([^:]+):') 
     195            db_user = conn_regex.match(db_conn_str).group(1) 
     196            workspace_prefix = self._canonize_schema_name(name) 
     197            project = Project.objects.filter(id=proj_id) 
     198            wh_db_cnx = self.warehouse_db_cnx() 
     199            try: 
     200                wh_cursor = wh_db_cnx.cursor() 
     201                cursor = db_cnx.cursor() 
     202                schema = env.config.get('oforge', 'postgres_schema') 
     203                wh_schema = self.config.get('oforge', 'master_warehouse.schema', 'public') 
     204                wh_cursor.execute("""GRANT USAGE ON  
     205                        schema %s TO %s"""%(wh_schema, db_user)) 
     206                wh_cursor.execute("""GRANT INSERT,DELETE,UPDATE ON  
     207                        projects_ticket TO %s"""%(db_user)) 
     208                wh_cursor.execute("""GRANT UPDATE,SELECT ON  
     209                        projects_ticket_id_seq TO %s"""%(db_user)) 
     210                if not re.match('(.*, ?)?%s($|,)'%(wh_schema), schema): 
     211                    # Add warehouse schema to the path if it's not added already 
     212                    wh_cursor.execute("""ALTER USER %s SET search_path TO %s, %s  
     213                            """%(db_user, schema, wh_schema)) 
     214                    cursor.execute("SET search_path TO %s, %s"%(schema, wh_schema)) 
     215                wh_db_cnx.commit() 
     216                cursor.execute(""" 
     217                    CREATE OR REPLACE RULE %s_update_ticket  
     218                    AS ON UPDATE TO ticket  
     219                    DO ALSO UPDATE projects_ticket  
     220                      SET %s  
     221                      WHERE ticket_id = old.id AND 
     222                        project_id = %s"""%(workspace_prefix, setters,  
     223                            proj_id)) 
     224                cursor.execute(""" 
     225                    CREATE OR REPLACE RULE %s_insert_ticket  
     226                    AS ON INSERT TO ticket  
     227                    DO ALSO  
     228                      INSERT INTO projects_ticket (project_id, ticket_id, %s) 
     229                          VALUES(%s, currval('ticket_id_seq'::text), %s) 
     230                    """%(workspace_prefix, names, proj_id, values)) 
     231                cursor.execute(""" 
     232                    CREATE OR REPLACE RULE %s_delete_ticket  
     233                    AS ON DELETE TO ticket  
     234                    DO ALSO DELETE FROM projects_ticket  
     235                      WHERE ticket_id = old.id AND 
     236                        project_id = %s"""%(workspace_prefix, proj_id)) 
     237                cursor.execute("SELECT * FROM ticket") 
     238                db_cnx.commit() 
     239            except Exception, e: 
     240                db_cnx.rollback() 
     241                wh_db_cnx.rollback() 
     242                raise 
     243            self.reload_warehouse_tickets(name) 
     244 
    151245    def converttopostgres(self, name): 
    152246        """ 
     
    167261        config.set('trac', 'database',  
    168262                self._get_postgres_url(new_user_schema_name, new_password)) 
     263        config.set('oforge', 'postgres_schema', new_user_schema_name) 
    169264        config.save() 
    170265        new_env = self.getenv(name) 
  • trunk/plugins/oforgeplugin/oforge/console.py

    r525 r638  
    205205        oforge.converttopostgres(proj) 
    206206 
     207def warehouse_project(): 
     208    _init_oforge_logger() 
     209 
     210    usage = "%prog [options] workspace-shortname  \n - Adds project to data warehouse." 
     211    parser = OptionParser(usage) 
     212 
     213    parser.set_defaults(master_trac_ini=_get_master_trac_ini()) 
     214 
     215    parser.add_option("--master-trac-ini", dest="master_trac_ini", 
     216        help="Master trac ini that describes project locations.") 
     217    (opts, args) = parser.parse_args() 
     218    proj = args[0] 
     219    if proj: 
     220        oforge = OForge(opts.master_trac_ini) 
     221        oforge.warehouse_project(proj) 
     222 
    207223def add_to_dashboard(): 
    208224    _init_oforge_logger() 
  • trunk/plugins/oforgeplugin/setup.py

    r508 r638  
    4040          'oforge-convert-to-postgres = oforge.console:convert_to_postgres', 
    4141          'oforge-add-to-dashboard = oforge.console:add_to_dashboard', 
    42           'oforge-remove-from-dashboard = oforge.console:remove_from_dashboard' 
     42          'oforge-remove-from-dashboard = oforge.console:remove_from_dashboard', 
     43          'oforge-warehouse-project = oforge.console:warehouse_project' 
    4344      ]},  
    4445      zip_safe=True, 
Note: See TracChangeset for help on using the changeset viewer.