| Home | Trees | Indices | Help |
|
|---|
|
|
1 """ 2 This file is part of web2py Web Framework (Copyrighted, 2007) 3 Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu> 4 License: GPL v2 5 """ 6 7 import urllib, random, re, sys, os, shutil, cStringIO 8 from html import FORM,INPUT,TEXTAREA,SELECT,OPTION,TABLE,TR,TD,TH,A,B,DIV,LABEL,ON 9 from validators import IS_IN_SET, IS_NOT_IN_DB, CRYPT 10 from sql import SQLStorage 1113 """ 14 SQLFORM is used to map a table (and a current record) into an HTML form 15 16 given a SQLTable stored in db.table 17 18 SQLFORM(db.table) generates an insert form 19 record=db(db.table.id==some_id).select()[0] 20 SQLFORM(db.table,record) generates an update form 21 SQLFORM(db.table,record,deletable=True) generates an update 22 with a delete button 23 24 optional arguments: 25 26 fields: a list of fields that should be placed in the form, default is all. 27 labels: a dictionary with labels for each field. keys are field names. 28 linkto: the URL of a controller/function to access referencedby records 29 see controller appadmin.py for examples 30 upload: the URL of a controller/function to download an uploaded file 31 see controller appadmin.py for examples 32 any named optional attribute is passed to the <form> tag 33 for example _class, _id, _style, _action,_method, etc. 34 35 """203 20436 - def __init__(self,table,record=None,deletable=False,linkto=None,upload=None,fields=None,labels=None,submit_button='Submit',delete_label='Check to delete:',showid=True,**attributes):37 """ 38 SQLFORM(db.table, 39 record=None, 40 fields=['name'], 41 labels={'name':'Your name'}, 42 linkto=ULR(r=request,f='table/db/') 43 """ 44 self.table=table 45 FORM.__init__(self,*[],**attributes) 46 xfields=[] 47 self.fields=fields 48 if not self.fields: self.fields=self.table.fields 49 if not 'id' in self.fields: self.fields.insert(0,'id') 50 self.record=record 51 self.record_id=None 52 for fieldname in self.fields: 53 field_id='%s_%s' % (table._tablename,fieldname) 54 if fieldname=='id': 55 if record: 56 if showid: 57 xfields.append(TR(TD('Record id:'),TD(B(record['id'])))) 58 self.record_id=str(record['id']) 59 continue 60 field=self.table[fieldname] 61 if record: default=record[fieldname] 62 else: default=field.default 63 if default: default=field.formatter(default) 64 if labels!=None and labels.has_key(fieldname): 65 label=labels[fieldname] 66 else: 67 label=fieldname.replace('_',' ').capitalize()+': ' 68 label=LABEL(label,_for=fieldname,_id='%s:label'%field_id) 69 if field.type=='blob' or field.type=='text': 70 inp=TEXTAREA(_type='text',_id=field_id, 71 _name=fieldname,value=default, requires=field.requires) 72 elif field.type=='upload': 73 inp=INPUT(_type='file',_id=field_id, 74 _name=fieldname, requires=field.requires) 75 if upload and default: 76 inp=DIV(inp,'[',A('file',_href=upload+'/'+default),'|', 77 INPUT(_type='checkbox',_name=fieldname+'__delete'),'delete]') 78 elif field.type=='boolean': 79 if default==True: default='ON' 80 else: default='' 81 inp=INPUT(_type='checkbox',_id=field_id, 82 _name=fieldname,value=default, requires=field.requires) 83 elif isinstance(field.requires,IS_IN_SET): 84 if field.requires.labels: 85 opts,k=[],0 86 for v in field.requires.theset: 87 if v==default or (not isinstance(default,(str,unicode)) and v==str(default)): 88 opts.append(OPTION(field.requires.labels[k],_value=v,_selected=ON)) 89 else: 90 opts.append(OPTION(field.requires.labels[k],_value=v)) 91 k+=1 92 else: opts=field.requires.theset 93 inp=SELECT(*opts,**dict(_id=field_id, 94 _name=fieldname,value=default,requires=field.requires)) 95 elif field.type=='password': 96 if self.record: v='********' 97 else: v='' 98 inp=INPUT(_type='password', _id=field_id, 99 _name=fieldname,_value=v, 100 requires=field.requires) 101 else: 102 if default==None: default='' 103 inp=INPUT(_type='text', _id=field_id, 104 _name=fieldname,value=str(default), 105 requires=field.requires) 106 xfields.append(TR(TD(label),TD(inp))) 107 if record and linkto: 108 if linkto: 109 for rtable,rfield in table._referenced_by: 110 query=urllib.quote(str(table._db[rtable][rfield]==record.id)) 111 xfields.append(TR(' ',A('%s.%s' % (rtable,rfield), 112 _href='%s/%s?query=%s'%(linkto,rtable,query)))) 113 if record and deletable: 114 xfields.append(TR(delete_label,INPUT(_type='checkbox', 115 _name='delete_this_record'))) 116 xfields.append(TR(' ',INPUT(_type='submit',_value=submit_button))) 117 if record: 118 self.components=[TABLE(*xfields), 119 INPUT(_type='hidden',_name='id',_value=record['id'])] 120 else: self.components=[TABLE(*xfields)]122 """ 123 same as FORM.accepts but also does insert, update or delete in SQLDB 124 """ 125 if not formname: formname=str(self.table) 126 raw_vars=dict(vars.items()) 127 if vars.has_key('delete_this_record') and \ 128 vars['delete_this_record']=='on' and \ 129 vars.has_key('id'): 130 if vars['id']!=self.record_id: 131 raise SyntaxError, "user is tampering with form" 132 self.table._db(self.table.id==int(vars['id'])).delete() 133 return True 134 else: 135 ### THIS IS FOR UNIQUE RECORDS, read IS_NOT_IN_DB 136 for fieldname in self.fields: 137 field=self.table[fieldname] 138 if field.requires: 139 try: field.requires=list(field.requires) 140 except TypeError: field.requires=[field.requires] 141 for item in field.requires: 142 if isinstance(item,IS_NOT_IN_DB): 143 item.record_id=self.record_id 144 ### END 145 fields={} 146 for key in self.vars.keys(): fields[key]=self.vars[key] 147 ret=FORM.accepts(self,vars,session,formname,keepvalues) 148 if not ret: return ret 149 vars=self.vars 150 for fieldname in self.fields: 151 #if not vars.has_key(fieldname): continue 152 if fieldname=='id': continue 153 field=self.table[fieldname] 154 if field.type=='boolean': 155 if vars.has_key(fieldname) and vars[fieldname]=='on': 156 fields[fieldname]=True 157 else: fields[fieldname]=False 158 elif field.type=='password' and self.record and \ 159 raw_vars.has_key(fieldname) and \ 160 raw_vars[fieldname]=='********': 161 continue # do not update if password was not changed 162 elif field.type=='upload': 163 f=vars[fieldname] 164 if not isinstance(f,(str,unicode)): 165 try: e=re.compile('\.\w+$').findall(f.filename.strip())[0] 166 except IndexError: e='.txt' 167 source_file=f.file 168 else: 169 e='.txt' ### DO NOT KNOW WHY THIS HAPPENS! 170 source_file=cStringIO.StringIO(f) 171 if f!='': 172 newfilename='%s.%s.%s%s'%(self.table._tablename, \ 173 fieldname,str(random.random())[2:],e) 174 pathfilename=os.path.join(self.table._db._folder,\ 175 '../uploads/',newfilename) 176 dest_file=open(pathfilename,'wb') 177 shutil.copyfileobj(source_file,dest_file) 178 dest_file.close() 179 fields[fieldname]=newfilename 180 else: 181 fd=fieldname+'__delete' 182 if (vars.has_key(fd) and vars[fd]=='on') or not self.record: 183 fields[fieldname]='' 184 else: 185 fields[fieldname]=self.record[fieldname] 186 continue 187 elif vars.has_key(fieldname): fields[fieldname]=vars[fieldname] 188 elif field.default==None: return False 189 if field.type[:9] in ['integer', 'reference']: 190 if fields[fieldname]!=None: 191 fields[fieldname]=int(fields[fieldname]) 192 elif field.type=='double': 193 if fields[fieldname]!=None: 194 fields[fieldname]=float(fields[fieldname]) 195 if vars.has_key('id'): 196 if vars['id']!=self.record_id: 197 raise SyntaxError, "user is tampering with form" 198 id=int(vars['id']) 199 self.table._db(self.table.id==id).update(**fields) 200 else: 201 self.vars.id=self.table.insert(**fields) 202 return ret206 """ 207 given a SQLRows object, as returned by a db().select(), generates 208 and html table with the rows. 209 210 optional arguments: 211 linkto: URL to edit individual records 212 uplaod: URL to download uploaded files 213 optional names attributes for passed to the <table> tag 214 """247216 TABLE.__init__(self,**attributes) 217 self.components=[] 218 self.attributes=attributes 219 self.sqlrows=sqlrows 220 rows,row=self.components,[] 221 for colname in sqlrows.colnames: row.append(TH('[%s]'%colname)) 222 rows.append(TR(*row)) 223 for record in sqlrows: 224 row=[] 225 for colname in sqlrows.colnames: 226 tablename,fieldname=colname.split('.') 227 field=sqlrows._db[tablename][fieldname] 228 if record.has_key(tablename) and isinstance(record,SQLStorage): 229 r=record[tablename][fieldname] 230 elif record.has_key(fieldname): 231 r=record[fieldname] 232 else: raise SyntaxError, "something wrong in SQLRows object" 233 r=str(field.formatter(r)) 234 if upload and field.type=='upload' and r!='None': 235 if r: row.append(TD(A('file',_href='%s/%s' % (upload,r)))) 236 else: row.append(TD()) 237 continue 238 if len(r)>16: r=r[:13]+'...' 239 if linkto and field.type=='id': 240 row.append(TD(A(r,_href='%s/%s/%s' % \ 241 (linkto,tablename,r)))) 242 elif linkto and field.type[:9]=='reference': 243 row.append(TD(A(r,_href='%s/%s/%s' % \ 244 (linkto,field.type[10:],r)))) 245 else: row.append(TD(r)) 246 rows.append(TR(*row))
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0beta1 on Mon Mar 24 10:42:05 2008 | http://epydoc.sourceforge.net |