Changeset 364

Show
Ignore:
Timestamp:
Tue Jan 8 00:59:46 2008
Author:
Brian
Message:

Add 'no web security' option to server

Files:

Legend:

Unmodified
Added
Removed
Modified
  • server/trunk/update/test/test_update_server.py

    r360 r364  
    60 60     xpass = 1  
    61 61  
      62 pass_count = total_count = 0  
      63  
    62 64 def Result(s, p=1):  
    63       global xpass  
      65     global xpass, pass_count, total_count  
      66     total_count += 1  
    64 67     if xpass:  
    65           print "passed test"  
      68         pass_count += 1  
      69         print "passed %d of %d tests" % (pass_count, total_count)  
    66 70     else:  
    67 71         if p:  
     
    255 259         }  
    256 260     page = """  
    257   <html><HEAD><title>  
    258   Project Database Server - Database Index  
    259   """  
      261 <html><HEAD>  
      262 <title>Project Database Server - Database Index"""  
    260 263     result = server.get_html_report(web_parms)  
    261 264     compare_values('page text', page, result[:len(page)])  
     
    270 273         }  
    271 274     page = """  
    272   <html><HEAD><title>  
    273   Project Database - Web Report Index  
    274   """  
      275 <html><HEAD>  
      276 <title>Project Database - Web Report Index"""  
    275 277     result = server.get_html_report(web_parms)  
    276 278     compare_values('page text', page, result[:len(page)])  
     
    284 286         "Report": 4,  
    285 287         }  
    286       page = """\n<html><HEAD><title>\nNew Project / Gantt Chart (Task)\n"""  
      288     page = """  
      289 <html><HEAD><title>  
      290 New Project / Gantt Chart (Task)"""  
    287 291     result = server.get_html_report(web_parms)  
    288 292     compare_values('page text', page, result[:len(page)])  
  • server/trunk/update/server/current/Configuration.ini

    r358 r364  
    29 29  
    30 30 server_key = CE428F03  
      31  
      32 # web security - how are web client passwords managed  
      33 # must be one of the following options  
      34 #   none = no key required to view reports  
      35 #   session = keys stored session, session expires one week after last use  
      36  
      37 web_security = session  
  • server/trunk/update/server/ganttpv_update_server.py

    r358 r364  
    36 36 import Data  
    37 37 import HTML  
      38 import HTMLIndex  
    38 39 import datetime  
    39 40 import os  
     
    64 65     server_name = "GanttPV Server"  # unique - use letters, digits, and spaces only  
    65 66     # if omitted, server will not publish via zero config  
      67 print "Server Name - '%s'" % server_name  
    66 68  
    67 69 # server location - must be a static ip address  
     
    83 85     server_key = "CE428F03"  # <-- change this key for each server  
    84 86  
      87 # web security  
      88 if config.has_option('network', 'web_security'):  
      89     web_security = config.get('network', 'web_security').rstrip()  
      90     if web_security not in ('none', 'session'):  
      91         web_security = 'session'  
      92 else:  
      93     web_security = 'session'  
      94 print "Web Security - %s" % web_security  
      95  
    85 96 print "\nClients need the following parameters to add files to this server:"  
    86 97 print "%s:%d,%s\n" % (server_ip, server_port, server_key)  
     
    159 170     # SaveSessions()  # only save it at least 1 day since the last time it was accessed???  
    160 171  
    161       dblist = current_sessions[session]['DB']  
    162       if db < 0 or db >= len(dblist):  
    163           if debug: print "Failed - db was outside of length of database list", db  
    164           return 0  
    165       request_fs = dblist[db][1]  # signature  
      172 #    if debug: print 'server web_security is:', web_security  
      173     if web_security == 'session':  
      174         dblist = current_sessions[session]['DB']  
      175         if db < 0 or db >= len(dblist):  
      176             if debug: print "Failed - db was outside of length of database list", db  
      177             return 0  
      178         request_fs = dblist[db][1]  # signature  
      179     else:  
      180         request_fs = db  
    166 181  
    167 182 #    request_fs = webindex.get(request_fs)  # is database available?  
     
    171 186      
    172 187 #    request_key = parms.get('Key')  
    173       request_key = dblist[db][2]  # key  
    174       if debug: print "request key", request_key  
    175       if request_key in get_keys(edit_keys):  # is key authorized?  
    176           if debug: print "Pass - request key is in change keys"  
      188     if web_security == 'session':  
      189         request_key = dblist[db][2]  # key  
      190         if debug: print "request key", request_key  
      191         if request_key in get_keys(edit_keys):  # is key authorized?  
      192             if debug: print "Pass - request key is in change keys"  
      193             return -2  
      194         elif request_key in get_keys(view_keys):  # is key authorized?  
      195             if debug: print "Pass - request key is in view keys"  
      196             return -1  
      197         personal_key = get_resource_id_from_key(request_key)  
      198         if personal_key:  
      199             if debug: print "Pass - request key is a personal key", personal_key  
      200             return personal_key  # return person's resource id  
      201         if debug: print "Failed - request key wasn't found", personal_key  
      202         return 0  
      203     else:  # web_security == 'none'  
    177 204         return -2  
    178       elif request_key in get_keys(view_keys):  # is key authorized?  
    179           if debug: print "Pass - request key is in view keys"  
    180           return -1  
    181       personal_key = get_resource_id_from_key(request_key)  
    182       if personal_key:  
    183           if debug: print "Pass - request key is a personal key", personal_key  
    184           return personal_key  # return person's resource id  
    185       if debug: print "Failed - request key wasn't found", personal_key  
    186       return 0  
    187 205  
    188 206 def clear_session(parms):  
     
    196 214 # lookup key, create session, add key to session  
    197 215 def add_database_to_session(parms):  
      216     # delete sessions over two weeks old  
      217     then = datetime.datetime.now() - datetime.timedelta(14)  # 2 weeks ago  
      218     for s in current_sessions.keys():  
      219         if current_sessions[s]['LastAccess'] < then:  
      220             if debug: print 'deleting session %s' % s  
      221             del current_sessions[s]  
      222  
    198 223     session = parms.get('S')  
    199 224     key = parms.get('Key')  
     
    242 267  
    243 268 # return requested html report  
      269 def WriteHTMLReport(fp, reportid, parms):  
      270     if reportid == 0:  # write the default report (report 0)  
      271         if debug: print "about to create report 0"  
      272         HTMLIndex.WriteDatabaseIndex(fp, reportid, parms)  
      273         return  
      274  
      275     reportdb = Data.Database['Report']  
      276     if reportid != 1:  
      277         if not (reportid in reportdb and not reportdb[reportid].get('zzStatus') == 'deleted'):  
      278             if debug: print "not valid report id"  
      279             return ""  
      280         rr = reportdb[reportid]  
      281  
      282     if 1:  # not local:  
      283         if reportid == 1 or not rr.get('Web'):  # write the default report (report 1)  
      284             HTMLIndex.WriteReportIndex(fp, reportid, parms)  
      285             return  
      286     HTML.WriteHTML(fp, reportid, parms)  # use dict eventually to select report  
      287     return  
      288  
    244 289 def get_html_report(parms):  
    245 290     if debug: print "starting get_html_report", parms  
    246 291  
      292     parms['Security'] = web_security  # from server config file  
      293  
    247 294     edit_keys = ("OwnerKey", "EditKey", "WebEditKey")  
    248 295     view_keys = ("ViewKey", "WebViewKey")  
    249       id = web_permissions_okay(parms, edit_keys, view_keys)  
      296     id = web_permissions_okay(parms, edit_keys, view_keys)  # switch to database  
    249 296     if not id:  
    250 297         if debug: print "didn't pass web permissions\nending get_html_report", id  
    251 298         return ""  
    252 299  
    253       if debug: print "permission id:", id  
      300     session = parms.get('S')  
      301     if session and session in current_sessions:  
      302         parms['SS'] = current_sessions[session]  # dictionary of this session  
      303  
      304     parms['SDB'] = served                     # all databases  
      305  
    254 306     if id > 0:  # specific person's key used  
    255 307         parms['ResourceFilter'] = id  
     
    258 310         parms['ResourceFilter'] = None  # override anything in parms  
    259 311  
    260       # parms['ResourceFilter'] = 1  # used to test logic  
    261    
    262 312     parms['AllowEdit'] = id == -2 or id > 0  # offer edit version of report  
    263 313  
    264       if debug: print "about to create a reporttext object"  
    265 314     reportid = parms.get("Report")  
    266 315     report = ReportText(reportid)  # create file-like object to capture report  
    267 316     HTML.self = report  # so self.ReportID will give report number -- needed?  
    268       if debug: print "about to create a html page"  
    269    
    270       session = parms.get('S')  
    271       if session and session in current_sessions:  
    272           parms['SS'] = current_sessions[session]  # dictionary of this session  
    273           parms['SDB'] = served                     # all databases  
    274 317  
    275 318     if debug: print "reportid, parms:", reportid, parms  
    276       HTML.WriteHTML(report, reportid, parms)  # use dict eventually to select report  
    277       if debug: print "created an html page"  
    278   #    if debug: print "let's see it"  
    279   #    if debug: print report.text  
    280       if debug: print "ending get_html_report"  
      319 #    HTML.WriteHTML(report, reportid, parms)  # use dict eventually to select report  
      320     WriteHTMLReport(report, reportid, parms)  # use dict eventually to select report  
      321  
    281 322     return report.text  
    282 323  
  • server/trunk/update/server/HTML.py

    r221 r364  
    41 41 # 060902 - Alex - indent subtask names  
    42 42 # 060914 - Alex - use time-scale headers from Data (takes advantage of the better-looking headers in v0.7)  
      43 # 080107 - Brian - move index reports to separate module  
    43 44  
    44 45 # Note: The fonts used in this script are larger than in GanttPV. To reduce font size to more closely match GanttPV, change the "font-size" lines in the header strings.  
     
    124 125     return result  
    125 126  
    126   def DefineHeaders():  
    127       global header1, header2, header2a, header3, footer1, footer2  
      127 # idea - convert to using the following templates -- TODO!  
    128 128  
    129       header1 = """  
    130   <html><HEAD><title>  
    131   """  
    132       header2 = """  
    133   </title><meta http-equiv="content-type" content="text/html;charset=""" + cset + """"><STYLE>  
      129 # usage: template_page % (title, style, links, report_body)  
      130 template_page = '''  
      131 <html><HEAD>  
      132 <title>%s</title>  
      133 <meta http-equiv="content-type" content="text/html;charset=UTF-8">  
      134 <STYLE>%s</STYLE>  
      135 </HEAD><body>  
      136 %s  
      137 <div align=center>  
      138 %s  
      139 </div>  
      140 </body>  
      141 </html>  
      142 '''  
      143  
      144 template_style = '''  
    134 145 h3, td { font-family: verdana,arial,helvetica,sans-serif; }  
    135 146 h3 { font-size: 14px; color:#000000; background-color: #ffffff; }  
     
    150 161 .time { font-family: verdana,arial,helvetica,sans-serif; font-size: 8px; color:#808080; }  
    151 162 A.time { text-decoration:none }  
      163 '''  
      164  
      165 # usage: template_report % (post_url, page_heading, report_rows, report_time)  
      166 # report_time = datetime.datetime.today().strftime("%y-%m-%d %H:%M")) # convert to display format  
      167 template_report = '''  
      168 <form method="post" action="ganttpv_report.py%s">  
      169 <table cellspacing=0 cellpadding=0>  
      170 <tr><td>&nbsp;</td><td align=center>  
      171 %s  
      172 <table border="1" cellspacing="0" cellpadding="1">\r  
      173 %s  
      174 </table>  
      175 </td><td>&nbsp;</td></tr>  
      176 <tr><td>&nbsp;</td><td align=right>  
      177 <div class="time">  
      178 <a class="time" href="http://www.pureviolet.net/ganttpv/">GanttPV</a> %s  
      179 </div>'  
      180 </td><td>&nbsp;</td></tr>  
      181 </table>  
      182 </form>  
      183 '''  
      184  
      185 def DefineHeaders():  
      186     global header1, header2, header2a, header3, footer1, footer2  
      187  
      188     header1 = """  
      189 <html><HEAD><title>  
      190 """  
      191     header2 = """  
      192 </title><meta http-equiv="content-type" content="text/html;charset=""" + cset + """"><STYLE>  
      193 """ + template_style + """  
    152 194 </STYLE></HEAD><body>  
    153 195 <form method="post" action="ganttpv_report.py%s">%s  
     
    224 266     return columnID, columnName, columnTable  
    225 267  
    226   def WriteDatabaseIndex(fp, reportid, parms):  
    227       if debug: print "Starting WriteDatabaseIndex"  
    228    
    229       session = parms.get('S')  
    230       if debug: print "session", session  
    231    
    232       fp.write(header1)  
    233       fp.write(MakeString(_("Project Database Server - Database Index")))  
    234       fp.write(header2 % ("", "&nbsp;"))  
    235       fp.write('<h3>')  
    236       fp.write(MakeString(_("Databases Available in Server")))  
    237       fp.write('</h3>\r')  
    238    
    239       fp.write('Database Key: <input type=text name="Key">')  
    240       fp.write('<input type=submit value="submit"><p>\r')  
    241    
    242       fp.write(header2a)  
    243    
    244       fp.write('<tr><td class="head">')  
    245       fp.write(MakeString(_("Database")))  
    246       fp.write('</th><td class="head">')  
    247       fp.write(MakeString(_('Link')))  
    248       fp.write('</th></tr>')  
    249    
    250       # build list of row options  
    251       session_data = parms.get('SS')  # dictionary for this session  
    252   #    sessions = parms.get('SD')  
    253       served = parms.get('SDB')  # all of the databases, index by file signature  
    254    
    255       if session_data:  
    256           rlist = session_data.get('DB')  # list of database keys  
    257       else:  
    258           rlist = []  
    259    
    260       # rlist = Data.GetRowList(1)  # report 2 shows projects and reports  
    261       db = 0  
    262       cnt = 0  
    263       for webkey, signature, key in rlist:  
    264           db = served.get(signature)  # the database that corresponds to this key  
    265           if db:  
    266               webname = db.database['Other'][1].get('WebName')  
    267               fp.write('<tr><td class="body">')  
    268               fp.write((webname or "Database") + (" (%d)" % (signature % 1000)))  
    269               fp.write('</td><td class="body">')  
    270               fp.write('<a href="ganttpv_report.py?DB=%d;Report=1">' % cnt)  
    271               fp.write(MakeString(_('Show Reports')))  
    272               fp.write('</a>')  
    273               fp.write('</td></tr>')  
    274           cnt += 1  
    275    
    276       if db == 0:  
    277           fp.write('<tr><td colspan=2>')  
    278           fp.write(MakeString(_("No databases.")))  
    279           fp.write('</td></tr>')  
    280    
    281       fp.write(footer1)  
    282       fp.write('<div class="time">')  
    283       # fp.write('<p><hr>')  
    284       fp.write('<a class="time" href="http://www.pureviolet.net/ganttpv/">GanttPV</a> ')  
    285       # fp.write('Exported on ')  
    286       dToday = datetime.datetime.today()      # returns datetime object for now  
    287       fp.write(dToday.strftime("%y-%m-%d %H:%M")) # convert to display format  
    288       fp.write('</div>')  
    289       fp.write(footer2)  
    290       fp.close()  
    291       return  
    292    
    293   def WriteReportIndex(fp, reportid, parms):  
    294       edit = parms.get('AllowEdit')  
    295       db = parms.get('DB')  
    296       db_link = '<a class="index" href="ganttpv_report.py">Database Index</a>'  
    297       webname = Data.Other.get('WebName') or 'Project Database'  
    298    
    299       fp.write(header1)  
    300       fp.write(MakeString(_("%s - Web Report Index") % webname))  
    301       fp.write(header2 % ("", db_link))  
    302       fp.write('<h3>')  
    303       fp.write(MakeString(_("Web Reports in %s") % webname))  
    304       fp.write('</h3>\r')  
    305       fp.write(header2a)  
    306    
    307       # database short cuts  
    308       reportdb = Data.Database['Report']  
    309       rowdb = Data.Database['ReportRow']  
    310       projectdb = Data.Database['Project']  
    311    
    312       fp.write('<tr><td class="head">')  
    313       fp.write(MakeString(_("Project")))  
    314       fp.write('</th><td class="head">')  
    315       fp.write(MakeString(_("Report")))  
    316       fp.write('</th><td class="head" colspan=2>')  
    317       fp.write(MakeString(_('Report Format')))  
    318   #    fp.write('</th><td class="head">')  
    319   #    fp.write(MakeString(_('Edit')))  
    320   #    fp.write('</th><td class="head">')  
    321   #    fp.write(MakeString(_('Multi')))  
    322       fp.write('</th></tr>')  
    323    
    324       # build list of row options  
    325    
    326       rlist = Data.GetRowList(1)  # report 2 shows projects and reports  
    327       prior_pid = 0  
    328    
    329       for k in rlist:  
    330           rr = Data.ReportRow[k]  
    331           id = rr.get('TableID')  
    332           table = rr.get('TableName')  # should always be 'ReportType' or 'ColumnType'  
    333    
    334           hidden = rr.get('Hidden')  
    335           deleted = reportdb[id].get('zzStatus') == 'deleted'  
    336           project = table == 'Project'  
    337           if hidden or deleted: continue  
    338           if project:  # display project if any of it's reports are visible  
    339               continue  
    340    
    341           projectid = reportdb[id].get('ProjectID')  
    342           if not projectid in projectdb: continue  
    343    
    344           rn = reportdb[id].get('Name')  
    345           web = reportdb[id].get('Web')  
    346           pid = reportdb[id].get('ProjectID')  
    347           pn = projectdb[pid].get('Name')  
    348    
    349           if web or 0:  
    350               fp.write('<tr><td class="body">')  
    351               if prior_pid != pid:  
    352                   fp.write(MakeString(pn))  
    353                   prior_pid = pid  
    354               else:  
    355                   fp.write('&nbsp;')  
    356    
    357               fp.write('</td><td class="body">')  
    358               fp.write(MakeString(rn))  
    359    
    360               fp.write('</td><td class="body">')  
    361               fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d">' % (db, id))  
    362               fp.write(MakeString(_('View')))  
    363    
    364               fp.write('</a>')  
    365               fp.write('</td><td class="body">')  
    366               if edit:  
    367                   fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d;Edit=yes;InPlace=yes">' % (db, id))  
    368                   fp.write(MakeString(_('Edit')))  
    369    
    370                   fp.write('</a>')  
    371               else:  
    372                   fp.write('&nbsp;')  
    373   #            fp.write('</td><td class="body">')  
    374   #            if edit:  
    375   #                fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d;Edit=yes">' % (db, id))  
    376   #                fp.write(MakeString(_('Multi')))  
    377   #  
    378   #                fp.write('</a>')  
    379   #            else:  
    380   #                fp.write('&nbsp;')  
    381               fp.write('</td></tr>')  
    382    
    383       if prior_pid == 0:  
    384           fp.write('<tr><td colspan=4>')  
    385           fp.write(MakeString(_("No reports available on the web.")))  
    386    
    387           fp.write('</td></tr>')  
    388    
    389       fp.write(footer1)  
    390       fp.write('<div class="time">')  
    391       # fp.write('<p><hr>')  
    392       fp.write('<a class="time" href="http://www.pureviolet.net/ganttpv/">GanttPV</a> ')  
    393       # fp.write('Exported on ')  
    394       dToday = datetime.datetime.today()      # returns datetime object for now  
    395       fp.write(dToday.strftime("%y-%m-%d %H:%M")) # convert to display format  
    396       fp.write('</div>')  
    397       fp.write(footer2)  
    398       fp.close()  
    399       return  
      268 ##def WriteDatabaseIndex(fp, reportid, parms):  
      269 ##    if debug: print "Starting WriteDatabaseIndex"  
      270 ##  
      271 ##    session = parms.get('S')  
      272 ##    if debug: print "session", session  
      273 ##  
      274 ##    fp.write(header1)  
      275 ##    fp.write(MakeString(_("Project Database Server - Database Index")))  
      276 ##    fp.write(header2 % ("", "&nbsp;"))  
      277 ##    fp.write('<h3>')  
      278 ##    fp.write(MakeString(_("Databases Available in Server")))  
      279 ##    fp.write('</h3>\r')  
      280 ##  
      281 ##    fp.write('Database Key: <input type=text name="Key">')  
      282 ##    fp.write('<input type=submit value="submit"><p>\r')  
      283 ##  
      284 ##    fp.write(header2a)  
      285 ##  
      286 ##    fp.write('<tr><td class="head">')  
      287 ##    fp.write(MakeString(_("Database")))  
      288 ##    fp.write('</th><td class="head">')  
      289 ##    fp.write(MakeString(_('Link')))  
      290 ##    fp.write('</th></tr>')  
      291 ##  
      292 ##    # build list of row options  
      293 ##    session_data = parms.get('SS')  # dictionary for this session  
      294 ###    sessions = parms.get('SD')  
      295 ##    served = parms.get('SDB')  # all of the databases, index by file signature  
      296 ##  
      297 ##    if session_data:  
      298 ##        rlist = session_data.get('DB')  # list of database keys  
      299 ##    else:  
      300 ##        rlist = []  
      301 ##  
      302 ##    # rlist = Data.GetRowList(1)  # report 2 shows projects and reports  
      303 ##    db = 0  
      304 ##    cnt = 0  
      305 ##    for webkey, signature, key in rlist:  
      306 ##        db = served.get(signature)  # the database that corresponds to this key  
      307 ##        if db:  
      308 ##            webname = db.database['Other'][1].get('WebName')  
      309 ##            fp.write('<tr><td class="body">')  
      310 ##            fp.write((webname or "Database") + (" (%d)" % (signature % 1000)))  
      311 ##            fp.write('</td><td class="body">')  
      312 ##            fp.write('<a href="ganttpv_report.py?DB=%d;Report=1">' % cnt)  
      313 ##            fp.write(MakeString(_('Show Reports')))  
      314 ##            fp.write('</a>')  
      315 ##            fp.write('</td></tr>')  
      316 ##        cnt += 1  
      317 ##  
      318 ##    if db == 0:  
      319 ##        fp.write('<tr><td colspan=2>')  
      320 ##        fp.write(MakeString(_("No databases.")))  
      321 ##        fp.write('</td></tr>')  
      322 ##  
      323 ##    fp.write(footer1)  
      324 ##    fp.write('<div class="time">')  
      325 ##    # fp.write('<p><hr>')  
      326 ##    fp.write('<a class="time" href="http://www.pureviolet.net/ganttpv/">GanttPV</a> ')  
      327 ##    # fp.write('Exported on ')  
      328 ##    dToday = datetime.datetime.today()      # returns datetime object for now  
      329 ##    fp.write(dToday.strftime("%y-%m-%d %H:%M")) # convert to display format  
      330 ##    fp.write('</div>')  
      331 ##    fp.write(footer2)  
      332 ##    fp.close()  
      333 ##    return  
      334  
      335 ##def WriteReportIndex(fp, reportid, parms):  
      336 ##    edit = parms.get('AllowEdit')  
      337 ##    db = parms.get('DB')  
      338 ##    db_link = '<a class="index" href="ganttpv_report.py">Database Index</a>'  
      339 ##    webname = Data.Other.get('WebName') or 'Project Database'  
      340 ##  
      341 ##    fp.write(header1)  
      342 ##    fp.write(MakeString(_("%s - Web Report Index") % webname))  
      343 ##    fp.write(header2 % ("", db_link))  
      344 ##    fp.write('<h3>')  
      345 ##    fp.write(MakeString(_("Web Reports in %s") % webname))  
      346 ##    fp.write('</h3>\r')  
      347 ##    fp.write(header2a)  
      348 ##  
      349 ##    # database short cuts  
      350 ##    reportdb = Data.Database['Report']  
      351 ##    rowdb = Data.Database['ReportRow']  
      352 ##    projectdb = Data.Database['Project']  
      353 ##  
      354 ##    fp.write('<tr><td class="head">')  
      355 ##    fp.write(MakeString(_("Project")))  
      356 ##    fp.write('</th><td class="head">')  
      357 ##    fp.write(MakeString(_("Report")))  
      358 ##    fp.write('</th><td class="head" colspan=2>')  
      359 ##    fp.write(MakeString(_('Report Format')))  
      360 ###    fp.write('</th><td class="head">')  
      361 ###    fp.write(MakeString(_('Edit')))  
      362 ###    fp.write('</th><td class="head">')  
      363 ###    fp.write(MakeString(_('Multi')))  
      364 ##    fp.write('</th></tr>')  
      365 ##  
      366 ##    # build list of row options  
      367 ##  
      368 ##    rlist = Data.GetRowList(1)  # report 2 shows projects and reports  
      369 ##    prior_pid = 0  
      370 ##  
      371 ##    for k in rlist:  
      372 ##        rr = Data.ReportRow[k]  
      373 ##        id = rr.get('TableID')  
      374 ##        table = rr.get('TableName')  # should always be 'ReportType' or 'ColumnType'  
      375 ##  
      376 ##        hidden = rr.get('Hidden')  
      377 ##        deleted = reportdb[id].get('zzStatus') == 'deleted'  
      378 ##        project = table == 'Project'  
      379 ##        if hidden or deleted: continue  
      380 ##        if project:  # display project if any of it's reports are visible  
      381 ##            continue  
      382 ##  
      383 ##        projectid = reportdb[id].get('ProjectID')  
      384 ##        if not projectid in projectdb: continue  
      385 ##  
      386 ##        rn = reportdb[id].get('Name')  
      387 ##        web = reportdb[id].get('Web')  
      388 ##        pid = reportdb[id].get('ProjectID')  
      389 ##        pn = projectdb[pid].get('Name')  
      390 ##  
      391 ##        if web or 0:  
      392 ##            fp.write('<tr><td class="body">')  
      393 ##            if prior_pid != pid:  
      394 ##                fp.write(MakeString(pn))  
      395 ##                prior_pid = pid  
      396 ##            else:  
      397 ##                fp.write('&nbsp;')  
      398 ##  
      399 ##            fp.write('</td><td class="body">')  
      400 ##            fp.write(MakeString(rn))  
      401 ##  
      402 ##            fp.write('</td><td class="body">')  
      403 ##            fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d">' % (db, id))  
      404 ##            fp.write(MakeString(_('View')))  
      405 ##  
      406 ##            fp.write('</a>')  
      407 ##            fp.write('</td><td class="body">')  
      408 ##            if edit:  
      409 ##                fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d;Edit=yes;InPlace=yes">' % (db, id))  
      410 ##                fp.write(MakeString(_('Edit')))  
      411 ##  
      412 ##                fp.write('</a>')  
      413 ##            else:  
      414 ##                fp.write('&nbsp;')  
      415 ###            fp.write('</td><td class="body">')  
      416 ###            if edit:  
      417 ###                fp.write('<a href="ganttpv_report.py?DB=%d;Report=%d;Edit=yes">' % (db, id))  
      418 ###                fp.write(MakeString(_('Multi')))  
      419 ###  
      420 ###                fp.write('</a>')  
      421 ###            else:  
      422 ###                fp.write('&nbsp;')  
      423 ##            fp.write('</td></tr>')  
      424 ##  
      425 ##    if prior_pid == 0:  
      426 ##        fp.write('<tr><td colspan=4>')  
      427 ##        fp.write(MakeString(_("No reports available on the web.")))  
      428 ##  
      429 ##        fp.write('</td></tr>')  
      430 ##  
      431 ##    fp.write(footer1)  
      432 ##    fp.write('<div class="time">')  
      433 ##    # fp.write('<p><hr>')  
      434 ##    fp.write('<a class="time" href="http://www.pureviolet.net/ganttpv/">GanttPV</a> ')  
      435 ##    # fp.write('Exported on ')  
      436 ##    dToday = datetime.datetime.today()      # returns datetime object for now  
      437 ##    fp.write(dToday.strftime("%y-%m-%d %H:%M")) # convert to display format  
      438 ##    fp.write('</div>')  
      439 ##    fp.write(footer2)  
      440 ##    fp.close()  
      441 ##    return  
    400 442  
    401 443 def EditPeriod(cid, date):  
     
    453 495  
    454 496 # decide which report to print  
    455       if reportid == 0:  # write the default report (report 0)  
    456           if debug: print "about to create report 0"  
    457           WriteDatabaseIndex(fp, reportid, parms)  
    458           return  
      497 ##    if reportid == 0:  # write the default report (report 0)  
      498 ##        if debug: print "about to create report 0"  
      499 ##        WriteDatabaseIndex(fp, reportid, parms)  
      500 ##        return  
    459 501  
    460 502     reportdb = Data.Database['Report']  
    461 503     if reportid != 1:  
    462           if not (reportid in reportdb and not reportdb[reportid].get('zzStats') == 'deleted'):  
      504         if not (reportid in reportdb and not reportdb[reportid].get('zzStatus') == 'deleted'):  
    462 504             if debug: print "not valid report id"  
    463 505             return ""  
    464 506         rr = reportdb[reportid]  
    465 507  
    466       if not local:  
    467           if reportid == 1 or not rr.get('Web'):  # write the default report (report 1)  
    468               WriteReportIndex(fp, reportid, parms)  
    469               return  
      508 ##    if not local:  
      509 ##        if reportid == 1 or not rr.get('Web'):  # write the default report (report 1)  
      510 ##            WriteReportIndex(fp, reportid, parms)  
      511 ##            return  
    470 512     report = Data.Report[reportid]  
    471 513  
     
    486 528         if debug: "override edit", parm_allow_edit, parm_edit