Changeset 3525

Show
Ignore:
Timestamp:
04/17/08 05:13:57 (8 months ago)
Author:
richard
Message:

version 0.5

  • use db to store template texts
  • add permission TT_ADMIN
  • add upgrades.py
  • add model.py
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/En/setup.py

    r3138 r3525  
    33setup( 
    44    name = 'TracTicketTemplate', 
    5     version = '0.3', 
     5    version = '0.5', 
    66    packages = ['tickettemplate'], 
    77    package_data = { 'tickettemplate': [ '*.txt', 'templates/*.*', 'htdocs/*.*', 'tests/*.*' ] }, 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/En/tickettemplate/changelog.txt

    r3524 r3525  
     1TicketTemplate 0.5 (April 11, 2008) 
     2 
     3 * use trac db to store all templates data 
     4 * implement history manipulation feature 
     5 * implement upgrade template data from old version 
     6 
    17TicketTemplate 0.4 (Mar 25, 2008) 
    28 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/En/tickettemplate/templates/admin_tickettemplate.cs

    r3524 r3525  
    1010 
    1111 
    12 <form id="savetickettemplate" method="post"> 
     12<form id="savetickettemplate" action="tickettemplate" method="post"> 
    1313 
    1414  <div class="field"><label for="type">Type:</label> <?cs 
    1515   call:hdf_select(options, 'type', type, 0) ?> 
    1616    <input type="submit" name="loadtickettemplate" value=" Load " /> 
     17    <input type="submit" name="loadhistory" value=" History " /> 
    1718    <input type="submit" name="savetickettemplate" value=" Apply changes " /> 
    1819    <input type="reset" value=" Reset " />   
     
    3839 <div class="buttons"> 
    3940  <input type="submit" name="preview" value="preview" accesskey="r" />&nbsp; 
    40   <input type="submit" value="submit" /> 
    4141 </div> 
    4242   
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/En/tickettemplate/ttadmin.py

    r3524 r3525  
    99 
    1010from trac.core import * 
     11from trac.db import DatabaseManager 
    1112from trac.util.html import html 
    1213from trac.web import IRequestHandler 
     
    1415from trac.web.chrome import * 
    1516from trac.wiki import wiki_to_html, wiki_to_oneliner 
     17from trac.perm import IPermissionRequestor 
    1618 
    1719from trac.ticket import Milestone, Ticket, TicketSystem, ITicketManipulator 
     
    2527import os 
    2628import pickle 
     29import inspect 
     30import time 
     31import textwrap 
     32 
     33from tickettemplate.model import schema, schema_version, TT_Template 
     34from default_templates import DEFAULT_TEMPLATES 
    2735 
    2836__all__ = ['TicketTemplateModule'] 
     
    3543               INavigationContributor,  
    3644               IRequestHandler,  
    37 #               IEnvironmentSetupParticipant,  
     45               IEnvironmentSetupParticipant,  
     46               IPermissionRequestor, 
    3847               ) 
    3948 
     49    # IPermissionRequestor methods 
     50 
     51    def get_permission_actions(self): 
     52        actions = ['TT_ADMIN'] 
     53        return actions 
     54 
    4055    # IEnvironmentSetupParticipant methods 
    4156 
    42 #    def environment_created(self): 
    43 #        """Create the `site_newticket.cs` template file in the environment.""" 
    44 #        if self.env.path: 
    45 #            templates_dir = os.path.join(self.env.path, 'templates') 
    46 #            if not os.path.exists(templates_dir): 
    47 #                os.mkdir(templates_dir) 
    48 #            template_name = os.path.join(templates_dir, 'site_newticket.cs') 
    49 #            template_file = file(template_name, 'w') 
    50 #            template_file.write("""<?cs 
    51 ##################################################################### 
    52 ## New ticket prelude - Included directly above the new ticket form 
    53 #?> 
    54 #""") 
    55 
    56 #    def environment_needs_upgrade(self, db): 
    57 #        return False 
    58 
    59 #    def upgrade_environment(self, db): 
    60 #        pass 
    61  
     57    def environment_created(self): 
     58        # Create the required tables 
     59        db = self.env.get_db_cnx() 
     60        connector, _ = DatabaseManager(self.env)._get_connector() 
     61        cursor = db.cursor() 
     62        for table in schema: 
     63            for stmt in connector.to_sql(table): 
     64                cursor.execute(stmt) 
     65 
     66        # Insert a global version flag 
     67        cursor.execute("INSERT INTO system (name,value) " 
     68                       "VALUES ('tt_version',%s)", (schema_version,)) 
     69 
     70        # Create some default templates 
     71        for tt_name, tt_text in DEFAULT_TEMPLATES: 
     72            TT_Template.insert(self.env, tt_name, tt_text, 0) 
     73         
     74        db.commit() 
     75 
     76    def environment_needs_upgrade(self, db): 
     77        cursor = db.cursor() 
     78        cursor.execute("SELECT value FROM system WHERE name='tt_version'") 
     79        row = cursor.fetchone() 
     80        if not row or int(row[0]) < schema_version: 
     81            return True 
     82 
     83    def upgrade_environment(self, db): 
     84        cursor = db.cursor() 
     85        cursor.execute("SELECT value FROM system WHERE name='tt_version'") 
     86        row = cursor.fetchone() 
     87        if not row: 
     88            self.environment_created() 
     89            current_version = 0 
     90        else:     
     91            current_version = int(row[0]) 
     92             
     93        from tickettemplate import upgrades 
     94        for version in range(current_version + 1, schema_version + 1): 
     95            for function in upgrades.map.get(version): 
     96                print textwrap.fill(inspect.getdoc(function)) 
     97                function(self.env, db) 
     98                print 'Done.' 
     99        cursor.execute("UPDATE system SET value=%s WHERE " 
     100                       "name='tt_version'", (schema_version,)) 
     101        self.log.info('Upgraded tt tables from version %d to %d', 
     102                      current_version, schema_version) 
    62103 
    63104    # INavigationContributor methods 
     
    115156 
    116157    def process_admin_request(self, req, cat, page, path_info): 
    117         req.perm.assert_permission('TRAC_ADMIN') 
     158        req.perm.assert_permission('TT_ADMIN') 
    118159         
    119160        req.hdf['options'] = self._getTicketTypeNames() 
    120161        req.hdf['type'] = req.args.get('type') 
    121162 
    122         if req.method == 'POST': 
    123 #            tt_file_name = "description_%s.tmpl" % req.args.get('type') 
    124 #            tt_file_name_default = "description_%s.tmpl" % "default" 
    125 #             
    126 #            tt_file = os.path.join(self.env.path, "templates", tt_file_name) 
    127 #            tt_file_default = os.path.join(self.env.path, "templates", tt_file_name_default) 
     163         
     164        if req.args.has_key("id"): 
     165            # after load history 
     166            id = req.args.get("id") 
     167            req.hdf['tt_text'] = self._loadTemplateTextById(id) 
     168            req.hdf['type'] = self._getNameById(id) 
     169 
     170         
     171        elif req.method == 'POST': 
    128172 
    129173            # Load 
     
    132176 
    133177                req.hdf['tt_text'] = self._loadTemplateText(tt_name) 
     178 
     179            # Load history 
     180            if req.args.get('loadhistory'): 
     181                tt_name = req.args.get('type') 
     182                 
     183                req.hdf['tt_name'] = tt_name 
     184                 
     185                tt_history = [] 
     186                for id,modi_time,tt_name,tt_text in TT_Template.selectByName(self.env, tt_name): 
     187                    history = {} 
     188                    history["id"] = id 
     189                    history["tt_name"] = tt_name 
     190                    history["modi_time"] = self._formatTime(int(modi_time)) 
     191                    history["tt_text"] = tt_text 
     192                    history["href"] = req.abs_href.admin(cat, page, {"id":id}) 
     193                    tt_history.append(history) 
     194                 
     195                req.hdf['tt_history'] = tt_history 
     196                                 
     197                return 'loadhistory.cs', None 
    134198 
    135199            # Save 
     
    141205                req.hdf['tt_text'] = tt_text 
    142206                 
    143             # Save 
     207            # preview 
    144208            elif req.args.get('preview'): 
    145209                tt_text = req.args.get('description').replace('\r', '') 
     
    183247     
    184248    # private methods 
    185     def _getTTFilePath(self): 
    186         """ get ticket template file path 
    187         """ 
    188         return os.path.join(self.env.path, "templates", "description.tmpl") 
    189  
    190     def _loadTTDict(self): 
    191         """ load ticket template dict from file. 
    192         """ 
    193         tt_file = self._getTTFilePath() 
    194  
    195         try: 
    196             fp = open(tt_file,'rb') 
    197             tt_stream = fp.read() 
    198             fp.close() 
    199         except: 
    200             tt_stream = "" 
    201  
    202         try: 
    203             tt_dict = pickle.loads(tt_stream) 
    204         except: 
    205             tt_dict = {} 
    206  
    207         return tt_dict 
    208      
     249 
    209250    def _loadTemplateText(self, tt_name): 
    210251        """ get tempate text from tt_dict. 
    211             return tt_text if found in tt_dict 
     252            return tt_text if found in db 
    212253                or default tt_text if exists 
    213254                or empty string if default not exists. 
    214255        """ 
    215         tt_dict = self._loadTTDict() 
    216         return tt_dict.get(tt_name, tt_dict.get("default", "")) 
     256        tt_text = TT_Template.fetch(self.env, tt_name) 
     257        if not tt_text: 
     258            tt_text = TT_Template.fetch(self.env, "default") 
     259         
     260        return tt_text 
     261 
     262    def _getNameById(self, id): 
     263        """ get tempate name from tt_dict. 
     264        """ 
     265        tt_name = TT_Template.getNameById(self.env, id) 
     266         
     267        return tt_name         
     268         
     269         
     270    def _loadTemplateTextById(self, id): 
     271        """ get tempate text from tt_dict. 
     272        """ 
     273        tt_text = TT_Template.fetchById(self.env, id) 
     274         
     275        return tt_text         
    217276         
    218277    def _saveTemplateText(self, tt_name, tt_text): 
    219         """ save ticket template text to file. 
    220         """ 
    221         # dump tt_dict 
    222         tt_dict = self._loadTTDict() 
    223         tt_dict[tt_name] = tt_text 
    224         tt_stream = pickle.dumps(tt_dict) 
    225          
    226         tt_file = self._getTTFilePath() 
    227         try: 
    228             fp = open(tt_file,'wb') 
    229         except: 
    230             raise TracError("Can't write ticket template file %s" % tt_file) 
    231         else: 
    232             fp.write(tt_stream) 
    233             fp.close() 
     278        """ save ticket template text to db. 
     279        """ 
     280         
     281        id = TT_Template.insert(self.env, tt_name, tt_text, time.time()) 
     282        return id 
    234283 
    235284    def _getTicketTypeNames(self): 
     
    247296        return options 
    248297 
     298    def _formatTime(self, modi_time): 
     299        """ 
     300        """ 
     301        return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(modi_time)) 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/En/tickettemplate/version.txt

    r3524 r3525  
    1 0.4 
     10.5 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/Zh/setup.py

    r3138 r3525  
    33setup( 
    44    name = 'TracTicketTemplate', 
    5     version = '0.3', 
     5    version = '0.5', 
    66    packages = ['tickettemplate'], 
    77    package_data = { 'tickettemplate': [ '*.txt', 'templates/*.*', 'htdocs/*.*', 'tests/*.*' ] }, 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/Zh/tickettemplate/changelog.txt

    r3524 r3525  
     1TicketTemplate 0.5 (April 11, 2008) 
     2 
     3 * use trac db to store all templates data 
     4 * implement history manipulation feature 
     5 * implement upgrade template data from old version 
     6 
    17TicketTemplate 0.4 (Mar 25, 2008) 
    28 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/Zh/tickettemplate/templates/admin_tickettemplate.cs

    r3524 r3525  
    1616    <input type="submit" name="loadtickettemplate" value=" 蜜å 
    1717¥æš¡æ¿ " /> 
     18    <input type="submit" name="loadhistory" value=" 蜜å 
     19¥åŽ†å² " /> 
    1820    <input type="submit" name="savetickettemplate" value=" 应甚修改 " /> 
    1921    <input type="reset" value=" 重眮 " />   
     
    3840 <div class="buttons"> 
    3941  <input type="submit" name="preview" value="预览" accesskey="r" />&nbsp; 
    40   <input type="submit" value="发送" /> 
    4142 </div> 
    4243   
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/Zh/tickettemplate/ttadmin.py

    r3524 r3525  
    99 
    1010from trac.core import * 
     11from trac.db import DatabaseManager 
    1112from trac.util.html import html 
    1213from trac.web import IRequestHandler 
     
    1415from trac.web.chrome import * 
    1516from trac.wiki import wiki_to_html, wiki_to_oneliner 
     17from trac.perm import IPermissionRequestor 
    1618 
    1719from trac.ticket import Milestone, Ticket, TicketSystem, ITicketManipulator 
     
    2527import os 
    2628import pickle 
     29import inspect 
     30import time 
     31import textwrap 
     32 
     33from tickettemplate.model import schema, schema_version, TT_Template 
     34from default_templates import DEFAULT_TEMPLATES 
    2735 
    2836__all__ = ['TicketTemplateModule'] 
     
    3543               INavigationContributor,  
    3644               IRequestHandler,  
    37 #               IEnvironmentSetupParticipant,  
     45               IEnvironmentSetupParticipant,  
     46               IPermissionRequestor, 
    3847               ) 
    3948 
     49    # IPermissionRequestor methods 
     50 
     51    def get_permission_actions(self): 
     52        actions = ['TT_ADMIN'] 
     53        return actions 
     54 
    4055    # IEnvironmentSetupParticipant methods 
    4156 
    42 #    def environment_created(self): 
    43 #        """Create the `site_newticket.cs` template file in the environment.""" 
    44 #        if self.env.path: 
    45 #            templates_dir = os.path.join(self.env.path, 'templates') 
    46 #            if not os.path.exists(templates_dir): 
    47 #                os.mkdir(templates_dir) 
    48 #            template_name = os.path.join(templates_dir, 'site_newticket.cs') 
    49 #            template_file = file(template_name, 'w') 
    50 #            template_file.write("""<?cs 
    51 ##################################################################### 
    52 ## New ticket prelude - Included directly above the new ticket form 
    53 #?> 
    54 #""") 
    55 
    56 #    def environment_needs_upgrade(self, db): 
    57 #        return False 
    58 
    59 #    def upgrade_environment(self, db): 
    60 #        pass 
    61  
     57    def environment_created(self): 
     58        # Create the required tables 
     59        db = self.env.get_db_cnx() 
     60        connector, _ = DatabaseManager(self.env)._get_connector() 
     61        cursor = db.cursor() 
     62        for table in schema: 
     63            for stmt in connector.to_sql(table): 
     64                cursor.execute(stmt) 
     65 
     66        # Insert a global version flag 
     67        cursor.execute("INSERT INTO system (name,value) " 
     68                       "VALUES ('tt_version',%s)", (schema_version,)) 
     69 
     70        # Create some default templates 
     71        for tt_name, tt_text in DEFAULT_TEMPLATES: 
     72            TT_Template.insert(self.env, tt_name, tt_text, 0) 
     73         
     74        db.commit() 
     75 
     76    def environment_needs_upgrade(self, db): 
     77        cursor = db.cursor() 
     78        cursor.execute("SELECT value FROM system WHERE name='tt_version'") 
     79        row = cursor.fetchone() 
     80        if not row or int(row[0]) < schema_version: 
     81            return True 
     82 
     83    def upgrade_environment(self, db): 
     84        cursor = db.cursor() 
     85        cursor.execute("SELECT value FROM system WHERE name='tt_version'") 
     86        row = cursor.fetchone() 
     87        if not row: 
     88            self.environment_created() 
     89            current_version = 0 
     90        else:     
     91            current_version = int(row[0]) 
     92             
     93        from tickettemplate import upgrades 
     94        for version in range(current_version + 1, schema_version + 1): 
     95            for function in upgrades.map.get(version): 
     96                print textwrap.fill(inspect.getdoc(function)) 
     97                function(self.env, db) 
     98                print 'Done.' 
     99        cursor.execute("UPDATE system SET value=%s WHERE " 
     100                       "name='tt_version'", (schema_version,)) 
     101        self.log.info('Upgraded tt tables from version %d to %d', 
     102                      current_version, schema_version) 
    62103 
    63104    # INavigationContributor methods 
     
    116157 
    117158    def process_admin_request(self, req, cat, page, path_info): 
    118         req.perm.assert_permission('TRAC_ADMIN') 
     159        req.perm.assert_permission('TT_ADMIN') 
    119160         
    120161        req.hdf['options'] = self._getTicketTypeNames() 
    121162        req.hdf['type'] = req.args.get('type') 
    122163 
    123         if req.method == 'POST': 
    124 #            tt_file_name = "description_%s.tmpl" % req.args.get('type') 
    125 #            tt_file_name_default = "description_%s.tmpl" % "default" 
    126 #             
    127 #            tt_file = os.path.join(self.env.path, "templates", tt_file_name) 
    128 #            tt_file_default = os.path.join(self.env.path, "templates", tt_file_name_default) 
     164         
     165        if req.args.has_key("id"): 
     166            # after load history 
     167            id = req.args.get("id") 
     168            req.hdf['tt_text'] = self._loadTemplateTextById(id) 
     169            req.hdf['type'] = self._getNameById(id) 
     170 
     171         
     172        elif req.method == 'POST': 
    129173 
    130174            # Load 
     
    133177 
    134178                req.hdf['tt_text'] = self._loadTemplateText(tt_name) 
     179 
     180            # Load history 
     181            if req.args.get('loadhistory'): 
     182                tt_name = req.args.get('type') 
     183                 
     184                req.hdf['tt_name'] = tt_name 
     185                 
     186                tt_history = [] 
     187                for id,modi_time,tt_name,tt_text in TT_Template.selectByName(self.env, tt_name): 
     188                    history = {} 
     189                    history["id"] = id 
     190                    history["tt_name"] = tt_name 
     191                    history["modi_time"] = self._formatTime(int(modi_time)) 
     192                    history["tt_text"] = tt_text 
     193                    history["href"] = req.abs_href.admin(cat, page, {"id":id}) 
     194                    tt_history.append(history) 
     195                 
     196                req.hdf['tt_history'] = tt_history 
     197                                 
     198                return 'loadhistory.cs', None 
    135199 
    136200            # Save 
     
    142206                req.hdf['tt_text'] = tt_text 
    143207                 
    144             # Save 
     208            # preview 
    145209            elif req.args.get('preview'): 
    146210                tt_text = req.args.get('description').replace('\r', '') 
     
    184248     
    185249    # private methods 
    186     def _getTTFilePath(self): 
    187         """ get ticket template file path 
    188         """ 
    189         return os.path.join(self.env.path, "templates", "description.tmpl") 
    190  
    191     def _loadTTDict(self): 
    192         """ load ticket template dict from file. 
    193         """ 
    194         tt_file = self._getTTFilePath() 
    195  
    196         try: 
    197             fp = open(tt_file,'rb') 
    198             tt_stream = fp.read() 
    199             fp.close() 
    200         except: 
    201             tt_stream = "" 
    202  
    203         try: 
    204             tt_dict = pickle.loads(tt_stream) 
    205         except: 
    206             tt_dict = {} 
    207  
    208         return tt_dict 
    209      
     250 
    210251    def _loadTemplateText(self, tt_name): 
    211252        """ get tempate text from tt_dict. 
    212             return tt_text if found in tt_dict 
     253            return tt_text if found in db 
    213254                or default tt_text if exists 
    214255                or empty string if default not exists. 
    215256        """ 
    216         tt_dict = self._loadTTDict() 
    217         return tt_dict.get(tt_name, tt_dict.get("default", "")) 
     257        tt_text = TT_Template.fetch(self.env, tt_name) 
     258        if not tt_text: 
     259            tt_text = TT_Template.fetch(self.env, "default") 
     260         
     261        return tt_text 
     262 
     263    def _getNameById(self, id): 
     264        """ get tempate name from tt_dict. 
     265        """ 
     266        tt_name = TT_Template.getNameById(self.env, id) 
     267         
     268        return tt_name         
     269         
     270         
     271    def _loadTemplateTextById(self, id): 
     272        """ get tempate text from tt_dict. 
     273        """ 
     274        tt_text = TT_Template.fetchById(self.env, id) 
     275         
     276        return tt_text         
    218277         
    219278    def _saveTemplateText(self, tt_name, tt_text): 
    220         """ save ticket template text to file. 
    221         """ 
    222         # dump tt_dict 
    223         tt_dict = self._loadTTDict() 
    224         tt_dict[tt_name] = tt_text 
    225         tt_stream = pickle.dumps(tt_dict) 
    226          
    227         tt_file = self._getTTFilePath() 
    228         try: 
    229             fp = open(tt_file,'wb') 
    230         except: 
    231             raise TracError("Can't write ticket template file %s" % tt_file) 
    232         else: 
    233             fp.write(tt_stream) 
    234             fp.close() 
     279        """ save ticket template text to db. 
     280        """ 
     281         
     282        id = TT_Template.insert(self.env, tt_name, tt_text, time.time()) 
     283        return id 
    235284 
    236285    def _getTicketTypeNames(self): 
     
    248297        return options 
    249298 
     299    def _formatTime(self, modi_time): 
     300        """ 
     301        """ 
     302        return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(modi_time)) 
  • zoomquiettranslation/plugins/KSTracTicketTemplate/0.10/Zh/tickettemplate/version.txt

    r3524 r3525  
    1 0.4 
     10.5